diff --git a/Gemfile b/Gemfile
index a0b26ca9..ba77ced7 100644
--- a/Gemfile
+++ b/Gemfile
@@ -10,7 +10,7 @@ gem 'simple_calendar'
# The recurrence management library
gem 'ice_cube'
-gem 'rails', '~> 5.1.4'
+gem 'rails', '>= 5.1.4'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
@@ -67,9 +67,6 @@ group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger
# console
gem 'byebug', platforms: %i[mri mingw x64_mingw]
- # Adds support for Capybara system testing and selenium driver
- gem 'capybara', '~> 2.13'
- gem 'selenium-webdriver'
end
group :development do
@@ -102,6 +99,14 @@ group :development do
gem 'guard-rails', require: false
end
+group :test do
+ # Adds support for Capybara system testing and selenium driver
+ gem 'capybara', '~> 2.13'
+ # To test objects assigned in controllers, much easier...
+ gem 'rails-controller-testing'
+ gem 'selenium-webdriver'
+end
+
group :development, :test, :assets do
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails'
diff --git a/Gemfile.lock b/Gemfile.lock
index 3bc9e9fd..6fcaeb29 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -27,13 +27,13 @@ GEM
rails-html-sanitizer (~> 1.0, >= 1.0.3)
actionview-encoded_mail_to (1.0.9)
rails
- activeadmin (1.1.0)
+ activeadmin (1.2.0)
arbre (>= 1.1.1)
coffee-rails
formtastic (~> 3.1)
formtastic_i18n
inherited_resources (~> 1.7)
- jquery-rails
+ jquery-rails (>= 4.2.0)
kaminari (>= 0.15, < 2.0)
railties (>= 4.2, < 5.2)
ransack (~> 1.3)
@@ -63,14 +63,14 @@ GEM
ast (2.3.0)
bcrypt (3.1.11)
bindex (0.5.0)
- brakeman (4.0.1)
+ brakeman (4.1.1)
buftok (0.2.0)
builder (3.2.3)
bundler-audit (0.6.0)
bundler (~> 1.2)
thor (~> 0.18)
byebug (9.1.0)
- capybara (2.15.4)
+ capybara (2.16.1)
addressable
mini_mime (>= 0.1.3)
nokogiri (>= 1.3.3)
@@ -88,15 +88,15 @@ GEM
execjs
coffee-script-source (1.12.2)
concurrent-ruby (1.0.5)
- crass (1.0.2)
- devise (4.3.0)
+ crass (1.0.3)
+ devise (4.4.0)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0, < 5.2)
responders
warden (~> 1.2.3)
- devise-i18n (1.4.0)
- devise (>= 3.1)
+ devise-i18n (1.5.0)
+ devise (>= 3.4)
differ (0.1.2)
domain_name (0.5.20170404)
unf (>= 0.0.5, < 1.0.0)
@@ -119,7 +119,7 @@ GEM
formtastic (3.1.5)
actionpack (>= 3.2.13)
formtastic_i18n (0.6.0)
- geocoder (1.4.4)
+ geocoder (1.4.5)
globalid (0.4.1)
activesupport (>= 4.2.0)
guard (2.14.1)
@@ -193,13 +193,13 @@ GEM
http_parser.rb (0.6.0)
i18n (0.9.1)
concurrent-ruby (~> 1.0)
- i18n-active_record (0.2.0)
+ i18n-active_record (0.2.2)
i18n (>= 0.5.0)
ice_cube (0.16.2)
- inherited_resources (1.7.2)
- actionpack (>= 3.2, < 5.2.x)
+ inherited_resources (1.8.0)
+ actionpack (>= 4.2, <= 5.2)
has_scope (~> 0.6)
- railties (>= 3.2, < 5.2.x)
+ railties (>= 4.2, <= 5.2)
responders
jbuilder (2.7.0)
activesupport (>= 4.2.0)
@@ -223,7 +223,7 @@ GEM
activerecord
kaminari-core (= 1.1.1)
kaminari-core (1.1.1)
- kramdown (1.15.0)
+ kramdown (1.16.2)
libv8 (3.16.14.19)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
@@ -237,7 +237,7 @@ GEM
mini_mime (>= 0.1.1)
memoizable (0.4.2)
thread_safe (~> 0.3, >= 0.3.1)
- meta-tags (2.6.0)
+ meta-tags (2.7.0)
actionpack (>= 3.2.0, < 5.3)
method_source (0.9.0)
mini_mime (1.0.0)
@@ -245,37 +245,37 @@ GEM
modernizr-rails (2.7.1)
multi_json (1.12.2)
multipart-post (2.0.0)
- mysql2 (0.4.9)
+ mysql2 (0.4.10)
naught (1.1.0)
nenv (0.3.0)
- nio4r (2.1.0)
+ nio4r (2.2.0)
nokogiri (1.8.1)
notiffany (0.1.1)
nenv (~> 0.1)
shellany (~> 0.0)
orm_adapter (0.5.0)
- paper_trail (8.0.1)
+ paper_trail (8.1.2)
activerecord (>= 4.2, < 5.2)
request_store (~> 1.1)
- parallel (1.12.0)
- parser (2.4.0.0)
- ast (~> 2.2)
+ parallel (1.12.1)
+ parser (2.4.0.2)
+ ast (~> 2.3)
piwik_analytics (1.0.2)
actionpack
activesupport
rails (>= 3.0.0)
- polyamorous (1.3.1)
+ polyamorous (1.3.2)
activerecord (>= 3.0)
powerpack (0.1.1)
- pry (0.11.2)
+ pry (0.11.3)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
public_suffix (3.0.1)
- puma (3.10.0)
+ puma (3.11.0)
rack (2.0.3)
rack-livereload (0.3.16)
rack
- rack-test (0.7.0)
+ rack-test (0.8.2)
rack (>= 1.0, < 3)
rails (5.1.4)
actioncable (= 5.1.4)
@@ -293,6 +293,10 @@ GEM
rails-assets-leaflet (1.2.0)
rails-assets-leaflet.markercluster (1.2.0)
rails-assets-leaflet (>= 1.0.3)
+ rails-controller-testing (1.0.2)
+ actionpack (~> 5.x, >= 5.0.1)
+ actionview (~> 5.x, >= 5.0.1)
+ activesupport (~> 5.x)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
@@ -307,9 +311,8 @@ GEM
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
- rainbow (2.2.2)
- rake
- rake (12.2.1)
+ rainbow (3.0.0)
+ rake (12.3.0)
ransack (1.8.4)
actionpack (>= 3.0)
activerecord (>= 3.0)
@@ -325,11 +328,11 @@ GEM
responders (2.4.0)
actionpack (>= 4.2.0, < 5.3)
railties (>= 4.2.0, < 5.3)
- rubocop (0.51.0)
+ rubocop (0.52.1)
parallel (~> 1.10)
- parser (>= 2.3.3.1, < 3.0)
+ parser (>= 2.4.0.2, < 3.0)
powerpack (~> 0.1)
- rainbow (>= 2.2.2, < 3.0)
+ rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
unicode-display_width (~> 1.0, >= 1.0.1)
ruby-progressbar (1.9.0)
@@ -337,12 +340,12 @@ GEM
ruby_parser (3.10.1)
sexp_processor (~> 4.9)
rubyzip (1.2.1)
- sass (3.5.3)
+ sass (3.5.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
- sass-rails (5.0.6)
+ sass-rails (5.0.7)
railties (>= 4.0.0, < 6)
sass (~> 3.1)
sprockets (>= 2.8, < 4.0)
@@ -351,7 +354,7 @@ GEM
sdoc (0.4.2)
json (~> 1.7, >= 1.7.7)
rdoc (~> 4.0)
- selenium-webdriver (3.7.0)
+ selenium-webdriver (3.8.0)
childprocess (~> 0.5)
rubyzip (~> 1.0)
sexp_processor (4.10.0)
@@ -384,7 +387,7 @@ GEM
thor (0.20.0)
thread_safe (0.3.6)
tilt (2.0.8)
- tinymce-rails (4.7.1)
+ tinymce-rails (4.7.4)
railties (>= 3.1.1)
tinymce-rails-langs (4.20160310)
tinymce-rails (~> 4.1, >= 4.1.10)
@@ -404,7 +407,7 @@ GEM
simple_oauth (~> 0.3.0)
tzinfo (1.2.4)
thread_safe (~> 0.1)
- uglifier (3.2.0)
+ uglifier (4.1.2)
execjs (>= 0.3.0, < 3)
unf (0.1.4)
unf_ext
@@ -419,7 +422,7 @@ GEM
railties (>= 5.0)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
- websocket-extensions (0.1.2)
+ websocket-extensions (0.1.3)
xpath (2.1.0)
nokogiri (~> 1.3)
@@ -467,10 +470,11 @@ DEPENDENCIES
piwik_analytics
puma (~> 3.7)
rack-livereload
- rails (~> 5.1.4)
+ rails (>= 5.1.4)
rails-assets-jquery-sparkline!
rails-assets-leaflet!
rails-assets-leaflet.markercluster!
+ rails-controller-testing
rails-i18n
sass-rails
sdoc
diff --git a/app/assets/javascripts/tinymce.coffee.erb b/app/assets/javascripts/setup_tinymce.coffee.erb
similarity index 100%
rename from app/assets/javascripts/tinymce.coffee.erb
rename to app/assets/javascripts/setup_tinymce.coffee.erb
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 76dfaedb..c9bf4b1c 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -1,6 +1,6 @@
# The top level controller, where can be centralised almost everything
class ApplicationController < ActionController::Base
- before_action :set_paper_trail_whodunnit, :set_locale, :set_filters
+ before_action :set_paper_trail_whodunnit, :set_filters
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery prepend: true, with: :exception
diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb
index d33f01d6..a48c2ee4 100644
--- a/app/controllers/events_controller.rb
+++ b/app/controllers/events_controller.rb
@@ -58,6 +58,8 @@ class EventsController < ApplicationController
render action: :edit
end
+ def edit; end
+
# PATCH/PUT /events/1
# PATCH/PUT /events/1.json
def update
diff --git a/app/controllers/moderations_controller.rb b/app/controllers/moderations_controller.rb
index 9474dd73..ef5c27b8 100644
--- a/app/controllers/moderations_controller.rb
+++ b/app/controllers/moderations_controller.rb
@@ -45,8 +45,8 @@ class ModerationsController < ApplicationController
end
end
- # DELETE /events/1
- # DELETE /events/1.json
+ # DELETE /moderations/1
+ # DELETE /moderations/1.json
def destroy
if @moderation.reason == 'r_0'
@moderation.paper_trail.without_versioning :destroy
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 9f51e6d1..263a37f5 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -30,6 +30,10 @@ class UsersController < ApplicationController
end
end
+ def show; end
+
+ def edit; end
+
# PATCH/PUT /users/1
# PATCH/PUT /users/1.json
def update
diff --git a/app/models/event.rb b/app/models/event.rb
index db30d3cd..041dfc98 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -18,7 +18,7 @@ class Event < ApplicationRecord
validates :title, presence: true
validate :end_after_start
RULES = %w[daily weekly monthly monthly_day].freeze
- validates :rule, inclusion: RULES
+ validates :rule, inclusion: RULES, allow_nil: true
validates :description, presence: true
validates :city, presence: true
validates :region, presence: true
diff --git a/app/models/event_callbacks.rb b/app/models/event_callbacks.rb
index 6882f7e4..9f7e24e8 100644
--- a/app/models/event_callbacks.rb
+++ b/app/models/event_callbacks.rb
@@ -22,7 +22,7 @@ class EventCallbacks
def self.after_update(event)
return unless ActionMailer::Base.default_url_options[:host]
- if event.moderated_changed? && event.moderated?
+ if event.saved_change_to_moderated? && event.moderated?
tweet event
# Send an acceptation mail to its author
diff --git a/app/models/note.rb b/app/models/note.rb
index 2826245e..971c9fb5 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -1,12 +1,12 @@
# Manages data related to events' moderation
class Note < ApplicationRecord
belongs_to :event
- belongs_to :author, class_name: 'User'
+ belongs_to :author, class_name: 'User', inverse_of: false
validates :contents, presence: true
# Setup the magic time stamp so it uses the "date" column
- def timestamp_attributes_for_create
- super << :date
+ def self.timestamp_attributes_for_create
+ super << 'date'
end
end
diff --git a/app/models/orga.rb b/app/models/orga.rb
index 1328e3e3..3e3b7250 100644
--- a/app/models/orga.rb
+++ b/app/models/orga.rb
@@ -18,7 +18,7 @@ class Orga < ApplicationRecord
validates :submitter, allow_blank: true, email: true
geocoded_by :full_address
- # after_validation :geocode, if: -> (obj) { obj.address_changed? }
+ # after_validation :geocode, if: -> (obj) { obj.saved_change_to_address? }
after_validation :geocode
scope :active, -> { where active: true }
@@ -55,9 +55,9 @@ class Orga < ApplicationRecord
end
after_update do
- send_secret if secret_changed? || submitter_changed?
+ send_secret if saved_change_to_secret? || saved_change_to_submitter?
- if moderated_changed?
+ if saved_change_to_moderated?
OrgaMailer.accept(self).deliver_now!
# Send email to moderators when an orga is accepted
ModerationorgaMailer.accept(self).deliver_now!
diff --git a/app/views/events/show.html.haml b/app/views/events/show.html.haml
index 667f5fef..d704404d 100644
--- a/app/views/events/show.html.haml
+++ b/app/views/events/show.html.haml
@@ -91,8 +91,8 @@
%h3= t '.description'
.description
= description sanitize @event.description,
- tags: %w(p h1 h2 h3 h4 br table tr th td ul ol li a strong b em i img sub sup span),
- attributes: %w(href src width height style title)
+ tags: %w[p h1 h2 h3 h4 br table tr th td ul ol li a strong b em i img sub sup span],
+ attributes: %w[href src width height style title]
%h3
%em.fa.fa-info-circle
@@ -101,7 +101,7 @@
%p
%em.fa.fa-external-link
%span.label= Event.human_attribute_name :url
- = link_to @event.url, @event.url
+ = link_to @event.url, sanitize(@event.url)
%p
%em.fa.fa-envelope
%span.label= Event.human_attribute_name :contact
diff --git a/app/views/orgas/show.html.haml b/app/views/orgas/show.html.haml
index 9e9a5263..c0610412 100644
--- a/app/views/orgas/show.html.haml
+++ b/app/views/orgas/show.html.haml
@@ -75,8 +75,8 @@
%h3= t '.description'
.description
= description sanitize @orga.description,
- tags: %w(p h1 h2 h3 h4 br table tr th td ul ol li a strong b em i img sub sup span),
- attributes: %w(href src width height style title)
+ tags: %w[p h1 h2 h3 h4 br table tr th td ul ol li a strong b em i img sub sup span],
+ attributes: %w[href src width height style title]
%dl
- if @orga.department.present?
@@ -88,7 +88,7 @@
%dt
%em.fa.fa-external-link
= Orga.human_attribute_name :url
- %dd= link_to @orga.url, @orga.url
+ %dd= link_to @orga.url, sanitize(@orga.url)
- if @orga.diaspora.present?
%dt
%em.fa.fa-bullhorn
diff --git a/bin/setup b/bin/setup
index ca842c11..21907e89 100755
--- a/bin/setup
+++ b/bin/setup
@@ -1,7 +1,6 @@
#!/usr/bin/env ruby
require 'pathname'
require 'fileutils'
-include FileUtils
# path to your application root.
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
@@ -10,7 +9,7 @@ def system!(*args)
system(*args) || abort("\n== Command #{args} failed ==")
end
-chdir APP_ROOT do
+Dir.chdir APP_ROOT do
# This script is a starting point to setup your application.
# Add necessary setup steps to this file.
diff --git a/bin/update b/bin/update
index a8e4462f..801926bd 100755
--- a/bin/update
+++ b/bin/update
@@ -1,7 +1,6 @@
#!/usr/bin/env ruby
require 'pathname'
require 'fileutils'
-include FileUtils
# path to your application root.
APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
@@ -10,7 +9,7 @@ def system!(*args)
system(*args) || abort("\n== Command #{args} failed ==")
end
-chdir APP_ROOT do
+Dir.chdir APP_ROOT do
# This script is a way to update your development environment automatically.
# Add necessary update steps to this file.
diff --git a/db/migrate/20131114103118_devise_create_admin_users.rb b/db/migrate/20131114103118_devise_create_admin_users.rb
index 94922efb..1d8651dd 100644
--- a/db/migrate/20131114103118_devise_create_admin_users.rb
+++ b/db/migrate/20131114103118_devise_create_admin_users.rb
@@ -49,4 +49,5 @@ class DeviseCreateAdminUsers < ActiveRecord::Migration
# add_index :admin_users, :confirmation_token, :unique => true
# add_index :admin_users, :unlock_token, :unique => true
end
+ # rubocop:enable Metrics/MethodLength
end
diff --git a/db/migrate/20131114103121_create_active_admin_comments.rb b/db/migrate/20131114103121_create_active_admin_comments.rb
index e040f8bc..0f9797f3 100644
--- a/db/migrate/20131114103121_create_active_admin_comments.rb
+++ b/db/migrate/20131114103121_create_active_admin_comments.rb
@@ -14,6 +14,7 @@ class CreateActiveAdminComments < ActiveRecord::Migration
add_index :active_admin_comments, %i[author_type author_id]
add_index :active_admin_comments, %i[resource_type resource_id]
end
+ # rubocop:enable Metrics/MethodLength
def self.down
drop_table :active_admin_comments
diff --git a/db/migrate/20140403204748_create_translation.rb b/db/migrate/20140403204748_create_translation.rb
index 820b9dcb..32b62d84 100644
--- a/db/migrate/20140403204748_create_translation.rb
+++ b/db/migrate/20140403204748_create_translation.rb
@@ -1,6 +1,7 @@
-# Add a translations table, to mange many texts from the database
+# Add a translations table, to manage many texts from the database
class CreateTranslation < ActiveRecord::Migration
def change
+ # rubocop:disable Rails/CreateTableWithTimestamps
create_table :translations do |t|
t.string :locale
t.string :key
@@ -8,5 +9,6 @@ class CreateTranslation < ActiveRecord::Migration
t.text :interpolations
t.boolean :is_proc, default: false
end
+ # rubocop:enable Rails/CreateTableWithTimestamps
end
end
diff --git a/db/migrate/20161210105328_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb b/db/migrate/20161210105328_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb
index 069b01ca..efa0f0a2 100644
--- a/db/migrate/20161210105328_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb
+++ b/db/migrate/20161210105328_acts_as_taggable_on_migration.acts_as_taggable_on_engine.rb
@@ -21,9 +21,11 @@ class ActsAsTaggableOnMigration < ActiveRecord::Migration
end
def self.up
+ # rubocop:disable Rails/CreateTableWithTimestamps
create_table :tags do |t|
t.string :name
end
+ # rubocop:enable Rails/CreateTableWithTimestamps
taggings
end
diff --git a/db/seeds.rb b/db/seeds.rb
index a159ebab..5deaedf9 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -23,6 +23,7 @@ Kind.create name: 'provider', icon: 'tty'
Kind.create name: 'institution', icon: 'institution'
# rubocop:disable Metrics/LineLength
+# rubocop:disable Layout/EmptyLinesAroundArguments
I18n::Backend::ActiveRecord::Translation.create(
[
{ locale: 'fr', key: 'mail_suffix', value: '[AdL] ' },
@@ -410,3 +411,5 @@ Ces recommandations de modération sont à discuter et à améliorer au fur et
" }
]
)
+# rubocop:enable Metrics/LineLength
+# rubocop:enable Layout/EmptyLinesAroundArguments
diff --git a/public/assets/.sprockets-manifest-d66893f1fe62a081525d8463c9642047.json b/public/assets/.sprockets-manifest-d66893f1fe62a081525d8463c9642047.json
index 3be4cbf4..40c20a8c 100644
--- a/public/assets/.sprockets-manifest-d66893f1fe62a081525d8463c9642047.json
+++ b/public/assets/.sprockets-manifest-d66893f1fe62a081525d8463c9642047.json
@@ -1 +1 @@
-{"files":{"active_admin-d4f38d29ff0b2b9b05ed4ecbcebd736e750ad4b29369bc58d35194f7e107eaae.css":{"logical_path":"active_admin.css","mtime":"2017-07-27T21:15:41+02:00","size":80636,"digest":"d4f38d29ff0b2b9b05ed4ecbcebd736e750ad4b29369bc58d35194f7e107eaae","integrity":"sha256-1PONKf8LK5sF7U7Lzr1zbnUK1LKTabxY01GU9+EH6q4="},"active_admin/nested_menu_arrow-15084d93c65c1964d7077700ea748bd2d70cfa2d4c19707c58a9c64e232dd442.gif":{"logical_path":"active_admin/nested_menu_arrow.gif","mtime":"2017-07-27T21:15:41+02:00","size":70,"digest":"15084d93c65c1964d7077700ea748bd2d70cfa2d4c19707c58a9c64e232dd442","integrity":"sha256-FQhNk8ZcGWTXB3cA6nSL0tcM+i1MGXB8WKnGTiMt1EI="},"active_admin/nested_menu_arrow_dark-7c43b8e0a5f8823875f49a093c9d7a6b374f885b6f9cc248ae9cd7e6e9b29034.gif":{"logical_path":"active_admin/nested_menu_arrow_dark.gif","mtime":"2017-07-27T21:15:41+02:00","size":70,"digest":"7c43b8e0a5f8823875f49a093c9d7a6b374f885b6f9cc248ae9cd7e6e9b29034","integrity":"sha256-fEO44KX4gjh19JoJPJ16azdPiFtvnMJIrpzX5umykDQ="},"active_admin/orderable-29374dbb55b0012d78a37c614d573bb3474f0779849b478a147d0f1845ca6617.png":{"logical_path":"active_admin/orderable.png","mtime":"2017-07-27T21:15:41+02:00","size":220,"digest":"29374dbb55b0012d78a37c614d573bb3474f0779849b478a147d0f1845ca6617","integrity":"sha256-KTdNu1WwAS14o3xhTVc7s0dPB3mEm0eKFH0PGEXKZhc="},"active_admin/print-cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6.css":{"logical_path":"active_admin/print.css","mtime":"2017-07-27T21:15:41+02:00","size":7086,"digest":"cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6","integrity":"sha256-z5nL8n+5IGWp6s0o5vrUj6csra9uCRh5Do01sR2PmfY="},"active_admin-115a9ff718613239e12adb1f3bf498a1ccba1735051b69a5d1fbee5e495ff489.js":{"logical_path":"active_admin.js","mtime":"2017-10-07T18:51:24+02:00","size":961412,"digest":"115a9ff718613239e12adb1f3bf498a1ccba1735051b69a5d1fbee5e495ff489","integrity":"sha256-EVqf9xhhMjnhKtsfO/SYocy6FzUFG2ml0fvuXklf9Ik="},"tinymce-d01e33fd7bee04ec85526d769634c548ffc9d13584e1e3ecb754f48c8a3a0662.js":{"logical_path":"tinymce.js","mtime":"2017-10-07T18:51:24+02:00","size":1055,"digest":"d01e33fd7bee04ec85526d769634c548ffc9d13584e1e3ecb754f48c8a3a0662","integrity":"sha256-0B4z/XvuBOyFUm12ljTFSP/J0TWE4ePst1T0jIo6BmI="},"application-ba1c3eda80784b6eec3860ce601adf04370c8c8b17855bd3438a42dc8a69cfa2.css":{"logical_path":"application.css","mtime":"2017-10-07T18:51:24+02:00","size":229915,"digest":"ba1c3eda80784b6eec3860ce601adf04370c8c8b17855bd3438a42dc8a69cfa2","integrity":"sha256-uhw+2oB4S27sOGDOYBrfBDcMjIsXhVvTQ4pC3Ippz6I="},"jquery-ui/ui-icons_444444_256x240-31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d.png":{"logical_path":"jquery-ui/ui-icons_444444_256x240.png","mtime":"2017-04-24T19:17:54+02:00","size":3756,"digest":"31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d","integrity":"sha256-MdmIdltOb1ZVPClYjFADgdw+bwqimAyCEiAuVkSu/V0="},"jquery-ui/ui-icons_555555_256x240-32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5.png":{"logical_path":"jquery-ui/ui-icons_555555_256x240.png","mtime":"2017-04-24T19:17:54+02:00","size":3756,"digest":"32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5","integrity":"sha256-MhdSYdrudsgrsO3w7qFqVkIYZvvDHpTzwdVwqhFFAvU="},"jquery-ui/ui-icons_ffffff_256x240-350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a.png":{"logical_path":"jquery-ui/ui-icons_ffffff_256x240.png","mtime":"2017-04-24T19:17:54+02:00","size":3756,"digest":"350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a","integrity":"sha256-NQ3xtxMQN94g6DxcDzpBp3DSrEi1di6ncrP0qKe51Ho="},"jquery-ui/ui-icons_777620_256x240-0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b.png":{"logical_path":"jquery-ui/ui-icons_777620_256x240.png","mtime":"2017-04-24T19:17:54+02:00","size":3756,"digest":"0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b","integrity":"sha256-CwIPxuaW2I0pbnux9h8esq2CeEjixzgqTD4JmecC3Zs="},"jquery-ui/ui-icons_cc0000_256x240-40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69.png":{"logical_path":"jquery-ui/ui-icons_cc0000_256x240.png","mtime":"2017-04-24T19:17:54+02:00","size":3756,"digest":"40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69","integrity":"sha256-QJhaZLTV3SE/uif82GKhvRszepdnT2/wuewgq87kvGk="},"jquery-ui/ui-icons_777777_256x240-faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f.png":{"logical_path":"jquery-ui/ui-icons_777777_256x240.png","mtime":"2017-04-24T19:17:54+02:00","size":3756,"digest":"faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f","integrity":"sha256-+vMgB64SDDAiE1V2JuZg3RDnEcXdTxET018m3AW3jS8="},"flags/4x3/ad-3fc30cc000942b4f3369bdf6ccb85b16f59f4e78f9c53d73252ab529da35ba0a.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2017-08-18T23:12:22+02:00","size":56452,"digest":"3fc30cc000942b4f3369bdf6ccb85b16f59f4e78f9c53d73252ab529da35ba0a","integrity":"sha256-P8MMwACUK08zab32zLhbFvWfTnj5xT1zJSq1Kdo1ugo="},"flags/1x1/ad-db2c38d603b8eecc9085d6ac1261bbefd3bcd852d44bec476e5e115914bcb2fd.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2017-08-18T23:12:22+02:00","size":55630,"digest":"db2c38d603b8eecc9085d6ac1261bbefd3bcd852d44bec476e5e115914bcb2fd","integrity":"sha256-2yw41gO47syQhdasEmG779O82FLUS+xHbl4RWRS8sv0="},"flags/4x3/ae-7f41692ef179841ca6e9cae42c704113274707228ff3d2b1ee5169916db15b1e.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2017-08-18T23:12:22+02:00","size":257,"digest":"7f41692ef179841ca6e9cae42c704113274707228ff3d2b1ee5169916db15b1e","integrity":"sha256-f0FpLvF5hBym6crkLHBBEydHByKP89Kx7lFpkW2xWx4="},"flags/1x1/ae-8c9b9b1f108511722e1f1b0f9a029edf808ff285406545f24e327052e0efa780.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2017-08-18T23:12:22+02:00","size":273,"digest":"8c9b9b1f108511722e1f1b0f9a029edf808ff285406545f24e327052e0efa780","integrity":"sha256-jJubHxCFEXIuHxsPmgKe34CP8oVAZUXyTjJwUuDvp4A="},"flags/4x3/af-e271fd8f2fcdd0adda22a0e699173ff4e4cc65adfe7f05652cb77375eea99a93.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2017-08-18T23:12:22+02:00","size":97407,"digest":"e271fd8f2fcdd0adda22a0e699173ff4e4cc65adfe7f05652cb77375eea99a93","integrity":"sha256-4nH9jy/N0K3aIqDmmRc/9OTMZa3+fwVlLLdzde6pmpM="},"flags/1x1/af-2629bc2e10edd54c384650f9aab1c6dfaf7101fda43ba3af627f0ec226db5892.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2017-08-18T23:12:22+02:00","size":90925,"digest":"2629bc2e10edd54c384650f9aab1c6dfaf7101fda43ba3af627f0ec226db5892","integrity":"sha256-Jim8LhDt1Uw4RlD5qrHG369xAf2kO6OvYn8OwibbWJI="},"flags/4x3/ag-91fee45d7e1bab658f840a721364dd6eff0b67f9135dc8445a1b3554c347c2e9.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2017-08-18T23:12:22+02:00","size":902,"digest":"91fee45d7e1bab658f840a721364dd6eff0b67f9135dc8445a1b3554c347c2e9","integrity":"sha256-kf7kXX4bq2WPhApyE2Tdbv8LZ/kTXchEWhs1VMNHwuk="},"flags/1x1/ag-476bf833d4e0789f71d7b0d24164734ed97627f36edd09cc75991bcfbb2aa7af.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2017-08-18T23:12:22+02:00","size":862,"digest":"476bf833d4e0789f71d7b0d24164734ed97627f36edd09cc75991bcfbb2aa7af","integrity":"sha256-R2v4M9TgeJ9x17DSQWRzTtl2J/Nu3QnMdZkbz7sqp68="},"flags/4x3/ai-0106851bba5120a0f2bca5e6187ea65c9846e696f5ca57631aa89371cdf98871.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2017-08-18T23:12:22+02:00","size":55336,"digest":"0106851bba5120a0f2bca5e6187ea65c9846e696f5ca57631aa89371cdf98871","integrity":"sha256-AQaFG7pRIKDyvKXmGH6mXJhG5pb1yldjGqiTcc35iHE="},"flags/1x1/ai-50a3279d492c2932919c02880b69da7bb7948ce96988d8ccc9b16357f006165c.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2017-08-18T23:12:22+02:00","size":58220,"digest":"50a3279d492c2932919c02880b69da7bb7948ce96988d8ccc9b16357f006165c","integrity":"sha256-UKMnnUksKTKRnAKIC2nae7eUjOlpiNjMybFjV/AGFlw="},"flags/4x3/al-f8bc9837446a4880d29088f18bfc014b4cde95d8edda1241be22b5724a74ea8d.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2017-08-18T23:12:22+02:00","size":4647,"digest":"f8bc9837446a4880d29088f18bfc014b4cde95d8edda1241be22b5724a74ea8d","integrity":"sha256-+LyYN0RqSIDSkIjxi/wBS0zeldjt2hJBviK1ckp06o0="},"flags/1x1/al-fb2c4d723ddbfb2c659ee2b3052d33347c130fb1024e2cb0ddd17f25b082542c.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2017-08-18T23:12:22+02:00","size":4908,"digest":"fb2c4d723ddbfb2c659ee2b3052d33347c130fb1024e2cb0ddd17f25b082542c","integrity":"sha256-+yxNcj3b+yxlnuKzBS0zNHwTD7ECTiyw3dF/JbCCVCw="},"flags/4x3/am-aeabb81fbe6ac768ba7b95bb22e5a1791eb35ff83d0b5d6785c88ddc6835444e.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2017-08-18T23:12:22+02:00","size":226,"digest":"aeabb81fbe6ac768ba7b95bb22e5a1791eb35ff83d0b5d6785c88ddc6835444e","integrity":"sha256-rqu4H75qx2i6e5W7IuWheR6zX/g9C11nhciN3Gg1RE4="},"flags/1x1/am-6fc2c9fb24a6a079960d619cc1fdaeee31cdb52d27c75bb9b065d9664d853c11.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2017-08-18T23:12:22+02:00","size":242,"digest":"6fc2c9fb24a6a079960d619cc1fdaeee31cdb52d27c75bb9b065d9664d853c11","integrity":"sha256-b8LJ+ySmoHmWDWGcwf2u7jHNtS0nx1u5sGXZZk2FPBE="},"flags/4x3/ao-34ea70b51c9069ef1a859935f07a64cfffab4e08438a9c746898da56b495d127.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2017-08-18T23:12:22+02:00","size":2245,"digest":"34ea70b51c9069ef1a859935f07a64cfffab4e08438a9c746898da56b495d127","integrity":"sha256-NOpwtRyQae8ahZk18Hpkz/+rTghDipx0aJjaVrSV0Sc="},"flags/1x1/ao-1240d65f5dd9d8945701ed46611bd97f53f2cecf15b435cc54604eb79f4b97a8.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2017-08-18T23:12:22+02:00","size":2251,"digest":"1240d65f5dd9d8945701ed46611bd97f53f2cecf15b435cc54604eb79f4b97a8","integrity":"sha256-EkDWX13Z2JRXAe1GYRvZf1Pyzs8VtDXMVGBOt59Ll6g="},"flags/4x3/aq-6e2cee0eae620cd3f1fe6be665fd216f9a54a2afe215441005904dfeca24c169.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2017-08-18T23:12:22+02:00","size":4488,"digest":"6e2cee0eae620cd3f1fe6be665fd216f9a54a2afe215441005904dfeca24c169","integrity":"sha256-bizuDq5iDNPx/mvmZf0hb5pUoq/iFUQQBZBN/sokwWk="},"flags/1x1/aq-73c87173b09f476af2367895c76cf65d159c0a0b2ec292c1f1f5b08b2e78f829.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2017-08-18T23:12:22+02:00","size":4611,"digest":"73c87173b09f476af2367895c76cf65d159c0a0b2ec292c1f1f5b08b2e78f829","integrity":"sha256-c8hxc7CfR2ryNniVx2z2XRWcCgsuwpLB8fWwiy54+Ck="},"flags/4x3/ar-71eca3c44a303392f2c8db443add184c4c79d9fa8a3e729be2528c8db53790b6.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2017-08-18T23:12:22+02:00","size":34347,"digest":"71eca3c44a303392f2c8db443add184c4c79d9fa8a3e729be2528c8db53790b6","integrity":"sha256-ceyjxEowM5LyyNtEOt0YTEx52fqKPnKb4lKMjbU3kLY="},"flags/1x1/ar-0f75960e9ea2b2533e9112d4fc02154182f72460720c5a7d4dc21ef47758c369.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2017-08-18T23:12:22+02:00","size":34266,"digest":"0f75960e9ea2b2533e9112d4fc02154182f72460720c5a7d4dc21ef47758c369","integrity":"sha256-D3WWDp6islM+kRLU/AIVQYL3JGByDFp9TcIe9HdYw2k="},"flags/4x3/as-29ac7248b1c428a68d0e2b1cfca4fade7b0fcb38151bf980d35c3b0be63d3d91.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2017-08-18T23:12:22+02:00","size":11465,"digest":"29ac7248b1c428a68d0e2b1cfca4fade7b0fcb38151bf980d35c3b0be63d3d91","integrity":"sha256-KaxySLHEKKaNDisc/KT63nsPyzgVG/mA01w7C+Y9PZE="},"flags/1x1/as-f516550a6b6cf7e277a1877cad9afe10f694ac32c92df7709690913fd59ecf20.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2017-08-18T23:12:22+02:00","size":11530,"digest":"f516550a6b6cf7e277a1877cad9afe10f694ac32c92df7709690913fd59ecf20","integrity":"sha256-9RZVCmts9+J3oYd8rZr+EPaUrDLJLfdwlpCRP9WezyA="},"flags/4x3/at-e6517cfc6605c0ffa13da8db795d6e4cd353f72434f8fe38a2ebab7ba685081b.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2017-08-18T23:12:22+02:00","size":263,"digest":"e6517cfc6605c0ffa13da8db795d6e4cd353f72434f8fe38a2ebab7ba685081b","integrity":"sha256-5lF8/GYFwP+hPajbeV1uTNNT9yQ0+P44ouure6aFCBs="},"flags/1x1/at-b9f9e8349460db6d35662b445a8a5fff96fccd904fff3411b711d31b2d7b7f16.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2017-08-18T23:12:22+02:00","size":259,"digest":"b9f9e8349460db6d35662b445a8a5fff96fccd904fff3411b711d31b2d7b7f16","integrity":"sha256-ufnoNJRg2201ZitEWopf/5b8zZBP/zQRtxHTGy17fxY="},"flags/4x3/au-c929c02559051c3f51c0d93dd9df0d886b6c1efa083c0f101d2b3fd39706726e.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2017-08-18T23:12:22+02:00","size":1773,"digest":"c929c02559051c3f51c0d93dd9df0d886b6c1efa083c0f101d2b3fd39706726e","integrity":"sha256-ySnAJVkFHD9RwNk92d8NiGtsHvoIPA8QHSs/05cGcm4="},"flags/1x1/au-96828c63a52eff55282096c045a3822cde99a00bf20528810d31f27b27208593.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2017-08-18T23:12:22+02:00","size":1746,"digest":"96828c63a52eff55282096c045a3822cde99a00bf20528810d31f27b27208593","integrity":"sha256-loKMY6Uu/1UoIJbARaOCLN6ZoAvyBSiBDTHyeycghZM="},"flags/4x3/aw-44597b0ede9ff7df0e659c464a51fdbc1a7f5cc5cd621d281302843c23a905bf.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2017-08-18T23:12:22+02:00","size":14674,"digest":"44597b0ede9ff7df0e659c464a51fdbc1a7f5cc5cd621d281302843c23a905bf","integrity":"sha256-RFl7Dt6f998OZZxGSlH9vBp/XMXNYh0oEwKEPCOpBb8="},"flags/1x1/aw-2bd4b1890e233baeae0bcaaf1841803de35dd9c422f486588e48bf3506d69ae0.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2017-08-18T23:12:22+02:00","size":14194,"digest":"2bd4b1890e233baeae0bcaaf1841803de35dd9c422f486588e48bf3506d69ae0","integrity":"sha256-K9SxiQ4jO66uC8qvGEGAPeNd2cQi9IZYjki/NQbWmuA="},"flags/4x3/ax-95093e740b0b492f7cd96fe370fa2478f0d0148b89b424cd8436807234ade9dd.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2017-08-18T23:12:22+02:00","size":563,"digest":"95093e740b0b492f7cd96fe370fa2478f0d0148b89b424cd8436807234ade9dd","integrity":"sha256-lQk+dAsLSS982W/jcPokePDQFIuJtCTNhDaAcjSt6d0="},"flags/1x1/ax-99af962543005067e7239903eb6bc23226d30ce14a7c6408693dc9641193ddc3.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2017-08-18T23:12:22+02:00","size":549,"digest":"99af962543005067e7239903eb6bc23226d30ce14a7c6408693dc9641193ddc3","integrity":"sha256-ma+WJUMAUGfnI5kD62vCMibTDOFKfGQIaT3JZBGT3cM="},"flags/4x3/az-c0959e214bf9a3e94993cfc03f4884b15f6d8c4dd20842a5052a29a8495fd431.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2017-08-18T23:12:22+02:00","size":567,"digest":"c0959e214bf9a3e94993cfc03f4884b15f6d8c4dd20842a5052a29a8495fd431","integrity":"sha256-wJWeIUv5o+lJk8/AP0iEsV9tjE3SCEKlBSopqElf1DE="},"flags/1x1/az-3db731c28289795dc3bda91b3bab129d994a09b8ee0959d34f21a1f840f894de.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2017-08-18T23:12:22+02:00","size":611,"digest":"3db731c28289795dc3bda91b3bab129d994a09b8ee0959d34f21a1f840f894de","integrity":"sha256-PbcxwoKJeV3DvakbO6sSnZlKCbjuCVnTTyGh+ED4lN4="},"flags/4x3/ba-388ea99507a04cc5d4768bd708d984714aeebbe4177a1cf8ffe0b8331dd856d9.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2017-08-18T23:12:22+02:00","size":1512,"digest":"388ea99507a04cc5d4768bd708d984714aeebbe4177a1cf8ffe0b8331dd856d9","integrity":"sha256-OI6plQegTMXUdovXCNmEcUruu+QXehz4/+C4Mx3YVtk="},"flags/1x1/ba-b7d7ab49229704dff0192935c9fb7fb4ea6ba989ce4fee832a738a5d78b39d71.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2017-08-18T23:12:22+02:00","size":1482,"digest":"b7d7ab49229704dff0192935c9fb7fb4ea6ba989ce4fee832a738a5d78b39d71","integrity":"sha256-t9erSSKXBN/wGSk1yft/tOprqYnOT+6DKnOKXXiznXE="},"flags/4x3/bb-6df74e1044b7f42c2c3b1082d46eb0198aa65a180459fdd950838cd2e6c00ee1.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2017-08-18T23:12:22+02:00","size":767,"digest":"6df74e1044b7f42c2c3b1082d46eb0198aa65a180459fdd950838cd2e6c00ee1","integrity":"sha256-bfdOEES39CwsOxCC1G6wGYqmWhgEWf3ZUIOM0ubADuE="},"flags/1x1/bb-eb10f33cbde25ab6ccaa49cbe3976b4f5ece2fa1d3d485394caa158f10b8b8c9.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2017-08-18T23:12:22+02:00","size":763,"digest":"eb10f33cbde25ab6ccaa49cbe3976b4f5ece2fa1d3d485394caa158f10b8b8c9","integrity":"sha256-6xDzPL3iWrbMqknL45drT17OL6HT1IU5TKoVjxC4uMk="},"flags/4x3/bd-6cc222c4343f0027697ddd9e8d48f2cf93d3f677b6460b530eabefd2410cfef3.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2017-08-18T23:12:22+02:00","size":205,"digest":"6cc222c4343f0027697ddd9e8d48f2cf93d3f677b6460b530eabefd2410cfef3","integrity":"sha256-bMIixDQ/ACdpfd2ejUjyz5PT9ne2RgtTDqvv0kEM/vM="},"flags/1x1/bd-2dc72311aca457668c8bce4f3a22c1b76320e00be50a58fb4001ea39caf6725c.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2017-08-18T23:12:22+02:00","size":209,"digest":"2dc72311aca457668c8bce4f3a22c1b76320e00be50a58fb4001ea39caf6725c","integrity":"sha256-LccjEaykV2aMi85POiLBt2Mg4AvlClj7QAHqOcr2clw="},"flags/4x3/be-2b7e73068f4f120ed0ccc3a9fbb8566c9574b206afd8373ed9050e2a971c4f99.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2017-08-18T23:12:22+02:00","size":318,"digest":"2b7e73068f4f120ed0ccc3a9fbb8566c9574b206afd8373ed9050e2a971c4f99","integrity":"sha256-K35zBo9PEg7QzMOp+7hWbJV0sgav2Dc+2QUOKpccT5k="},"flags/1x1/be-c4c9351d83a4db1f8c7c73dd6476569f0dfd82290ffd20275b7372908c2f2a7e.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2017-08-18T23:12:22+02:00","size":318,"digest":"c4c9351d83a4db1f8c7c73dd6476569f0dfd82290ffd20275b7372908c2f2a7e","integrity":"sha256-xMk1HYOk2x+MfHPdZHZWnw39gikP/SAnW3NykIwvKn4="},"flags/4x3/bf-56669967fef6bb607ea2fd26d32d922cf78f176115287e37e9cf0b8bbec677f0.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2017-08-18T23:12:22+02:00","size":447,"digest":"56669967fef6bb607ea2fd26d32d922cf78f176115287e37e9cf0b8bbec677f0","integrity":"sha256-VmaZZ/72u2B+ov0m0y2SLPePF2EVKH436c8Li77Gd/A="},"flags/1x1/bf-ffc3651e87b9ccc9374d5bc95617aad474bcaa35871c83ae91fa71eb8b46bab3.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2017-08-18T23:12:22+02:00","size":459,"digest":"ffc3651e87b9ccc9374d5bc95617aad474bcaa35871c83ae91fa71eb8b46bab3","integrity":"sha256-/8NlHoe5zMk3TVvJVheq1HS8qjWHHIOukfpx64tGurM="},"flags/4x3/bg-ad796782d048f6ddc6715f7ea915a2c86716753579735ec071a106a7f3fc13b6.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2017-08-18T23:12:22+02:00","size":305,"digest":"ad796782d048f6ddc6715f7ea915a2c86716753579735ec071a106a7f3fc13b6","integrity":"sha256-rXlngtBI9t3GcV9+qRWiyGcWdTV5c17AcaEGp/P8E7Y="},"flags/1x1/bg-962bd196cc8e4b702757e17a9002e867843c16415a47a52ecd97459278e5fa1f.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2017-08-18T23:12:22+02:00","size":309,"digest":"962bd196cc8e4b702757e17a9002e867843c16415a47a52ecd97459278e5fa1f","integrity":"sha256-livRlsyOS3AnV+F6kALoZ4Q8FkFaR6UuzZdFknjl+h8="},"flags/4x3/bh-aeff05c6dfa41e89db539312faedc41198ba2f2d9bf5ad9f22992a0a5a4151e8.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2017-08-18T23:12:22+02:00","size":622,"digest":"aeff05c6dfa41e89db539312faedc41198ba2f2d9bf5ad9f22992a0a5a4151e8","integrity":"sha256-rv8Fxt+kHonbU5MS+u3EEZi6Ly2b9a2fIpkqClpBUeg="},"flags/1x1/bh-12da0d548841b860a7aedbbc858df1278a4f56105ae643f9379f5c2a3caa294a.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2017-08-18T23:12:22+02:00","size":689,"digest":"12da0d548841b860a7aedbbc858df1278a4f56105ae643f9379f5c2a3caa294a","integrity":"sha256-EtoNVIhBuGCnrtu8hY3xJ4pPVhBa5kP5N59cKjyqKUo="},"flags/4x3/bi-7f43c6407a6f007fd70e7b43f9b34e870cc757736a9e2399c46381c8434d238f.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2017-08-18T23:12:22+02:00","size":1317,"digest":"7f43c6407a6f007fd70e7b43f9b34e870cc757736a9e2399c46381c8434d238f","integrity":"sha256-f0PGQHpvAH/XDntD+bNOhwzHV3NqniOZxGOByENNI48="},"flags/1x1/bi-454adb690bfce8243896377b9c314ef8f447ec4d85dc677860f521a6c30c896e.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2017-08-18T23:12:22+02:00","size":1248,"digest":"454adb690bfce8243896377b9c314ef8f447ec4d85dc677860f521a6c30c896e","integrity":"sha256-RUrbaQv86CQ4ljd7nDFO+PRH7E2F3Gd4YPUhpsMMiW4="},"flags/4x3/bj-85ecb891b5ebbe5802bd23d41fa44f1c1dbf047aceba991e6006e377c53fa263.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2017-08-18T23:12:22+02:00","size":503,"digest":"85ecb891b5ebbe5802bd23d41fa44f1c1dbf047aceba991e6006e377c53fa263","integrity":"sha256-hey4kbXrvlgCvSPUH6RPHB2/BHrOupkeYAbjd8U/omM="},"flags/1x1/bj-861b63ba692ecf3e1705296e51ef4f80da47a2eff5cfa29a787bcbc4fc989a53.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2017-08-18T23:12:22+02:00","size":504,"digest":"861b63ba692ecf3e1705296e51ef4f80da47a2eff5cfa29a787bcbc4fc989a53","integrity":"sha256-hhtjumkuzz4XBSluUe9PgNpHou/1z6KaeHvLxPyYmlM="},"flags/4x3/bl-2c832da5dfab278f90dcfd6265c08211802e94d9b6a5634df6dacdb750723312.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2017-08-18T23:12:22+02:00","size":327,"digest":"2c832da5dfab278f90dcfd6265c08211802e94d9b6a5634df6dacdb750723312","integrity":"sha256-LIMtpd+rJ4+Q3P1iZcCCEYAulNm2pWNN9trNt1ByMxI="},"flags/1x1/bl-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/bm-05e6a9d863d77266cc3e2a74fddea640757e09b54d3032711f0d1890b5b61d3d.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2017-08-18T23:12:22+02:00","size":32127,"digest":"05e6a9d863d77266cc3e2a74fddea640757e09b54d3032711f0d1890b5b61d3d","integrity":"sha256-Beap2GPXcmbMPip0/d6mQHV+CbVNMDJxHw0YkLW2HT0="},"flags/1x1/bm-0a16d9ab856676f9511627004ba4ee08ebe041533a33046c3f732ffb2793cf8a.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2017-08-18T23:12:22+02:00","size":31633,"digest":"0a16d9ab856676f9511627004ba4ee08ebe041533a33046c3f732ffb2793cf8a","integrity":"sha256-ChbZq4VmdvlRFicAS6TuCOvgQVM6MwRsP3Mv+yeTz4o="},"flags/4x3/bn-1560949666220d88ee037b03ce1ac0b95c1b91667f05cf2b8b06a043efb01253.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2017-08-18T23:12:22+02:00","size":21816,"digest":"1560949666220d88ee037b03ce1ac0b95c1b91667f05cf2b8b06a043efb01253","integrity":"sha256-FWCUlmYiDYjuA3sDzhrAuVwbkWZ/Bc8riwagQ++wElM="},"flags/1x1/bn-387ebb4b9e1b3796c94edd61402851eafb8b185d7061671b832c1879db69d6eb.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2017-08-18T23:12:22+02:00","size":22121,"digest":"387ebb4b9e1b3796c94edd61402851eafb8b185d7061671b832c1879db69d6eb","integrity":"sha256-OH67S54bN5bJTt1hQChR6vuLGF1wYWcbgywYedtp1us="},"flags/4x3/bo-96c7f8e64029f530108baee22d8a07cad2787f41eeed0b647f800bb533c39c63.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2017-08-18T23:12:22+02:00","size":212103,"digest":"96c7f8e64029f530108baee22d8a07cad2787f41eeed0b647f800bb533c39c63","integrity":"sha256-lsf45kAp9TAQi67iLYoHytJ4f0Hu7Qtkf4ALtTPDnGM="},"flags/1x1/bo-ef679f07e201a91bc3e2152310eb597f731f7133d58be7fc0b1bbb3d8538c666.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2017-08-18T23:12:22+02:00","size":210767,"digest":"ef679f07e201a91bc3e2152310eb597f731f7133d58be7fc0b1bbb3d8538c666","integrity":"sha256-72efB+IBqRvD4hUjEOtZf3MfcTPVi+f8Cxu7PYU4xmY="},"flags/4x3/bq-687781ca2bff027ee1c2bf587d45147cbe81af412d8a4c52e89673535bfa6a6c.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2017-08-18T23:12:22+02:00","size":227,"digest":"687781ca2bff027ee1c2bf587d45147cbe81af412d8a4c52e89673535bfa6a6c","integrity":"sha256-aHeByiv/An7hwr9YfUUUfL6Br0EtikxS6JZzU1v6amw="},"flags/1x1/bq-4c8a202ed7a99c1515fad01c0b79234163b42cfdc813aee71c0d277b49aadaa5.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2017-08-18T23:12:22+02:00","size":231,"digest":"4c8a202ed7a99c1515fad01c0b79234163b42cfdc813aee71c0d277b49aadaa5","integrity":"sha256-TIogLtepnBUV+tAcC3kjQWO0LP3IE67nHA0ne0mq2qU="},"flags/4x3/br-8370504ef87598decf706a50bc8b5deecfa80f965b4c3642d2207c9e0804be3a.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2017-08-18T23:12:22+02:00","size":12470,"digest":"8370504ef87598decf706a50bc8b5deecfa80f965b4c3642d2207c9e0804be3a","integrity":"sha256-g3BQTvh1mN7PcGpQvItd7s+oD5ZbTDZC0iB8nggEvjo="},"flags/1x1/br-cce00e29adbdf110d4155153c8f21e36c46c34847baffafc33b806e121e320d7.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2017-08-18T23:12:22+02:00","size":12219,"digest":"cce00e29adbdf110d4155153c8f21e36c46c34847baffafc33b806e121e320d7","integrity":"sha256-zOAOKa298RDUFVFTyPIeNsRsNIR7r/r8M7gG4SHjINc="},"flags/4x3/bs-80764fdde4884571c2ce5c348231dfe2c57c9e81d4d0d8722ae649ef37a9888c.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2017-08-18T23:12:22+02:00","size":608,"digest":"80764fdde4884571c2ce5c348231dfe2c57c9e81d4d0d8722ae649ef37a9888c","integrity":"sha256-gHZP3eSIRXHCzlw0gjHf4sV8noHU0NhyKuZJ7zepiIw="},"flags/1x1/bs-0a06f669be5ce81e27f5d9ace25e2254113cad9c2964208b5cd136e8b173b6e8.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2017-08-18T23:12:22+02:00","size":658,"digest":"0a06f669be5ce81e27f5d9ace25e2254113cad9c2964208b5cd136e8b173b6e8","integrity":"sha256-Cgb2ab5c6B4n9dms4l4iVBE8rZwpZCCLXNE26LFztug="},"flags/4x3/bt-9d00de93c399a0ed1118946c0d662d997847480445bfbbba259e42f80b170be6.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2017-08-18T23:12:22+02:00","size":41510,"digest":"9d00de93c399a0ed1118946c0d662d997847480445bfbbba259e42f80b170be6","integrity":"sha256-nQDek8OZoO0RGJRsDWYtmXhHSARFv7u6JZ5C+AsXC+Y="},"flags/1x1/bt-32fb8022976e00163073b1f3ff2f62dda6915dd4270d2e09ae51babe67d2ce32.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2017-08-18T23:12:22+02:00","size":40896,"digest":"32fb8022976e00163073b1f3ff2f62dda6915dd4270d2e09ae51babe67d2ce32","integrity":"sha256-MvuAIpduABYwc7Hz/y9i3aaRXdQnDS4JrlG6vmfSzjI="},"flags/4x3/bv-e0fd8f945e245badbcc8deedd6c139e2e19d26b3aea7bf1b9714595a2b08def1.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2017-08-18T23:12:22+02:00","size":647,"digest":"e0fd8f945e245badbcc8deedd6c139e2e19d26b3aea7bf1b9714595a2b08def1","integrity":"sha256-4P2PlF4kW628yN7t1sE54uGdJrOup78blxRZWisI3vE="},"flags/1x1/bv-dceefec7161747877af75d9c4b5bd8c53bfeb5cbbe94b41de9a2201321673653.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2017-08-18T23:12:22+02:00","size":647,"digest":"dceefec7161747877af75d9c4b5bd8c53bfeb5cbbe94b41de9a2201321673653","integrity":"sha256-3O7+xxYXR4d6912cS1vYxTv+tcu+lLQd6aIgEyFnNlM="},"flags/4x3/bw-b5231bca6e8f2dd2371e3b4f776cb33af3889d2ad41c3791feb7cba3afe12992.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2017-08-18T23:12:22+02:00","size":327,"digest":"b5231bca6e8f2dd2371e3b4f776cb33af3889d2ad41c3791feb7cba3afe12992","integrity":"sha256-tSMbym6PLdI3HjtPd2yzOvOInSrUHDeR/rfLo6/hKZI="},"flags/1x1/bw-35bd0c7c542ab29aa65df0322f37befe54917cde0ec29a6358a8cbfcd3eb78a2.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2017-08-18T23:12:22+02:00","size":285,"digest":"35bd0c7c542ab29aa65df0322f37befe54917cde0ec29a6358a8cbfcd3eb78a2","integrity":"sha256-Nb0MfFQqspqmXfAyLze+/lSRfN4OwppjWKjL/NPreKI="},"flags/4x3/by-0111fe7946228bd49fa5ffc1d04e1dbea12bb0483cee4bf146e23fcb5d7bd829.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2017-08-18T23:12:22+02:00","size":9067,"digest":"0111fe7946228bd49fa5ffc1d04e1dbea12bb0483cee4bf146e23fcb5d7bd829","integrity":"sha256-ARH+eUYii9Sfpf/B0E4dvqErsEg87kvxRuI/y1172Ck="},"flags/1x1/by-3a64902f39b8bac7c042cadcd2ace69975498cc6254f60f31829ebbfe31c2ef5.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2017-08-18T23:12:22+02:00","size":8989,"digest":"3a64902f39b8bac7c042cadcd2ace69975498cc6254f60f31829ebbfe31c2ef5","integrity":"sha256-OmSQLzm4usfAQsrc0qzmmXVJjMYlT2DzGCnrv+McLvU="},"flags/4x3/bz-f6761e8e1132b192c6c2dddcb1d0239ed14e801b8902a7ee8fb0cb869a517eab.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2017-08-18T23:12:22+02:00","size":77834,"digest":"f6761e8e1132b192c6c2dddcb1d0239ed14e801b8902a7ee8fb0cb869a517eab","integrity":"sha256-9nYejhEysZLGwt3csdAjntFOgBuJAqfuj7DLhppRfqs="},"flags/1x1/bz-2d1e5ec107a277b8e97fede80f512c23ebbf9c225a2c5450dc51c5fb03c9571b.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2017-08-18T23:12:22+02:00","size":78036,"digest":"2d1e5ec107a277b8e97fede80f512c23ebbf9c225a2c5450dc51c5fb03c9571b","integrity":"sha256-LR5ewQeid7jpf+3oD1EsI+u/nCJaLFRQ3FHF+wPJVxs="},"flags/4x3/ca-cf63f34a0cef8ed56b4cf1ba24fecc20cea252a9eb9e2c16acccf4eb80b32f49.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2017-08-18T23:12:22+02:00","size":1143,"digest":"cf63f34a0cef8ed56b4cf1ba24fecc20cea252a9eb9e2c16acccf4eb80b32f49","integrity":"sha256-z2PzSgzvjtVrTPG6JP7MIM6iUqnrniwWrMz064CzL0k="},"flags/1x1/ca-5c78fbcd8924e8f76111f1cc50317decd6b7c1761e57f19ad33f0b295d002138.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2017-08-18T23:12:22+02:00","size":1081,"digest":"5c78fbcd8924e8f76111f1cc50317decd6b7c1761e57f19ad33f0b295d002138","integrity":"sha256-XHj7zYkk6PdhEfHMUDF97Na3wXYeV/Ga0z8LKV0AITg="},"flags/4x3/cc-f5d8e042b0f7ee2be5ed555b4ea6a0586e69eeb9230701967903364c19e49006.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2017-08-18T23:12:22+02:00","size":4337,"digest":"f5d8e042b0f7ee2be5ed555b4ea6a0586e69eeb9230701967903364c19e49006","integrity":"sha256-9djgQrD37ivl7VVbTqagWG5p7rkjBwGWeQM2TBnkkAY="},"flags/1x1/cc-7dc42986b5859331d9f6c96ae7a97b378ff38e4480072cbecceae78e338891a0.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2017-08-18T23:12:22+02:00","size":4318,"digest":"7dc42986b5859331d9f6c96ae7a97b378ff38e4480072cbecceae78e338891a0","integrity":"sha256-fcQphrWFkzHZ9slq56l7N4/zjkSAByy+zOrnjjOIkaA="},"flags/4x3/cd-9d7d8b11e63073792e3d5e0327cc673101c65ae7545d721b8b1504c31a0c0078.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2017-08-18T23:12:22+02:00","size":352,"digest":"9d7d8b11e63073792e3d5e0327cc673101c65ae7545d721b8b1504c31a0c0078","integrity":"sha256-nX2LEeYwc3kuPV4DJ8xnMQHGWudUXXIbixUEwxoMAHg="},"flags/1x1/cd-f42723b2e3b7815b2a4b970c5d8a8abea987cf16ff26dbab0c1a78f3ffa3d1fd.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2017-08-18T23:12:22+02:00","size":512,"digest":"f42723b2e3b7815b2a4b970c5d8a8abea987cf16ff26dbab0c1a78f3ffa3d1fd","integrity":"sha256-9CcjsuO3gVsqS5cMXYqKvqmHzxb/JturDBp48/+j0f0="},"flags/4x3/cf-902b209a0eaeb8f41f529b5c98240d4fa94dffd58ac3bdc2b6c574125897bb8c.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2017-08-18T23:12:22+02:00","size":757,"digest":"902b209a0eaeb8f41f529b5c98240d4fa94dffd58ac3bdc2b6c574125897bb8c","integrity":"sha256-kCsgmg6uuPQfUptcmCQNT6lN/9WKw73CtsV0EliXu4w="},"flags/1x1/cf-f9b65e234b309ba4f3b2261dcb605b257bd941a308d208b1eaa89af874c779ec.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2017-08-18T23:12:22+02:00","size":679,"digest":"f9b65e234b309ba4f3b2261dcb605b257bd941a308d208b1eaa89af874c779ec","integrity":"sha256-+bZeI0swm6TzsiYdy2BbJXvZQaMI0gix6qia+HTHeew="},"flags/4x3/cg-f62e43d08581b8665ab9a7e61ab62cc6b3dd8e6fd0722c7d45c6ddc3f46ec5ab.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2017-08-18T23:12:22+02:00","size":492,"digest":"f62e43d08581b8665ab9a7e61ab62cc6b3dd8e6fd0722c7d45c6ddc3f46ec5ab","integrity":"sha256-9i5D0IWBuGZauafmGrYsxrPdjm/Qcix9Rcbdw/Ruxas="},"flags/1x1/cg-f2fbf08b1f5fd7e097600a9399d467cb9af8d24fd103a3eeb99f5cf58e6fc0b6.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2017-08-18T23:12:22+02:00","size":507,"digest":"f2fbf08b1f5fd7e097600a9399d467cb9af8d24fd103a3eeb99f5cf58e6fc0b6","integrity":"sha256-8vvwix9f1+CXYAqTmdRny5r40k/RA6PuuZ9c9Y5vwLY="},"flags/4x3/ch-830fe6654b170d461a76a7932b39d352ec30895d512c009a5c193c5a28289158.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2017-08-18T23:12:22+02:00","size":336,"digest":"830fe6654b170d461a76a7932b39d352ec30895d512c009a5c193c5a28289158","integrity":"sha256-gw/mZUsXDUYadqeTKznTUuwwiV1RLACaXBk8WigokVg="},"flags/1x1/ch-9f95a95e181489d64144d4502991c00823cf19fefc029cb639199cb100863a0a.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2017-08-18T23:12:22+02:00","size":354,"digest":"9f95a95e181489d64144d4502991c00823cf19fefc029cb639199cb100863a0a","integrity":"sha256-n5WpXhgUidZBRNRQKZHACCPPGf78Apy2ORmcsQCGOgo="},"flags/4x3/ci-3e6b86d6fc1a24b5635c258bbde180f8638e114be354d7379406d5718e46b70b.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2017-08-18T23:12:22+02:00","size":346,"digest":"3e6b86d6fc1a24b5635c258bbde180f8638e114be354d7379406d5718e46b70b","integrity":"sha256-PmuG1vwaJLVjXCWLveGA+GOOEUvjVNc3lAbVcY5Gtws="},"flags/1x1/ci-816edfc3bfc44353f99572310ba67643f979b1681c2643ecc34255df1dbee05e.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2017-08-18T23:12:22+02:00","size":305,"digest":"816edfc3bfc44353f99572310ba67643f979b1681c2643ecc34255df1dbee05e","integrity":"sha256-gW7fw7/EQ1P5lXIxC6Z2Q/l5sWgcJkPsw0JV3x2+4F4="},"flags/4x3/ck-cadf8156d64ddcff3d60079d017b12bb4e25867e58fa2618f42defa4f7bc8587.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2017-08-18T23:12:22+02:00","size":2639,"digest":"cadf8156d64ddcff3d60079d017b12bb4e25867e58fa2618f42defa4f7bc8587","integrity":"sha256-yt+BVtZN3P89YAedAXsSu04lhn5Y+iYY9C3vpPe8hYc="},"flags/1x1/ck-450d3b83c32f220510bdbab3ec0fca14edf895e53db9e26e4cd00a3edfb3e224.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2017-08-18T23:12:22+02:00","size":2526,"digest":"450d3b83c32f220510bdbab3ec0fca14edf895e53db9e26e4cd00a3edfb3e224","integrity":"sha256-RQ07g8MvIgUQvbqz7A/KFO34leU9ueJuTNAKPt+z4iQ="},"flags/4x3/cl-28ce953691b1c4b0c6d562370913b3ad645e29e56296c16762992e3c30f2a4a8.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2017-08-18T23:12:22+02:00","size":635,"digest":"28ce953691b1c4b0c6d562370913b3ad645e29e56296c16762992e3c30f2a4a8","integrity":"sha256-KM6VNpGxxLDG1WI3CROzrWReKeVilsFnYpkuPDDypKg="},"flags/1x1/cl-ed5421f0ff3ba05785268eed2abd3abf76125ec832e519bc10a30db278c23662.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2017-08-18T23:12:22+02:00","size":665,"digest":"ed5421f0ff3ba05785268eed2abd3abf76125ec832e519bc10a30db278c23662","integrity":"sha256-7VQh8P87oFeFJo7tKr06v3YSXsgy5Rm8EKMNsnjCNmI="},"flags/4x3/cm-d22cb6519bfbf9fbae46b283f6d882f8d46713f18ba59969ae45c542ba2bc621.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2017-08-18T23:12:22+02:00","size":847,"digest":"d22cb6519bfbf9fbae46b283f6d882f8d46713f18ba59969ae45c542ba2bc621","integrity":"sha256-0iy2UZv7+fuuRrKD9tiC+NRnE/GLpZlprkXFQrorxiE="},"flags/1x1/cm-4619b0400d175f6c0f686526cfdbfcc6f7c2fc7587449e05ab0385cc7d4e8bd4.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2017-08-18T23:12:22+02:00","size":847,"digest":"4619b0400d175f6c0f686526cfdbfcc6f7c2fc7587449e05ab0385cc7d4e8bd4","integrity":"sha256-RhmwQA0XX2wPaGUmz9v8xvfC/HWHRJ4FqwOFzH1Oi9Q="},"flags/4x3/cn-7af9da3dd810174340b79e6fe636bec183c71d7ce314ac4a5a815bfd388dea54.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2017-08-18T23:12:22+02:00","size":848,"digest":"7af9da3dd810174340b79e6fe636bec183c71d7ce314ac4a5a815bfd388dea54","integrity":"sha256-evnaPdgQF0NAt55v5ja+wYPHHXzjFKxKWoFb/TiN6lQ="},"flags/1x1/cn-22e04d44d7f85e6f5800bddc6a497e5722de8db2ad74c6c525c392bd7b8c6e09.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2017-08-18T23:12:22+02:00","size":792,"digest":"22e04d44d7f85e6f5800bddc6a497e5722de8db2ad74c6c525c392bd7b8c6e09","integrity":"sha256-IuBNRNf4Xm9YAL3cakl+VyLejbKtdMbFJcOSvXuMbgk="},"flags/4x3/co-ef2a3c7e495d85d7df1b9bda27023cd558abe89402cad0ff42428c2c5b877551.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2017-08-18T23:12:22+02:00","size":304,"digest":"ef2a3c7e495d85d7df1b9bda27023cd558abe89402cad0ff42428c2c5b877551","integrity":"sha256-7yo8fkldhdffG5vaJwI81Vir6JQCytD/QkKMLFuHdVE="},"flags/1x1/co-42915db89e2fa2f9f97c09ecafc188eb2ec4e51efa87685a01c25d2f0afddf45.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2017-08-18T23:12:22+02:00","size":320,"digest":"42915db89e2fa2f9f97c09ecafc188eb2ec4e51efa87685a01c25d2f0afddf45","integrity":"sha256-QpFduJ4vovn5fAnsr8GI6y7E5R76h2haAcJdLwr930U="},"flags/4x3/cr-7853ef9dbb5832a6d2738b44afdecfcdaa80c56cb66c448b8a8657e236854c8d.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2017-08-18T23:12:22+02:00","size":303,"digest":"7853ef9dbb5832a6d2738b44afdecfcdaa80c56cb66c448b8a8657e236854c8d","integrity":"sha256-eFPvnbtYMqbSc4tEr97PzaqAxWy2bESLioZX4jaFTI0="},"flags/1x1/cr-b86f916cc80cc14db90b66c652a2919a26baf2864451685af9c34d6310c3f8c6.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2017-08-18T23:12:22+02:00","size":320,"digest":"b86f916cc80cc14db90b66c652a2919a26baf2864451685af9c34d6310c3f8c6","integrity":"sha256-uG+RbMgMwU25C2bGUqKRmia68oZEUWha+cNNYxDD+MY="},"flags/4x3/cu-e3a3afa4a5c661ad431dc45eb501d7e1280b4a397bafa3956a9fc5bab8735f45.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2017-08-18T23:12:22+02:00","size":682,"digest":"e3a3afa4a5c661ad431dc45eb501d7e1280b4a397bafa3956a9fc5bab8735f45","integrity":"sha256-46OvpKXGYa1DHcRetQHX4SgLSjl7r6OVap/FurhzX0U="},"flags/1x1/cu-9563bc3aa0b1ac659dddaa2534c37d338e1da3dfd3726a717fc85ca8449c83da.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2017-08-18T23:12:22+02:00","size":638,"digest":"9563bc3aa0b1ac659dddaa2534c37d338e1da3dfd3726a717fc85ca8449c83da","integrity":"sha256-lWO8OqCxrGWd3aolNMN9M44do9/Tcmpxf8hcqEScg9o="},"flags/4x3/cv-d39c3ae09026623cebad38bbe41231aea9b9afacf7eca1d0abf6666e91dd8bbc.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2017-08-18T23:12:22+02:00","size":1790,"digest":"d39c3ae09026623cebad38bbe41231aea9b9afacf7eca1d0abf6666e91dd8bbc","integrity":"sha256-05w64JAmYjzrrTi75BIxrqm5r6z37KHQq/ZmbpHdi7w="},"flags/1x1/cv-78857e96ac5b49478a49578f422abe217af9ed7d90fa2d08ae72a67de4f6999e.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2017-08-18T23:12:22+02:00","size":1734,"digest":"78857e96ac5b49478a49578f422abe217af9ed7d90fa2d08ae72a67de4f6999e","integrity":"sha256-eIV+lqxbSUeKSVePQiq+IXr57X2Q+i0IrnKmfeT2mZ4="},"flags/4x3/cw-c65dd455b3c113d9088e563033c5f1ed3945d6dd88c8f13317fe297fd2291776.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2017-08-18T23:12:22+02:00","size":705,"digest":"c65dd455b3c113d9088e563033c5f1ed3945d6dd88c8f13317fe297fd2291776","integrity":"sha256-xl3UVbPBE9kIjlYwM8Xx7TlF1t2IyPEzF/4pf9IpF3Y="},"flags/1x1/cw-61f38f9076443eb7ca682abc21e6ea5f170bd855813d7297d85602b76ca36171.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2017-08-18T23:12:22+02:00","size":711,"digest":"61f38f9076443eb7ca682abc21e6ea5f170bd855813d7297d85602b76ca36171","integrity":"sha256-YfOPkHZEPrfKaCq8IebqXxcL2FWBPXKX2FYCt2yjYXE="},"flags/4x3/cx-aecc7a8b4b84b9f00a63154b027cb8ec78bebcec33e756b5e95151efb43420f7.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2017-08-18T23:12:22+02:00","size":3488,"digest":"aecc7a8b4b84b9f00a63154b027cb8ec78bebcec33e756b5e95151efb43420f7","integrity":"sha256-rsx6i0uEufAKYxVLAny47Hi+vOwz51a16VFR77Q0IPc="},"flags/1x1/cx-c052a0033a120d56c108dc0a919c3fccb9d01a4b78f1f778e3f2973e96197868.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2017-08-18T23:12:22+02:00","size":3504,"digest":"c052a0033a120d56c108dc0a919c3fccb9d01a4b78f1f778e3f2973e96197868","integrity":"sha256-wFKgAzoSDVbBCNwKkZw/zLnQGkt48fd44/KXPpYZeGg="},"flags/4x3/cy-b8e0d56b75e0954429cb2253aaf289a83e3c72abd52b4132bdd4016f2bbd43c9.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2017-08-18T23:12:22+02:00","size":10069,"digest":"b8e0d56b75e0954429cb2253aaf289a83e3c72abd52b4132bdd4016f2bbd43c9","integrity":"sha256-uODVa3XglUQpyyJTqvKJqD48cqvVK0EyvdQBbyu9Q8k="},"flags/1x1/cy-34aa50b77e1b86f5305beec283996cabc45fef1950582b868addc40fd9a8438f.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2017-08-18T23:12:22+02:00","size":10141,"digest":"34aa50b77e1b86f5305beec283996cabc45fef1950582b868addc40fd9a8438f","integrity":"sha256-NKpQt34bhvUwW+7Cg5lsq8Rf7xlQWCuGit3ED9moQ48="},"flags/4x3/cz-c2a15f3c50b7920c7d82fd9fb21f77c44fb3883f0e34dcf197a23d92d9212290.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2017-08-18T23:12:22+02:00","size":501,"digest":"c2a15f3c50b7920c7d82fd9fb21f77c44fb3883f0e34dcf197a23d92d9212290","integrity":"sha256-wqFfPFC3kgx9gv2fsh93xE+ziD8ONNzxl6I9ktkhIpA="},"flags/1x1/cz-487367824632a5097e16d7ed1ffc7fe8e233f9e1af45522571e1d4da10de92c7.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2017-08-18T23:12:22+02:00","size":505,"digest":"487367824632a5097e16d7ed1ffc7fe8e233f9e1af45522571e1d4da10de92c7","integrity":"sha256-SHNngkYypQl+FtftH/x/6OIz+eGvRVIlceHU2hDeksc="},"flags/4x3/de-32f54fb46c7fcaf2dfcf9172273456ea57f975efb228860def92481efe51c506.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2017-08-18T23:12:22+02:00","size":290,"digest":"32f54fb46c7fcaf2dfcf9172273456ea57f975efb228860def92481efe51c506","integrity":"sha256-MvVPtGx/yvLfz5FyJzRW6lf5de+yKIYN75JIHv5RxQY="},"flags/1x1/de-2c94f333afeb14810030d786620fc32e65ba79af53b1037192383823996bb77f.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2017-08-18T23:12:22+02:00","size":315,"digest":"2c94f333afeb14810030d786620fc32e65ba79af53b1037192383823996bb77f","integrity":"sha256-LJTzM6/rFIEAMNeGYg/DLmW6ea9TsQNxkjg4I5lrt38="},"flags/4x3/dj-d84d938856e7b6bdf8d38413c84a6968f94dc2adb218f2a9fab3d703341efc33.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2017-08-18T23:12:22+02:00","size":641,"digest":"d84d938856e7b6bdf8d38413c84a6968f94dc2adb218f2a9fab3d703341efc33","integrity":"sha256-2E2TiFbntr3404QTyEppaPlNwq2yGPKp+rPXAzQe/DM="},"flags/1x1/dj-6960cafac7e0d593152b60988fd12f5d1bb95068bf055c638cb999459f932692.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2017-08-18T23:12:22+02:00","size":657,"digest":"6960cafac7e0d593152b60988fd12f5d1bb95068bf055c638cb999459f932692","integrity":"sha256-aWDK+sfg1ZMVK2CYj9EvXRu5UGi/BVxjjLmZRZ+TJpI="},"flags/4x3/dk-fdd09296ac803a8cf4066ff5488821458a9788985e3cc09356d4c4ef81959ecf.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2017-08-18T23:12:22+02:00","size":249,"digest":"fdd09296ac803a8cf4066ff5488821458a9788985e3cc09356d4c4ef81959ecf","integrity":"sha256-/dCSlqyAOoz0Bm/1SIghRYqXiJhePMCTVtTE74GVns8="},"flags/1x1/dk-87924239a5ff1605582e1736f5ef17c9bd9d580d796d94b05ff668e2a52a223e.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2017-08-18T23:12:22+02:00","size":243,"digest":"87924239a5ff1605582e1736f5ef17c9bd9d580d796d94b05ff668e2a52a223e","integrity":"sha256-h5JCOaX/FgVYLhc29e8Xyb2dWA15bZSwX/Zo4qUqIj4="},"flags/4x3/dm-dc3b5c9634f0751ebfec181b12a7c530673ced1001b62a9126ed5ae39ba57203.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2017-08-18T23:12:22+02:00","size":20452,"digest":"dc3b5c9634f0751ebfec181b12a7c530673ced1001b62a9126ed5ae39ba57203","integrity":"sha256-3DtcljTwdR6/7BgbEqfFMGc87RABtiqRJu1a45ulcgM="},"flags/1x1/dm-c8018ea775b0add069f676bbf4b446ed19886c192aa742bb6a61c3602ca63211.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2017-08-18T23:12:22+02:00","size":20955,"digest":"c8018ea775b0add069f676bbf4b446ed19886c192aa742bb6a61c3602ca63211","integrity":"sha256-yAGOp3WwrdBp9na79LRG7RmIbBkqp0K7amHDYCymMhE="},"flags/4x3/do-5e2d6816118f78fa4a362ee6a276dac655a4c99d57a9e53a52198f1624ed186a.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2017-08-18T23:12:22+02:00","size":466771,"digest":"5e2d6816118f78fa4a362ee6a276dac655a4c99d57a9e53a52198f1624ed186a","integrity":"sha256-Xi1oFhGPePpKNi7monbaxlWkyZ1XqeU6UhmPFiTtGGo="},"flags/1x1/do-f9862ff8016b35d30d5c37ac2c585cdddf235e56ac9a7ae31a90c96963865f57.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2017-08-18T23:12:22+02:00","size":453664,"digest":"f9862ff8016b35d30d5c37ac2c585cdddf235e56ac9a7ae31a90c96963865f57","integrity":"sha256-+YYv+AFrNdMNXDesLFhc3d8jXlasmnrjGpDJaWOGX1c="},"flags/4x3/dz-8a14ddcb20a69c3265924fe2af141ea78c0af47ea07a88707c392a2793092cd4.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2017-08-18T23:12:22+02:00","size":313,"digest":"8a14ddcb20a69c3265924fe2af141ea78c0af47ea07a88707c392a2793092cd4","integrity":"sha256-ihTdyyCmnDJlkk/irxQep4wK9H6geohwfDkqJ5MJLNQ="},"flags/1x1/dz-0e2ada15ba7882343f7512929d3cf981a23a91817fdda0be1ed6a093161b649e.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2017-08-18T23:12:22+02:00","size":339,"digest":"0e2ada15ba7882343f7512929d3cf981a23a91817fdda0be1ed6a093161b649e","integrity":"sha256-DiraFbp4gjQ/dRKSnTz5gaI6kYF/3aC+HtagkxYbZJ4="},"flags/4x3/ec-a4c3c62b4272f5000e1c8f563c45ce8305ec71f4e4e49ac477d81b5cb692d7e6.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2017-08-18T23:12:22+02:00","size":38481,"digest":"a4c3c62b4272f5000e1c8f563c45ce8305ec71f4e4e49ac477d81b5cb692d7e6","integrity":"sha256-pMPGK0Jy9QAOHI9WPEXOgwXscfTk5JrEd9gbXLaS1+Y="},"flags/1x1/ec-c42aa1de56f2933fc6703e7a59ebc8b424c66f190697ee66814a137b56fa6969.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2017-08-18T23:12:22+02:00","size":39118,"digest":"c42aa1de56f2933fc6703e7a59ebc8b424c66f190697ee66814a137b56fa6969","integrity":"sha256-xCqh3lbykz/GcD56WevItCTGbxkGl+5mgUoTe1b6aWk="},"flags/4x3/ee-6148aad79adb1c847fedb9da5a7e9c9d47e99ef4c8f4853bb9800e738bddb19d.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2017-08-18T23:12:22+02:00","size":336,"digest":"6148aad79adb1c847fedb9da5a7e9c9d47e99ef4c8f4853bb9800e738bddb19d","integrity":"sha256-YUiq15rbHIR/7bnaWn6cnUfpnvTI9IU7uYAOc4vdsZ0="},"flags/1x1/ee-9a87370a85922c5d103d9d21fe3e778b801a62cf40e1f0efe8d708c5fe3b3ac4.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2017-08-18T23:12:22+02:00","size":371,"digest":"9a87370a85922c5d103d9d21fe3e778b801a62cf40e1f0efe8d708c5fe3b3ac4","integrity":"sha256-moc3CoWSLF0QPZ0h/j53i4AaYs9A4fDv6NcIxf47OsQ="},"flags/4x3/eg-3b2f122e512f0fc470666b35af4f677404d4b811cd795d5cf4e44a72ffd01285.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2017-08-18T23:12:22+02:00","size":16086,"digest":"3b2f122e512f0fc470666b35af4f677404d4b811cd795d5cf4e44a72ffd01285","integrity":"sha256-Oy8SLlEvD8RwZms1r09ndATUuBHNeV1c9ORKcv/QEoU="},"flags/1x1/eg-a050fc5953113bfa5e12867313b321df472eb86ad1e3d5362ebb27ac2edbd28b.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2017-08-18T23:12:22+02:00","size":16110,"digest":"a050fc5953113bfa5e12867313b321df472eb86ad1e3d5362ebb27ac2edbd28b","integrity":"sha256-oFD8WVMRO/peEoZzE7Mh30cuuGrR49U2LrsnrC7b0os="},"flags/4x3/eh-fea043048f74c728961fe981d7e5d50e286fef39f3e68659b699c6c357c202dd.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2017-08-18T23:12:22+02:00","size":1081,"digest":"fea043048f74c728961fe981d7e5d50e286fef39f3e68659b699c6c357c202dd","integrity":"sha256-/qBDBI90xyiWH+mB1+XVDihv7znz5oZZtpnGw1fCAt0="},"flags/1x1/eh-8ea23a1b6813465e739d6f5e2ca6727331fae96cd32c86041a1ba48926a14cfd.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2017-08-18T23:12:22+02:00","size":1028,"digest":"8ea23a1b6813465e739d6f5e2ca6727331fae96cd32c86041a1ba48926a14cfd","integrity":"sha256-jqI6G2gTRl5znW9eLKZyczH66WzTLIYEGhukiSahTP0="},"flags/4x3/er-b24dc54f7e94d0934d05faa7944e6039a56de8a5e4779a399046f047dbd1b949.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2017-08-18T23:12:22+02:00","size":4800,"digest":"b24dc54f7e94d0934d05faa7944e6039a56de8a5e4779a399046f047dbd1b949","integrity":"sha256-sk3FT36U0JNNBfqnlE5gOaVt6KXkd5o5kEbwR9vRuUk="},"flags/1x1/er-6921f9776ece4a1b1ec594ec5665076462cef2d0b41eba83a7bc840ecf88287d.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2017-08-18T23:12:22+02:00","size":4848,"digest":"6921f9776ece4a1b1ec594ec5665076462cef2d0b41eba83a7bc840ecf88287d","integrity":"sha256-aSH5d27OShsexZTsVmUHZGLO8tC0HrqDp7yEDs+IKH0="},"flags/4x3/es-e36093927dc1fa109e4ddcd4baa65d53d233c23bcdd32796b96409b52c5adbc0.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2017-08-18T23:12:22+02:00","size":145208,"digest":"e36093927dc1fa109e4ddcd4baa65d53d233c23bcdd32796b96409b52c5adbc0","integrity":"sha256-42CTkn3B+hCeTdzUuqZdU9IzwjvN0yeWuWQJtSxa28A="},"flags/1x1/es-16a6c048523ee57edd91e60e87aae136a96893b48828d932a24436bb219c00b9.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2017-08-18T23:12:22+02:00","size":147129,"digest":"16a6c048523ee57edd91e60e87aae136a96893b48828d932a24436bb219c00b9","integrity":"sha256-FqbASFI+5X7dkeYOh6rhNqlok7SIKNkyokQ2uyGcALk="},"flags/4x3/et-a3ef36d217667b7e8ebe910469c2eeef563f03d3ea5628ec7fea0f72650db28e.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2017-08-18T23:12:22+02:00","size":1574,"digest":"a3ef36d217667b7e8ebe910469c2eeef563f03d3ea5628ec7fea0f72650db28e","integrity":"sha256-o+820hdme36OvpEEacLu71Y/A9PqVijsf+oPcmUNso4="},"flags/1x1/et-f66f415e5d5b8b697ed7bb85f4ae3408f9cefaeed7ff0136c4c03da5c3601340.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2017-08-18T23:12:22+02:00","size":1595,"digest":"f66f415e5d5b8b697ed7bb85f4ae3408f9cefaeed7ff0136c4c03da5c3601340","integrity":"sha256-9m9BXl1bi2l+17uF9K40CPnO+u7X/wE2xMA9pcNgE0A="},"flags/4x3/fi-a94779c54a538d2f57a421e6beb619f07cc9c2bda40817d236b686deb8eb3b4c.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2017-08-18T23:12:22+02:00","size":265,"digest":"a94779c54a538d2f57a421e6beb619f07cc9c2bda40817d236b686deb8eb3b4c","integrity":"sha256-qUd5xUpTjS9XpCHmvrYZ8HzJwr2kCBfSNraG3rjrO0w="},"flags/1x1/fi-865b1ae3ed34a0cf0928c6289411569add2065c7ea4fa6897f971c322d955b16.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2017-08-18T23:12:22+02:00","size":265,"digest":"865b1ae3ed34a0cf0928c6289411569add2065c7ea4fa6897f971c322d955b16","integrity":"sha256-hlsa4+00oM8JKMYolBFWmt0gZcfqT6aJf5ccMi2VWxY="},"flags/4x3/fj-97dd8f9b0d9df1cd965c8a85ecb6feb538acc83b470596ccd199f71dc3d2eff9.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2017-08-18T23:12:22+02:00","size":44908,"digest":"97dd8f9b0d9df1cd965c8a85ecb6feb538acc83b470596ccd199f71dc3d2eff9","integrity":"sha256-l92Pmw2d8c2WXIqF7Lb+tTisyDtHBZbM0Zn3HcPS7/k="},"flags/1x1/fj-f772a5a860faef823adad1b0dc8e848349d094f4fa3b37e48c87382bd443c861.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2017-08-18T23:12:22+02:00","size":45010,"digest":"f772a5a860faef823adad1b0dc8e848349d094f4fa3b37e48c87382bd443c861","integrity":"sha256-93KlqGD674I62tGw3I6Eg0nQlPT6OzfkjIc4K9RDyGE="},"flags/4x3/fk-788901bf125ceebc6c23fa03c801420c787bbc4ce6aa4511ccaaba301e379886.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2017-08-18T23:12:22+02:00","size":44422,"digest":"788901bf125ceebc6c23fa03c801420c787bbc4ce6aa4511ccaaba301e379886","integrity":"sha256-eIkBvxJc7rxsI/oDyAFCDHh7vEzmqkURzKq6MB43mIY="},"flags/1x1/fk-5d8df0034167cc75863d02bfdb6147da3a694102f7eea0d92e717a048437fc0f.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2017-08-18T23:12:22+02:00","size":44641,"digest":"5d8df0034167cc75863d02bfdb6147da3a694102f7eea0d92e717a048437fc0f","integrity":"sha256-XY3wA0FnzHWGPQK/22FH2jppQQL37qDZLnF6BIQ3/A8="},"flags/4x3/fm-7167ec387c426a817bccbfec86c8f815b82b36504e1d480f4f9fa04177bdcba0.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2017-08-18T23:12:22+02:00","size":936,"digest":"7167ec387c426a817bccbfec86c8f815b82b36504e1d480f4f9fa04177bdcba0","integrity":"sha256-cWfsOHxCaoF7zL/shsj4FbgrNlBOHUgPT5+gQXe9y6A="},"flags/1x1/fm-d08e5959b5e3866cdf814f8d6ab594cb3ca84f0887a3adad3bff824ea0aca70a.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2017-08-18T23:12:22+02:00","size":941,"digest":"d08e5959b5e3866cdf814f8d6ab594cb3ca84f0887a3adad3bff824ea0aca70a","integrity":"sha256-0I5ZWbXjhmzfgU+NarWUyzyoTwiHo62tO/+CTqCspwo="},"flags/4x3/fo-af6148d661d02a6580e8714a6271776b4b8bf3b656bfd5fd88acdd1aa170366a.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2017-08-18T23:12:22+02:00","size":650,"digest":"af6148d661d02a6580e8714a6271776b4b8bf3b656bfd5fd88acdd1aa170366a","integrity":"sha256-r2FI1mHQKmWA6HFKYnF3a0uL87ZWv9X9iKzdGqFwNmo="},"flags/1x1/fo-26d5af2770c46935170988cbad16ef9aad9be34b38ea92847e6646a516878598.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2017-08-18T23:12:22+02:00","size":589,"digest":"26d5af2770c46935170988cbad16ef9aad9be34b38ea92847e6646a516878598","integrity":"sha256-JtWvJ3DEaTUXCYjLrRbvmq2b40s46pKEfmZGpRaHhZg="},"flags/4x3/fr-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2017-08-18T23:12:22+02:00","size":313,"digest":"4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702","integrity":"sha256-ToxEbgMlcqLnTR/czsmjrpPWbcJJUu0vH+W9q2/vVwI="},"flags/1x1/fr-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/ga-80f90062ef9aa4d236c81ec6c6c6e08058750794014bb93d8dbdc8e1684ca4fa.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2017-08-18T23:12:22+02:00","size":297,"digest":"80f90062ef9aa4d236c81ec6c6c6e08058750794014bb93d8dbdc8e1684ca4fa","integrity":"sha256-gPkAYu+apNI2yB7GxsbggFh1B5QBS7k9jb3I4WhMpPo="},"flags/1x1/ga-a66094862d24f29704c190fe42ff50820923f3940ff417f3e1623e9089b57eb9.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2017-08-18T23:12:22+02:00","size":328,"digest":"a66094862d24f29704c190fe42ff50820923f3940ff417f3e1623e9089b57eb9","integrity":"sha256-pmCUhi0k8pcEwZD+Qv9Qggkj85QP9Bfz4WI+kIm1frk="},"flags/4x3/gb-d85f0f149b4390bed6624bc30ca2cbfa37d394f14474fcf81d63363ad363e284.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2017-08-18T23:12:22+02:00","size":956,"digest":"d85f0f149b4390bed6624bc30ca2cbfa37d394f14474fcf81d63363ad363e284","integrity":"sha256-2F8PFJtDkL7WYkvDDKLL+jfTlPFEdPz4HWM2OtNj4oQ="},"flags/1x1/gb-2f0cc6ed1e8e9a7e56cafd3500585d685ae0c51abacddc52f750fb4d23f60b04.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2017-08-18T23:12:22+02:00","size":911,"digest":"2f0cc6ed1e8e9a7e56cafd3500585d685ae0c51abacddc52f750fb4d23f60b04","integrity":"sha256-LwzG7R6Omn5Wyv01AFhdaFrgxRq6zdxS91D7TSP2CwQ="},"flags/4x3/gd-51a8d53466df4426bec5fb202dd8f35239324b9c8b5256d38fe411c4b79945cb.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2017-08-18T23:12:22+02:00","size":1960,"digest":"51a8d53466df4426bec5fb202dd8f35239324b9c8b5256d38fe411c4b79945cb","integrity":"sha256-UajVNGbfRCa+xfsgLdjzUjkyS5yLUlbTj+QRxLeZRcs="},"flags/1x1/gd-9156f824a83004691a7a354e925bc1680b5cffe663bbfa37aa4609ff28148218.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2017-08-18T23:12:22+02:00","size":1872,"digest":"9156f824a83004691a7a354e925bc1680b5cffe663bbfa37aa4609ff28148218","integrity":"sha256-kVb4JKgwBGkaejVOklvBaAtc/+Zju/o3qkYJ/ygUghg="},"flags/4x3/ge-4ef2c8e6f371a711c61ac54d8d201a80aab53767cacc5322fb848cd3e38b00e7.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2017-08-18T23:12:22+02:00","size":2325,"digest":"4ef2c8e6f371a711c61ac54d8d201a80aab53767cacc5322fb848cd3e38b00e7","integrity":"sha256-TvLI5vNxpxHGGsVNjSAagKq1N2fKzFMi+4SM0+OLAOc="},"flags/1x1/ge-a3af8272a5fb63372705825519543e53269282c4800b70e6a93ba69674524eee.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2017-08-18T23:12:22+02:00","size":2263,"digest":"a3af8272a5fb63372705825519543e53269282c4800b70e6a93ba69674524eee","integrity":"sha256-o6+CcqX7YzcnBYJVGVQ+UyaSgsSAC3DmqTumlnRSTu4="},"flags/4x3/gf-c7d5ee882949b708641f99ec02edcc6b3b2362d393cc3869342442225be7cd3d.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2017-08-18T23:12:22+02:00","size":288,"digest":"c7d5ee882949b708641f99ec02edcc6b3b2362d393cc3869342442225be7cd3d","integrity":"sha256-x9XuiClJtwhkH5nsAu3MazsjYtOTzDhpNCRCIlvnzT0="},"flags/1x1/gf-b297e376fc00d3d7bfafd081766dafc4590f4ac4b71f53bc2bbdf2c028547920.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2017-08-18T23:12:22+02:00","size":292,"digest":"b297e376fc00d3d7bfafd081766dafc4590f4ac4b71f53bc2bbdf2c028547920","integrity":"sha256-spfjdvwA09e/r9CBdm2vxFkPSsS3H1O8K73ywChUeSA="},"flags/4x3/gg-e99b36723ffe04d7be392d612c76ef44e82bc84823d71793eb38e338116f0ee0.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2017-08-18T23:12:22+02:00","size":621,"digest":"e99b36723ffe04d7be392d612c76ef44e82bc84823d71793eb38e338116f0ee0","integrity":"sha256-6Zs2cj/+BNe+OS1hLHbvROgryEgj1xeT6zjjOBFvDuA="},"flags/1x1/gg-3f764a4568626d43f89b2b200dcbfe68de3093be418716549ab7c5c33f433d37.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2017-08-18T23:12:22+02:00","size":664,"digest":"3f764a4568626d43f89b2b200dcbfe68de3093be418716549ab7c5c33f433d37","integrity":"sha256-P3ZKRWhibUP4mysgDcv+aN4wk75BhxZUmrfFwz9DPTc="},"flags/4x3/gh-817c2eb8b3f7190647510371b2d38ad8e28e1348cb657e34778f970af5ca3868.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2017-08-18T23:12:22+02:00","size":312,"digest":"817c2eb8b3f7190647510371b2d38ad8e28e1348cb657e34778f970af5ca3868","integrity":"sha256-gXwuuLP3GQZHUQNxstOK2OKOE0jLZX40d4+XCvXKOGg="},"flags/1x1/gh-87a6486910cb62e58439da330c4270d1e2a0fd8e1ace80987c295971d15f9af3.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2017-08-18T23:12:22+02:00","size":332,"digest":"87a6486910cb62e58439da330c4270d1e2a0fd8e1ace80987c295971d15f9af3","integrity":"sha256-h6ZIaRDLYuWEOdozDEJw0eKg/Y4azoCYfClZcdFfmvM="},"flags/4x3/gi-52bfb6cd7cbebf1da96dfc6bf708d3b7239984d36400181ca4ac020081ae41b5.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2017-08-18T23:12:22+02:00","size":4125,"digest":"52bfb6cd7cbebf1da96dfc6bf708d3b7239984d36400181ca4ac020081ae41b5","integrity":"sha256-Ur+2zXy+vx2pbfxr9wjTtyOZhNNkABgcpKwCAIGuQbU="},"flags/1x1/gi-f7ebd8d36a5cb260392a92f10d8bc8d7cf11433fdce9474e08cc52a07dcd5258.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2017-08-18T23:12:22+02:00","size":4115,"digest":"f7ebd8d36a5cb260392a92f10d8bc8d7cf11433fdce9474e08cc52a07dcd5258","integrity":"sha256-9+vY02pcsmA5KpLxDYvI188RQz/c6UdOCMxSoH3NUlg="},"flags/4x3/gl-e031a722ec76e8262439e50a0dbba62f7b7bea020361f2bf4a9a49d6b59954a5.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2017-08-18T23:12:22+02:00","size":662,"digest":"e031a722ec76e8262439e50a0dbba62f7b7bea020361f2bf4a9a49d6b59954a5","integrity":"sha256-4DGnIux26CYkOeUKDbumL3t76gIDYfK/SppJ1rWZVKU="},"flags/1x1/gl-847b3362e50c1d74aeb01a5ea55cfa2950597cbbfa2377bd7cb70e273d4c57fb.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2017-08-18T23:12:22+02:00","size":511,"digest":"847b3362e50c1d74aeb01a5ea55cfa2950597cbbfa2377bd7cb70e273d4c57fb","integrity":"sha256-hHszYuUMHXSusBpepVz6KVBZfLv6I3e9fLcOJz1MV/s="},"flags/4x3/gm-a13d89d1cd66c77706dbaa380370ce3d62c0cf3219c287008759e823fd42a27c.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2017-08-18T23:12:22+02:00","size":558,"digest":"a13d89d1cd66c77706dbaa380370ce3d62c0cf3219c287008759e823fd42a27c","integrity":"sha256-oT2J0c1mx3cG26o4A3DOPWLAzzIZwocAh1noI/1Conw="},"flags/1x1/gm-4a4490e2aea203b32862d6e58bd02efc45d07a401684795ecae68ddb97756387.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2017-08-18T23:12:22+02:00","size":421,"digest":"4a4490e2aea203b32862d6e58bd02efc45d07a401684795ecae68ddb97756387","integrity":"sha256-SkSQ4q6iA7MoYtbli9Au/EXQekAWhHleyuaN25d1Y4c="},"flags/4x3/gn-cfa24192de905cc4a07dffb54ea252304bcffd387ce2d6dedae89b654486f286.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2017-08-18T23:12:22+02:00","size":310,"digest":"cfa24192de905cc4a07dffb54ea252304bcffd387ce2d6dedae89b654486f286","integrity":"sha256-z6JBkt6QXMSgff+1TqJSMEvP/Th84tbe2uibZUSG8oY="},"flags/1x1/gn-b50eaffe8a6fd16c9cf2c2d51adea53250b089f04ea701b8d5d812877de6d084.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2017-08-18T23:12:22+02:00","size":314,"digest":"b50eaffe8a6fd16c9cf2c2d51adea53250b089f04ea701b8d5d812877de6d084","integrity":"sha256-tQ6v/opv0Wyc8sLVGt6lMlCwifBOpwG41dgSh33m0IQ="},"flags/4x3/gp-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2017-08-18T23:12:22+02:00","size":313,"digest":"4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702","integrity":"sha256-ToxEbgMlcqLnTR/czsmjrpPWbcJJUu0vH+W9q2/vVwI="},"flags/1x1/gp-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/gq-548afdaa6c448c6bec87c1e2148831c41f9a2f4f83922cf32e5a3904679d889d.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2017-08-18T23:12:22+02:00","size":6577,"digest":"548afdaa6c448c6bec87c1e2148831c41f9a2f4f83922cf32e5a3904679d889d","integrity":"sha256-VIr9qmxEjGvsh8HiFIgxxB+aL0+DkizzLlo5BGediJ0="},"flags/1x1/gq-28c6e2820b326370a489d4f9efaf258432fdabecb67e610ddd752ed0f0e8a8ce.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2017-08-18T23:12:22+02:00","size":8200,"digest":"28c6e2820b326370a489d4f9efaf258432fdabecb67e610ddd752ed0f0e8a8ce","integrity":"sha256-KMbiggsyY3CkidT5768lhDL9q+y2fmEN3XUu0PDoqM4="},"flags/4x3/gr-e2aa8c913feebbed26a8fa0de5ac4aeb51545a4c0dee9bfda4ec5d9673f96386.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2017-08-18T23:12:22+02:00","size":819,"digest":"e2aa8c913feebbed26a8fa0de5ac4aeb51545a4c0dee9bfda4ec5d9673f96386","integrity":"sha256-4qqMkT/uu+0mqPoN5axK61FUWkwN7pv9pOxdlnP5Y4Y="},"flags/1x1/gr-64dc4363c7c3b827adaa7cd51bb8a0f30bd0a547e86772c473d433b1a6033e2f.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2017-08-18T23:12:22+02:00","size":876,"digest":"64dc4363c7c3b827adaa7cd51bb8a0f30bd0a547e86772c473d433b1a6033e2f","integrity":"sha256-ZNxDY8fDuCetqnzVG7ig8wvQpUfoZ3LEc9QzsaYDPi8="},"flags/4x3/gs-83141fac364fa2871379c6b1cb8da9935a185bf9b0e5dafc6b6458fa13359589.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2017-08-18T23:12:22+02:00","size":46535,"digest":"83141fac364fa2871379c6b1cb8da9935a185bf9b0e5dafc6b6458fa13359589","integrity":"sha256-gxQfrDZPoocTecaxy42pk1oYW/mw5dr8a2RY+hM1lYk="},"flags/1x1/gs-31c9e0016c7bd2cfed68cc4e6c2ca73123ce9391e8a50804e5c74101b72e07cc.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2017-08-18T23:12:22+02:00","size":47063,"digest":"31c9e0016c7bd2cfed68cc4e6c2ca73123ce9391e8a50804e5c74101b72e07cc","integrity":"sha256-McngAWx70s/taMxObCynMSPOk5HopQgE5cdBAbcuB8w="},"flags/4x3/gt-b4ca8c4ed71131c43ba14f3631a0ee92dababef325bd698ee0bac0da84980c85.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2017-08-18T23:12:22+02:00","size":59566,"digest":"b4ca8c4ed71131c43ba14f3631a0ee92dababef325bd698ee0bac0da84980c85","integrity":"sha256-tMqMTtcRMcQ7oU82MaDuktq6vvMlvWmO4LrA2oSYDIU="},"flags/1x1/gt-a7ce73eaabe1b659b733691076f8455051951432a1fac682f5896f8c4af6ff69.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2017-08-18T23:12:22+02:00","size":59566,"digest":"a7ce73eaabe1b659b733691076f8455051951432a1fac682f5896f8c4af6ff69","integrity":"sha256-p85z6qvhtlm3M2kQdvhFUFGVFDKh+saC9YlvjEr2/2k="},"flags/4x3/gu-a71a2e02c06f22984e424d15a410d9261ec9ddeeb3df112d5f46b66a09f5bd9a.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2017-08-18T23:12:22+02:00","size":6350,"digest":"a71a2e02c06f22984e424d15a410d9261ec9ddeeb3df112d5f46b66a09f5bd9a","integrity":"sha256-pxouAsBvIphOQk0VpBDZJh7J3e6z3xEtX0a2agn1vZo="},"flags/1x1/gu-2156b3d721b79189d40c7f5b5de9e219f83a40b69e0a3855514a097fcdc2f2d2.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2017-08-18T23:12:22+02:00","size":6066,"digest":"2156b3d721b79189d40c7f5b5de9e219f83a40b69e0a3855514a097fcdc2f2d2","integrity":"sha256-IVaz1yG3kYnUDH9bXeniGfg6QLaeCjhVUUoJf83C8tI="},"flags/4x3/gw-9eba06bd7c024dbd764b1bc1360120ed8a280d59075f81a50994930534cc42f2.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2017-08-18T23:12:22+02:00","size":828,"digest":"9eba06bd7c024dbd764b1bc1360120ed8a280d59075f81a50994930534cc42f2","integrity":"sha256-nroGvXwCTb12SxvBNgEg7YooDVkHX4GlCZSTBTTMQvI="},"flags/1x1/gw-6c4ca99e9871a9cde81966aaf02aac0106e2210f9c64e94bdb5168c7abbbc0e6.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2017-08-18T23:12:22+02:00","size":840,"digest":"6c4ca99e9871a9cde81966aaf02aac0106e2210f9c64e94bdb5168c7abbbc0e6","integrity":"sha256-bEypnphxqc3oGWaq8CqsAQbiIQ+cZOlL21Fox6u7wOY="},"flags/4x3/gy-b6f25e30b463f760ea01c81ff88a3932bf6812e6b626fd7fbe711a4cbac246c6.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2017-08-18T23:12:22+02:00","size":573,"digest":"b6f25e30b463f760ea01c81ff88a3932bf6812e6b626fd7fbe711a4cbac246c6","integrity":"sha256-tvJeMLRj92DqAcgf+Io5Mr9oEua2Jv1/vnEaTLrCRsY="},"flags/1x1/gy-d82b2a81ce6cca3e7c5854a5bc1198224b6455eab7adf06d69822a3cf433a1d2.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2017-08-18T23:12:22+02:00","size":573,"digest":"d82b2a81ce6cca3e7c5854a5bc1198224b6455eab7adf06d69822a3cf433a1d2","integrity":"sha256-2Csqgc5syj58WFSlvBGYIktkVeq3rfBtaYIqPPQzodI="},"flags/4x3/hk-b69c165653e2d112296b963d3369a7d8f656e77432c6c1c5ac1485db077c80a0.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2017-08-18T23:12:22+02:00","size":4540,"digest":"b69c165653e2d112296b963d3369a7d8f656e77432c6c1c5ac1485db077c80a0","integrity":"sha256-tpwWVlPi0RIpa5Y9M2mn2PZW53QyxsHFrBSF2wd8gKA="},"flags/1x1/hk-09c50dc6f3b0d5bffbc85a2998c5c86da531a939cf48c07ddb644061ab0b2222.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2017-08-18T23:12:22+02:00","size":4601,"digest":"09c50dc6f3b0d5bffbc85a2998c5c86da531a939cf48c07ddb644061ab0b2222","integrity":"sha256-CcUNxvOw1b/7yFopmMXIbaUxqTnPSMB922RAYasLIiI="},"flags/4x3/hm-faf74b1cde15843a42becf5d05a373f9af8d867d68c824e80d2c41b48c23ea57.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2017-08-18T23:12:22+02:00","size":1814,"digest":"faf74b1cde15843a42becf5d05a373f9af8d867d68c824e80d2c41b48c23ea57","integrity":"sha256-+vdLHN4VhDpCvs9dBaNz+a+Nhn1oyCToDSxBtIwj6lc="},"flags/1x1/hm-6cc1243d9638246c1bac7e52287dcfc6f9b00d142105fcfc9e8b7b3405d4852f.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2017-08-18T23:12:22+02:00","size":1772,"digest":"6cc1243d9638246c1bac7e52287dcfc6f9b00d142105fcfc9e8b7b3405d4852f","integrity":"sha256-bMEkPZY4JGwbrH5SKH3PxvmwDRQhBfz8not7NAXUhS8="},"flags/4x3/hn-3ad02422915a4ac6a81c3249610cbd42638ebe27d412a2d490bc63e75e1028ea.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2017-08-18T23:12:22+02:00","size":1141,"digest":"3ad02422915a4ac6a81c3249610cbd42638ebe27d412a2d490bc63e75e1028ea","integrity":"sha256-OtAkIpFaSsaoHDJJYQy9QmOOvifUEqLUkLxj514QKOo="},"flags/1x1/hn-f0be4d00b892418864d0e4cd3000ee2dc519dbb96d424cb42f55707f8999d44a.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2017-08-18T23:12:22+02:00","size":1144,"digest":"f0be4d00b892418864d0e4cd3000ee2dc519dbb96d424cb42f55707f8999d44a","integrity":"sha256-8L5NALiSQYhk0OTNMADuLcUZ27ltQky0L1Vwf4mZ1Eo="},"flags/4x3/hr-6671992f1644503121dce7774bf2f7e2ab65da14124251d80b024d78fb34f6f0.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2017-08-18T23:12:22+02:00","size":79805,"digest":"6671992f1644503121dce7774bf2f7e2ab65da14124251d80b024d78fb34f6f0","integrity":"sha256-ZnGZLxZEUDEh3Od3S/L34qtl2hQSQlHYCwJNePs09vA="},"flags/1x1/hr-f086b6932d53408f2b57db5e038dc7b508af60a49670e187eed42714f1115b49.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2017-08-18T23:12:22+02:00","size":80065,"digest":"f086b6932d53408f2b57db5e038dc7b508af60a49670e187eed42714f1115b49","integrity":"sha256-8Ia2ky1TQI8rV9teA43HtQivYKSWcOGH7tQnFPERW0k="},"flags/4x3/ht-0c3452573c61366d1e9d647d61675d2e9a309312e63c649f98d73fe37d2aab4f.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2017-08-18T23:12:22+02:00","size":22536,"digest":"0c3452573c61366d1e9d647d61675d2e9a309312e63c649f98d73fe37d2aab4f","integrity":"sha256-DDRSVzxhNm0enWR9YWddLpowkxLmPGSfmNc/430qq08="},"flags/1x1/ht-80c212d49effab9e944de758c08cc296833bc2a04b3098e8ee58266657522fdc.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2017-08-18T23:12:22+02:00","size":22543,"digest":"80c212d49effab9e944de758c08cc296833bc2a04b3098e8ee58266657522fdc","integrity":"sha256-gMIS1J7/q56UTedYwIzCloM7wqBLMJjo7lgmZldSL9w="},"flags/4x3/hu-b48c8253bec6b4e08f8954a2955fdbc2311d254b51358770d3eaec5fe0875965.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2017-08-18T23:12:22+02:00","size":328,"digest":"b48c8253bec6b4e08f8954a2955fdbc2311d254b51358770d3eaec5fe0875965","integrity":"sha256-tIyCU77GtOCPiVSilV/bwjEdJUtRNYdw0+rsX+CHWWU="},"flags/1x1/hu-af59966ca652f5ba1d081af0c1c2343acb479d1a06e03d248bde266cb29aa931.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2017-08-18T23:12:22+02:00","size":327,"digest":"af59966ca652f5ba1d081af0c1c2343acb479d1a06e03d248bde266cb29aa931","integrity":"sha256-r1mWbKZS9bodCBrwwcI0OstHnRoG4D0ki94mbLKaqTE="},"flags/4x3/id-e02525ae7152d4bd10dcad2ffdf0bf5d08c6c67d3142bc78a7cdbcaf1fcd4a4a.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2017-08-18T23:12:22+02:00","size":264,"digest":"e02525ae7152d4bd10dcad2ffdf0bf5d08c6c67d3142bc78a7cdbcaf1fcd4a4a","integrity":"sha256-4CUlrnFS1L0Q3K0v/fC/XQjGxn0xQrx4p828rx/NSko="},"flags/1x1/id-5b846f6ce4715ea50d4068d9941290229c1be67d619a978096eab2c612e9b297.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2017-08-18T23:12:22+02:00","size":264,"digest":"5b846f6ce4715ea50d4068d9941290229c1be67d619a978096eab2c612e9b297","integrity":"sha256-W4RvbORxXqUNQGjZlBKQIpwb5n1hmpeAluqyxhLpspc="},"flags/4x3/ie-0e75a4c4027484997f14bd4c2529384ef6c621591908473ccbeda20381c05c93.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2017-08-18T23:12:22+02:00","size":333,"digest":"0e75a4c4027484997f14bd4c2529384ef6c621591908473ccbeda20381c05c93","integrity":"sha256-DnWkxAJ0hJl/FL1MJSk4TvbGIVkZCEc8y+2iA4HAXJM="},"flags/1x1/ie-6446113a9abff1feba085706937ff83d73ba310c78153e8da3ca2d6f0c529510.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2017-08-18T23:12:22+02:00","size":329,"digest":"6446113a9abff1feba085706937ff83d73ba310c78153e8da3ca2d6f0c529510","integrity":"sha256-ZEYROpq/8f66CFcGk3/4PXO6MQx4FT6No8otbwxSlRA="},"flags/4x3/il-98c3c0d9628008ac3a947d8f10fcb01d8e2545dfb265e94e6a29910e1ba57a2d.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2017-08-18T23:12:22+02:00","size":1046,"digest":"98c3c0d9628008ac3a947d8f10fcb01d8e2545dfb265e94e6a29910e1ba57a2d","integrity":"sha256-mMPA2WKACKw6lH2PEPywHY4lRd+yZelOaimRDhulei0="},"flags/1x1/il-0f95bc7892bcf9eb3b6af9bf930e803b5121c45fa7261874ab4d7a8542c20c45.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2017-08-18T23:12:22+02:00","size":993,"digest":"0f95bc7892bcf9eb3b6af9bf930e803b5121c45fa7261874ab4d7a8542c20c45","integrity":"sha256-D5W8eJK8+es7avm/kw6AO1EhxF+nJhh0q016hULCDEU="},"flags/4x3/im-0c402e364a705500028c46ccbd78a29944e91103b490607b366ae1d4f221ffc0.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2017-08-18T23:12:22+02:00","size":15257,"digest":"0c402e364a705500028c46ccbd78a29944e91103b490607b366ae1d4f221ffc0","integrity":"sha256-DEAuNkpwVQACjEbMvXiimUTpEQO0kGB7Nmrh1PIh/8A="},"flags/1x1/im-718f45e1c60fd42db2a814bfaaa3a9be828f4dd0e4a4aea49e021f066087dece.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2017-08-18T23:12:22+02:00","size":15596,"digest":"718f45e1c60fd42db2a814bfaaa3a9be828f4dd0e4a4aea49e021f066087dece","integrity":"sha256-cY9F4cYP1C2yqBS/qqOpvoKPTdDkpK6kngIfBmCH3s4="},"flags/4x3/in-a6c958c4b5cb12e2392d81b11dd0fed5fd5d0a66c7decb3ad3c8d27175854d3c.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2017-08-18T23:12:22+02:00","size":1092,"digest":"a6c958c4b5cb12e2392d81b11dd0fed5fd5d0a66c7decb3ad3c8d27175854d3c","integrity":"sha256-pslYxLXLEuI5LYGxHdD+1f1dCmbH3ss608jScXWFTTw="},"flags/1x1/in-b4163420567e8e04fa58b79688af8d7bacf32ddf0e2b63ae2f1c5f0aacaaa696.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2017-08-18T23:12:22+02:00","size":1114,"digest":"b4163420567e8e04fa58b79688af8d7bacf32ddf0e2b63ae2f1c5f0aacaaa696","integrity":"sha256-tBY0IFZ+jgT6WLeWiK+Ne6zzLd8OK2OuLxxfCqyqppY="},"flags/4x3/io-b951cf1fa71ddae941ee31dd018d2593bb8621ff92508bb311c7362c537a474c.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2017-08-18T23:12:22+02:00","size":36459,"digest":"b951cf1fa71ddae941ee31dd018d2593bb8621ff92508bb311c7362c537a474c","integrity":"sha256-uVHPH6cd2ulB7jHdAY0lk7uGIf+SUIuzEcc2LFN6R0w="},"flags/1x1/io-d9dfc871f0bca35430b17de2e55394b0145334aa2080e07856e21d6d2e007d8d.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2017-08-18T23:12:22+02:00","size":36554,"digest":"d9dfc871f0bca35430b17de2e55394b0145334aa2080e07856e21d6d2e007d8d","integrity":"sha256-2d/IcfC8o1QwsX3i5VOUsBRTNKoggOB4VuIdbS4AfY0="},"flags/4x3/iq-6a74e49d2c3d0ff072086fba1a2fc8b948ca34891a3aca960f9daacec107bcc6.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2017-08-18T23:12:22+02:00","size":2305,"digest":"6a74e49d2c3d0ff072086fba1a2fc8b948ca34891a3aca960f9daacec107bcc6","integrity":"sha256-anTknSw9D/ByCG+6Gi/IuUjKNIkaOsqWD52qzsEHvMY="},"flags/1x1/iq-95f5be79b6ab86e6338abd39ef8499af1517dba8ec3b266ea8e3c954601f0bbb.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2017-08-18T23:12:22+02:00","size":2321,"digest":"95f5be79b6ab86e6338abd39ef8499af1517dba8ec3b266ea8e3c954601f0bbb","integrity":"sha256-lfW+ebarhuYzir0574SZrxUX26jsOyZuqOPJVGAfC7s="},"flags/4x3/ir-5f9fdfd2d4cad535338f6de7927cc8094d02eaf06dd5122d3cba9e859c9ec4df.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2017-08-18T23:12:22+02:00","size":21755,"digest":"5f9fdfd2d4cad535338f6de7927cc8094d02eaf06dd5122d3cba9e859c9ec4df","integrity":"sha256-X5/f0tTK1TUzj23nknzICU0C6vBt1RItPLqehZyexN8="},"flags/1x1/ir-f5367274525b1f050dfae895943620a2e711f63a5726b273b488721a4501465d.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2017-08-18T23:12:22+02:00","size":21479,"digest":"f5367274525b1f050dfae895943620a2e711f63a5726b273b488721a4501465d","integrity":"sha256-9TZydFJbHwUN+uiVlDYgoucR9jpXJrJztIhyGkUBRl0="},"flags/4x3/is-15409efb6cec16b490b4abbbc03db415ef3448cb8cb281dd7cd1b2ba496d534d.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2017-08-18T23:12:22+02:00","size":562,"digest":"15409efb6cec16b490b4abbbc03db415ef3448cb8cb281dd7cd1b2ba496d534d","integrity":"sha256-FUCe+2zsFrSQtKu7wD20Fe80SMuMsoHdfNGyukltU00="},"flags/1x1/is-500c3ef83fe917ab9cad59b7e8e6d693d9e78876febc1882c4bb06c8876b7357.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2017-08-18T23:12:22+02:00","size":543,"digest":"500c3ef83fe917ab9cad59b7e8e6d693d9e78876febc1882c4bb06c8876b7357","integrity":"sha256-UAw++D/pF6ucrVm36ObWk9nniHb+vBiCxLsGyIdrc1c="},"flags/4x3/it-a285a0e341ba9492a2b7478e8a7a13f7c76d3c6a581aafb965ea26e1c554f0f3.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2017-08-18T23:12:22+02:00","size":329,"digest":"a285a0e341ba9492a2b7478e8a7a13f7c76d3c6a581aafb965ea26e1c554f0f3","integrity":"sha256-ooWg40G6lJKit0eOinoT98dtPGpYGq+5Zeom4cVU8PM="},"flags/1x1/it-eeb47e346a5f6124b34f8428c97fc7dab2726f8d36d62dec08df3ec7171353cd.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"eeb47e346a5f6124b34f8428c97fc7dab2726f8d36d62dec08df3ec7171353cd","integrity":"sha256-7rR+NGpfYSSzT4QoyX/H2rJyb4021i3sCN8+xxcTU80="},"flags/4x3/je-b611f3e0fb7a94f85fa7d5f6f7a7db839381d054eb92abe0856dda8218c40687.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2017-08-18T23:12:22+02:00","size":7509,"digest":"b611f3e0fb7a94f85fa7d5f6f7a7db839381d054eb92abe0856dda8218c40687","integrity":"sha256-thHz4Pt6lPhfp9X296fbg5OB0FTrkqvghW3aghjEBoc="},"flags/1x1/je-39c0c1482c1c533366153edc873f5eae266fdbf591e2022a7f82c17ce2d676ef.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2017-08-18T23:12:22+02:00","size":7477,"digest":"39c0c1482c1c533366153edc873f5eae266fdbf591e2022a7f82c17ce2d676ef","integrity":"sha256-OcDBSCwcUzNmFT7chz9eriZv2/WR4gIqf4LBfOLWdu8="},"flags/4x3/jm-62fcbb8ed5b923b6aafe3990a24ad571485b4ac8db1bd7ed7b200cfadeeb8d7f.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2017-08-18T23:12:22+02:00","size":417,"digest":"62fcbb8ed5b923b6aafe3990a24ad571485b4ac8db1bd7ed7b200cfadeeb8d7f","integrity":"sha256-Yvy7jtW5I7aq/jmQokrVcUhbSsjbG9fteyAM+t7rjX8="},"flags/1x1/jm-b57cb61fb8eb67f0887afb7c779d6033e1c4c10242662093df69496aa58cc464.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2017-08-18T23:12:22+02:00","size":488,"digest":"b57cb61fb8eb67f0887afb7c779d6033e1c4c10242662093df69496aa58cc464","integrity":"sha256-tXy2H7jrZ/CIevt8d51gM+HEwQJCZiCT32lJaqWMxGQ="},"flags/4x3/jo-8e1174e66beeec19016b2754e8bdae987f420fa937ba78efecd61c177d9d40dc.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2017-08-18T23:12:22+02:00","size":835,"digest":"8e1174e66beeec19016b2754e8bdae987f420fa937ba78efecd61c177d9d40dc","integrity":"sha256-jhF05mvu7BkBaydU6L2umH9CD6k3unjv7NYcF32dQNw="},"flags/1x1/jo-47d2fc18e8af9194bcb249161a10383f89c11a73148b6dc77f4ab47a90294ae1.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2017-08-18T23:12:22+02:00","size":767,"digest":"47d2fc18e8af9194bcb249161a10383f89c11a73148b6dc77f4ab47a90294ae1","integrity":"sha256-R9L8GOivkZS8skkWGhA4P4nBGnMUi23Hf0q0epApSuE="},"flags/4x3/jp-1785964f1f3a4346ab8e1cbdc211399c5ced34a566c4725f3d23e8105413d6f4.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2017-08-18T23:12:22+02:00","size":513,"digest":"1785964f1f3a4346ab8e1cbdc211399c5ced34a566c4725f3d23e8105413d6f4","integrity":"sha256-F4WWTx86Q0arjhy9whE5nFztNKVmxHJfPSPoEFQT1vQ="},"flags/1x1/jp-a71cace9d237527635ee960b4df645f202d630c46458cf7e7a7ac09659e4404f.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2017-08-18T23:12:22+02:00","size":526,"digest":"a71cace9d237527635ee960b4df645f202d630c46458cf7e7a7ac09659e4404f","integrity":"sha256-pxys6dI3UnY17pYLTfZF8gLWMMRkWM9+enrAllnkQE8="},"flags/4x3/ke-680e981e37f7f0497e148043390987748a5bc78f4c3af09cf58c61d42b2a4a24.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2017-08-18T23:12:22+02:00","size":1432,"digest":"680e981e37f7f0497e148043390987748a5bc78f4c3af09cf58c61d42b2a4a24","integrity":"sha256-aA6YHjf38El+FIBDOQmHdIpbx49MOvCc9Yxh1CsqSiQ="},"flags/1x1/ke-60ff7f8bf6b5da9182867b8200475cb0a87f80cc960643ee15c99bcdcf200654.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2017-08-18T23:12:22+02:00","size":1570,"digest":"60ff7f8bf6b5da9182867b8200475cb0a87f80cc960643ee15c99bcdcf200654","integrity":"sha256-YP9/i/a12pGChnuCAEdcsKh/gMyWBkPuFcmbzc8gBlQ="},"flags/4x3/kg-3a93d17f0ed778664ae760032710fd7235bc43090de3543ec50fb8d2dfd9b595.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2017-08-18T23:12:22+02:00","size":5088,"digest":"3a93d17f0ed778664ae760032710fd7235bc43090de3543ec50fb8d2dfd9b595","integrity":"sha256-OpPRfw7XeGZK52ADJxD9cjW8QwkN41Q+xQ+40t/ZtZU="},"flags/1x1/kg-165c50f348fe0d4d8f0bc9cbf2666acde0f3a81dfed3398b8a7db5a51e3348aa.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2017-08-18T23:12:22+02:00","size":5012,"digest":"165c50f348fe0d4d8f0bc9cbf2666acde0f3a81dfed3398b8a7db5a51e3348aa","integrity":"sha256-FlxQ80j+DU2PC8nL8mZqzeDzqB3+0zmLin21pR4zSKo="},"flags/4x3/kh-6f3eb3cb44cd8124f4b7cb0d9230ddab4f782ad10746c2e1fa73f54ca2fe4446.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2017-08-18T23:12:22+02:00","size":10798,"digest":"6f3eb3cb44cd8124f4b7cb0d9230ddab4f782ad10746c2e1fa73f54ca2fe4446","integrity":"sha256-bz6zy0TNgST0t8sNkjDdq094KtEHRsLh+nP1TKL+REY="},"flags/1x1/kh-9541bd094c9e79e8ebb77a8ba94b22ed079b0502b2d70769b89ac9d19d16781b.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2017-08-18T23:12:22+02:00","size":10800,"digest":"9541bd094c9e79e8ebb77a8ba94b22ed079b0502b2d70769b89ac9d19d16781b","integrity":"sha256-lUG9CUyeeejrt3qLqUsi7QebBQKy1wdpuJrJ0Z0WeBs="},"flags/4x3/ki-a1b39a59ce5be52e1c6ca618ccc97f47d2a7b0d652bc2e5814c30a13d03842b8.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2017-08-18T23:12:22+02:00","size":7537,"digest":"a1b39a59ce5be52e1c6ca618ccc97f47d2a7b0d652bc2e5814c30a13d03842b8","integrity":"sha256-obOaWc5b5S4cbKYYzMl/R9KnsNZSvC5YFMMKE9A4Qrg="},"flags/1x1/ki-e9e5127171d893619b247b605865507b61019dee9e6ea589c5cd0c0e7d513f22.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2017-08-18T23:12:22+02:00","size":7920,"digest":"e9e5127171d893619b247b605865507b61019dee9e6ea589c5cd0c0e7d513f22","integrity":"sha256-6eUScXHYk2GbJHtgWGVQe2EBne6ebqWJxc0MDn1RPyI="},"flags/4x3/km-2ad8132e636de92218e06cad237154128fd1e84dbed82610e138ea148a53c01a.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2017-08-18T23:12:22+02:00","size":1297,"digest":"2ad8132e636de92218e06cad237154128fd1e84dbed82610e138ea148a53c01a","integrity":"sha256-KtgTLmNt6SIY4GytI3FUEo/R6E2+2CYQ4TjqFIpTwBo="},"flags/1x1/km-d9d978cca1790b3165a0d18e159a536b4a2405f12b0200b03cf721042d326089.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2017-08-18T23:12:22+02:00","size":1244,"digest":"d9d978cca1790b3165a0d18e159a536b4a2405f12b0200b03cf721042d326089","integrity":"sha256-2dl4zKF5CzFloNGOFZpTa0okBfErAgCwPPchBC0yYIk="},"flags/4x3/kn-08b7f26ac06f65c797de647f61bb738a4212cfc9ceb53ef11d8db093b58386d1.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2017-08-18T23:12:22+02:00","size":968,"digest":"08b7f26ac06f65c797de647f61bb738a4212cfc9ceb53ef11d8db093b58386d1","integrity":"sha256-CLfyasBvZceX3mR/YbtzikISz8nOtT7xHY2wk7WDhtE="},"flags/1x1/kn-e632854084c163a1752b53117eb4f773e57eef231917db846fc8009541cfe4b9.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2017-08-18T23:12:22+02:00","size":957,"digest":"e632854084c163a1752b53117eb4f773e57eef231917db846fc8009541cfe4b9","integrity":"sha256-5jKFQITBY6F1K1MRfrT3c+V+7yMZF9uEb8gAlUHP5Lk="},"flags/4x3/kp-f073e224e1faff5a0bbcb51cd05288d1b13cb607dda42fc7702afe8cfb01d0b3.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2017-08-18T23:12:22+02:00","size":1002,"digest":"f073e224e1faff5a0bbcb51cd05288d1b13cb607dda42fc7702afe8cfb01d0b3","integrity":"sha256-8HPiJOH6/1oLvLUc0FKI0bE8tgfdpC/HcCr+jPsB0LM="},"flags/1x1/kp-504fc83119f2a2c34ac75051d3ce15edee6f93555d729d759ef15f5f5caab3d3.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2017-08-18T23:12:22+02:00","size":1002,"digest":"504fc83119f2a2c34ac75051d3ce15edee6f93555d729d759ef15f5f5caab3d3","integrity":"sha256-UE/IMRnyosNKx1BR084V7e5vk1Vdcp11nvFfX1yqs9M="},"flags/4x3/kr-dbe4354aefeb100e561ee6f6ea6cc46551c1722d1b75fc164b60b0592d9dc30d.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2017-08-18T23:12:22+02:00","size":2420,"digest":"dbe4354aefeb100e561ee6f6ea6cc46551c1722d1b75fc164b60b0592d9dc30d","integrity":"sha256-2+Q1Su/rEA5WHub26mzEZVHBci0bdfwWS2CwWS2dww0="},"flags/1x1/kr-3aefdef6c6b72177aea924981a673bcc58c24b8c98cb00960e23250c07766b63.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2017-08-18T23:12:22+02:00","size":2194,"digest":"3aefdef6c6b72177aea924981a673bcc58c24b8c98cb00960e23250c07766b63","integrity":"sha256-Ou/e9sa3IXeuqSSYGmc7zFjCS4yYywCWDiMlDAd2a2M="},"flags/4x3/kw-fc682de5f565e3a918a9cce44a87a0cd8a40b93a555be3dc7c381ced74853021.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2017-08-18T23:12:22+02:00","size":515,"digest":"fc682de5f565e3a918a9cce44a87a0cd8a40b93a555be3dc7c381ced74853021","integrity":"sha256-/Ggt5fVl46kYqczkSoegzYpAuTpVW+PcfDgc7XSFMCE="},"flags/1x1/kw-63c2078d09713c30c0b917fdaac63a1fdb9161ec4b8cf1e91d4a9a8730a5cb65.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2017-08-18T23:12:22+02:00","size":529,"digest":"63c2078d09713c30c0b917fdaac63a1fdb9161ec4b8cf1e91d4a9a8730a5cb65","integrity":"sha256-Y8IHjQlxPDDAuRf9qsY6H9uRYexLjPHpHUqahzCly2U="},"flags/4x3/ky-77da018be33fa8aec69147e6107ff363bfc467ba857e7d47bd383984305cebab.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2017-08-18T23:12:22+02:00","size":33338,"digest":"77da018be33fa8aec69147e6107ff363bfc467ba857e7d47bd383984305cebab","integrity":"sha256-d9oBi+M/qK7GkUfmEH/zY7/EZ7qFfn1HvTg5hDBc66s="},"flags/1x1/ky-4a6b098e38d727959969a977668aefbdf6b9adcaef4cd922aac232d64a8a9d75.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2017-08-18T23:12:22+02:00","size":33549,"digest":"4a6b098e38d727959969a977668aefbdf6b9adcaef4cd922aac232d64a8a9d75","integrity":"sha256-SmsJjjjXJ5WZaal3Zorvvfa5rcrvTNkiqsIy1kqKnXU="},"flags/4x3/kz-ce3998065f1b6242d0a1755ffb590f15b2ff477b594b26b9a497f7181304bbe3.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2017-08-18T23:12:22+02:00","size":17502,"digest":"ce3998065f1b6242d0a1755ffb590f15b2ff477b594b26b9a497f7181304bbe3","integrity":"sha256-zjmYBl8bYkLQoXVf+1kPFbL/R3tZSya5pJf3GBMEu+M="},"flags/1x1/kz-795fd9bf32b68805f9e80f120db569eacbd5727fc523d7ff89943bdf9ef5b1e9.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2017-08-18T23:12:22+02:00","size":17476,"digest":"795fd9bf32b68805f9e80f120db569eacbd5727fc523d7ff89943bdf9ef5b1e9","integrity":"sha256-eV/ZvzK2iAX56A8SDbVp6svVcn/FI9f/iZQ73571sek="},"flags/4x3/la-dd2ead7123a2c4d2fda71d8a462319d30c6ff8e83c72cfd888230f6a670fdff4.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2017-08-18T23:12:22+02:00","size":477,"digest":"dd2ead7123a2c4d2fda71d8a462319d30c6ff8e83c72cfd888230f6a670fdff4","integrity":"sha256-3S6tcSOixNL9px2KRiMZ0wxv+Og8cs/YiCMPamcP3/Q="},"flags/1x1/la-7ebc9f64aad0049a8167272ce06a7c1512c7d14080ff93a88e6b28e4050f33d3.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2017-08-18T23:12:22+02:00","size":604,"digest":"7ebc9f64aad0049a8167272ce06a7c1512c7d14080ff93a88e6b28e4050f33d3","integrity":"sha256-fryfZKrQBJqBZycs4Gp8FRLH0UCA/5Oojmso5AUPM9M="},"flags/4x3/lb-7afb0e27b8cec77e2c65c3467b68ab24d49879a4739ab4780154a7db4358f6fc.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2017-08-18T23:12:22+02:00","size":3981,"digest":"7afb0e27b8cec77e2c65c3467b68ab24d49879a4739ab4780154a7db4358f6fc","integrity":"sha256-evsOJ7jOx34sZcNGe2irJNSYeaRzmrR4AVSn20NY9vw="},"flags/1x1/lb-6f50829425260779f08ad80ac9430796e64901b0dd74d010bdf2336f541eb47d.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2017-08-18T23:12:22+02:00","size":3991,"digest":"6f50829425260779f08ad80ac9430796e64901b0dd74d010bdf2336f541eb47d","integrity":"sha256-b1CClCUmB3nwitgKyUMHluZJAbDddNAQvfIzb1QetH0="},"flags/4x3/lc-9efcb3c88f9ff13bedcbd0c7f48c7fab604d3842ee559be3a11c6bc64e31a53c.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2017-08-18T23:12:22+02:00","size":403,"digest":"9efcb3c88f9ff13bedcbd0c7f48c7fab604d3842ee559be3a11c6bc64e31a53c","integrity":"sha256-nvyzyI+f8Tvty9DH9Ix/q2BNOELuVZvjoRxrxk4xpTw="},"flags/1x1/lc-31d72d1034bf031934561da9615fc3db916bb08a210f434a981e053a7edfa339.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2017-08-18T23:12:22+02:00","size":409,"digest":"31d72d1034bf031934561da9615fc3db916bb08a210f434a981e053a7edfa339","integrity":"sha256-MdctEDS/Axk0Vh2pYV/D25FrsIohD0NKmB4FOn7fozk="},"flags/4x3/li-9eed98d7d4e07cba0a2aae80e31add4bbe663e959df8cafd607cef17daf4351a.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2017-08-18T23:12:22+02:00","size":12453,"digest":"9eed98d7d4e07cba0a2aae80e31add4bbe663e959df8cafd607cef17daf4351a","integrity":"sha256-nu2Y19TgfLoKKq6A4xrdS75mPpWd+Mr9YHzvF9r0NRo="},"flags/1x1/li-f655bf461c1690078c846528eb6d3ebe8d594b2539e3cc37f89204a754424c81.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2017-08-18T23:12:22+02:00","size":12476,"digest":"f655bf461c1690078c846528eb6d3ebe8d594b2539e3cc37f89204a754424c81","integrity":"sha256-9lW/RhwWkAeMhGUo620+vo1ZSyU548w3+JIEp1RCTIE="},"flags/4x3/lk-3471b0585fb1e0ee350d6fe87e55ef07eef01e99444263b86ff005156dea1b73.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2017-08-18T23:12:22+02:00","size":17549,"digest":"3471b0585fb1e0ee350d6fe87e55ef07eef01e99444263b86ff005156dea1b73","integrity":"sha256-NHGwWF+x4O41DW/oflXvB+7wHplEQmO4b/AFFW3qG3M="},"flags/1x1/lk-d3bb56415e6e2095a470cf4e2ed455c57cde204aa79362786aca785db35ecff8.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2017-08-18T23:12:22+02:00","size":17573,"digest":"d3bb56415e6e2095a470cf4e2ed455c57cde204aa79362786aca785db35ecff8","integrity":"sha256-07tWQV5uIJWkcM9OLtRVxXzeIEqnk2J4asp4XbNez/g="},"flags/4x3/lr-a39f30a6169c4a3f3ff8e0eb04862e7f941c5d7c8e489ff5e7e4cd8cd436f5e2.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2017-08-18T23:12:22+02:00","size":829,"digest":"a39f30a6169c4a3f3ff8e0eb04862e7f941c5d7c8e489ff5e7e4cd8cd436f5e2","integrity":"sha256-o58wphacSj8/+ODrBIYuf5QcXXyOSJ/15+TNjNQ29eI="},"flags/1x1/lr-731191ad65bf784386cabac12693722d16aeb2e97d6456cc33488f805067aca8.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2017-08-18T23:12:22+02:00","size":801,"digest":"731191ad65bf784386cabac12693722d16aeb2e97d6456cc33488f805067aca8","integrity":"sha256-cxGRrWW/eEOGyrrBJpNyLRausul9ZFbMM0iPgFBnrKg="},"flags/4x3/ls-1e4f7ec2600e30b515cd12b509c376c3014d760731d89f87ae9a962fe249b3d4.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2017-08-18T23:12:22+02:00","size":1901,"digest":"1e4f7ec2600e30b515cd12b509c376c3014d760731d89f87ae9a962fe249b3d4","integrity":"sha256-Hk9+wmAOMLUVzRK1CcN2wwFNdgcx2J+HrpqWL+JJs9Q="},"flags/1x1/ls-ba2a8327ab9b0e74f4f411ab989980cde309e86395736a1f77e17a0eefc85266.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2017-08-18T23:12:22+02:00","size":1919,"digest":"ba2a8327ab9b0e74f4f411ab989980cde309e86395736a1f77e17a0eefc85266","integrity":"sha256-uiqDJ6ubDnT09BGrmJmAzeMJ6GOVc2ofd+F6Du/IUmY="},"flags/4x3/lt-d6a367644254244a8219c2eaa525b43d261f5da4fb074b0e08cedeb343f737a1.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2017-08-18T23:12:22+02:00","size":489,"digest":"d6a367644254244a8219c2eaa525b43d261f5da4fb074b0e08cedeb343f737a1","integrity":"sha256-1qNnZEJUJEqCGcLqpSW0PSYfXaT7B0sOCM7es0P3N6E="},"flags/1x1/lt-933670ec7627a78f72b60cfe7f49cd09b4afa58fb341857f76a5b7b612c12c97.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2017-08-18T23:12:22+02:00","size":489,"digest":"933670ec7627a78f72b60cfe7f49cd09b4afa58fb341857f76a5b7b612c12c97","integrity":"sha256-kzZw7HYnp49ytgz+f0nNCbSvpY+zQYV/dqW3thLBLJc="},"flags/4x3/lu-949c9e81217b58fe622d4d4d00903499b3e2249aa3f688401b78bd3ad977c740.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2017-08-18T23:12:22+02:00","size":268,"digest":"949c9e81217b58fe622d4d4d00903499b3e2249aa3f688401b78bd3ad977c740","integrity":"sha256-lJyegSF7WP5iLU1NAJA0mbPiJJqj9ohAG3i9Otl3x0A="},"flags/1x1/lu-ab39ab3ddef396fcd816d4170f3f73ed89465ed37a180685c68b3833aa3f01a9.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2017-08-18T23:12:22+02:00","size":254,"digest":"ab39ab3ddef396fcd816d4170f3f73ed89465ed37a180685c68b3833aa3f01a9","integrity":"sha256-qzmrPd7zlvzYFtQXDz9z7YlGXtN6GAaFxos4M6o/Aak="},"flags/4x3/lv-b672e3ee7e344abaaf9128111a6543ad7897aa92084b74c42a2877aa1b8cf7a8.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2017-08-18T23:12:22+02:00","size":252,"digest":"b672e3ee7e344abaaf9128111a6543ad7897aa92084b74c42a2877aa1b8cf7a8","integrity":"sha256-tnLj7n40SrqvkSgRGmVDrXiXqpIIS3TEKih3qhuM96g="},"flags/1x1/lv-55fc46607d153eb1d40d1b478ab6448117b79cdc3d9d973ea2beb44ee4d77316.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2017-08-18T23:12:22+02:00","size":264,"digest":"55fc46607d153eb1d40d1b478ab6448117b79cdc3d9d973ea2beb44ee4d77316","integrity":"sha256-VfxGYH0VPrHUDRtHirZEgRe3nNw9nZc+or60TuTXcxY="},"flags/4x3/ly-6f996771734c3f63c65d925a3d991f7d238734cc10e56b3160841fac2939e21a.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2017-08-18T23:12:22+02:00","size":537,"digest":"6f996771734c3f63c65d925a3d991f7d238734cc10e56b3160841fac2939e21a","integrity":"sha256-b5lncXNMP2PGXZJaPZkffSOHNMwQ5WsxYIQfrCk54ho="},"flags/1x1/ly-4e0bf9ff6856dcbba708b4fb176abd44cd385274badbb6e609b596a660109191.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2017-08-18T23:12:22+02:00","size":535,"digest":"4e0bf9ff6856dcbba708b4fb176abd44cd385274badbb6e609b596a660109191","integrity":"sha256-Tgv5/2hW3LunCLT7F2q9RM04UnS627bmCbWWpmAQkZE="},"flags/4x3/ma-70b305040cec175c749a22e6d1e0c1c96bd2164768f208a34d6c8a7ed5caa0ae.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2017-08-18T23:12:22+02:00","size":284,"digest":"70b305040cec175c749a22e6d1e0c1c96bd2164768f208a34d6c8a7ed5caa0ae","integrity":"sha256-cLMFBAzsF1x0miLm0eDByWvSFkdo8gijTWyKftXKoK4="},"flags/1x1/ma-919d8fa71ed3a3cadabade682f5326334f11d659245d51b31b40880689cbe275.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2017-08-18T23:12:22+02:00","size":282,"digest":"919d8fa71ed3a3cadabade682f5326334f11d659245d51b31b40880689cbe275","integrity":"sha256-kZ2Ppx7To8raut5oL1MmM08R1lkkXVGzG0CIBonL4nU="},"flags/4x3/mc-f0bd30faa57995276026f00e97f6d4ffd3c151e6d2c3d440331ac739965f3bc9.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2017-08-18T23:12:22+02:00","size":240,"digest":"f0bd30faa57995276026f00e97f6d4ffd3c151e6d2c3d440331ac739965f3bc9","integrity":"sha256-8L0w+qV5lSdgJvAOl/bU/9PBUebSw9RAMxrHOZZfO8k="},"flags/1x1/mc-6fcd8ec0404ec1e02e8f38934202004b443c39ffa369be045872c4c89b0674b3.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2017-08-18T23:12:22+02:00","size":260,"digest":"6fcd8ec0404ec1e02e8f38934202004b443c39ffa369be045872c4c89b0674b3","integrity":"sha256-b82OwEBOweAujziTQgIAS0Q8Of+jab4EWHLEyJsGdLM="},"flags/4x3/md-4bb12bafd1cae33ea4d420dc80301e573d39247323d0eca7c343650a414931ad.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2017-08-18T23:12:22+02:00","size":14670,"digest":"4bb12bafd1cae33ea4d420dc80301e573d39247323d0eca7c343650a414931ad","integrity":"sha256-S7Err9HK4z6k1CDcgDAeVz05JHMj0Oynw0NlCkFJMa0="},"flags/1x1/md-76e3c791e11574492239b07821b43d8f5308e8b7b9ed7d72a5b189f06bb0a81d.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2017-08-18T23:12:22+02:00","size":14809,"digest":"76e3c791e11574492239b07821b43d8f5308e8b7b9ed7d72a5b189f06bb0a81d","integrity":"sha256-duPHkeEVdEkiObB4IbQ9j1MI6Le57X1ypbGJ8GuwqB0="},"flags/4x3/me-096ce4c309762cde78cb1fec7f1d9ab7c38e6270ddb5aaaf9d29ec63a160e276.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2017-08-18T23:12:22+02:00","size":110221,"digest":"096ce4c309762cde78cb1fec7f1d9ab7c38e6270ddb5aaaf9d29ec63a160e276","integrity":"sha256-CWzkwwl2LN54yx/sfx2at8OOYnDdtaqvnSnsY6Fg4nY="},"flags/1x1/me-9f8dc8f8e7b38bfc2edd5a35d13818544d304c7834a315ffbfcccecf7a9e6ba6.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2017-08-18T23:12:22+02:00","size":108220,"digest":"9f8dc8f8e7b38bfc2edd5a35d13818544d304c7834a315ffbfcccecf7a9e6ba6","integrity":"sha256-n43I+Oezi/wu3Vo10TgYVE0wTHg0oxX/v8zOz3qea6Y="},"flags/4x3/mf-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2017-08-18T23:12:22+02:00","size":313,"digest":"4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702","integrity":"sha256-ToxEbgMlcqLnTR/czsmjrpPWbcJJUu0vH+W9q2/vVwI="},"flags/1x1/mf-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/mg-f8afb0a551765b27b0c173a623e30af523e907e665858c401e8246b2fa5c2052.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2017-08-18T23:12:22+02:00","size":322,"digest":"f8afb0a551765b27b0c173a623e30af523e907e665858c401e8246b2fa5c2052","integrity":"sha256-+K+wpVF2WyewwXOmI+MK9SPpB+ZlhYxAHoJGsvpcIFI="},"flags/1x1/mg-d5527653deeb8cd3c7d24082dab7c9dcd8218dd9c9043c832cb1436f1d8090ae.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2017-08-18T23:12:22+02:00","size":349,"digest":"d5527653deeb8cd3c7d24082dab7c9dcd8218dd9c9043c832cb1436f1d8090ae","integrity":"sha256-1VJ2U97rjNPH0kCC2rfJ3NghjdnJBDyDLLFDbx2AkK4="},"flags/4x3/mh-4edc79226b41a72a4f0a8ca6d4f7f8f73e92972ae6b30c96a9dab4274a046165.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2017-08-18T23:12:22+02:00","size":1008,"digest":"4edc79226b41a72a4f0a8ca6d4f7f8f73e92972ae6b30c96a9dab4274a046165","integrity":"sha256-Ttx5ImtBpypPCoym1Pf49z6SlyrmswyWqdq0J0oEYWU="},"flags/1x1/mh-1bd8a38684a5d55aea8319d106fdc1e62a91424e36a8fb5a27f215cfadb98707.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2017-08-18T23:12:22+02:00","size":1017,"digest":"1bd8a38684a5d55aea8319d106fdc1e62a91424e36a8fb5a27f215cfadb98707","integrity":"sha256-G9ijhoSl1VrqgxnRBv3B5iqRQk42qPtaJ/IVz625hwc="},"flags/4x3/mk-2098f24dab54b22fbc7aff34c15009b4ae7012a6848cede09d6db9ed5caaffec.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2017-08-18T23:12:22+02:00","size":395,"digest":"2098f24dab54b22fbc7aff34c15009b4ae7012a6848cede09d6db9ed5caaffec","integrity":"sha256-IJjyTatUsi+8ev80wVAJtK5wEqaEjO3gnW257Vyq/+w="},"flags/1x1/mk-1b083e708a18b40383921595134b167e0fa84a6f233934668481b902b518f089.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2017-08-18T23:12:22+02:00","size":423,"digest":"1b083e708a18b40383921595134b167e0fa84a6f233934668481b902b518f089","integrity":"sha256-Gwg+cIoYtAODkhWVE0sWfg+oSm8jOTRmhIG5ArUY8Ik="},"flags/4x3/ml-5cb117165c5ebebb07725430dce0fbd0bce2ad618967354eda44d9229e16c676.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2017-08-18T23:12:22+02:00","size":342,"digest":"5cb117165c5ebebb07725430dce0fbd0bce2ad618967354eda44d9229e16c676","integrity":"sha256-XLEXFlxevrsHclQw3OD70LzirWGJZzVO2kTZIp4WxnY="},"flags/1x1/ml-cf94ba5bc9f5b9f3b15c187243a5fc60dd80a43715da7ae005dc13321f0d411b.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2017-08-18T23:12:22+02:00","size":299,"digest":"cf94ba5bc9f5b9f3b15c187243a5fc60dd80a43715da7ae005dc13321f0d411b","integrity":"sha256-z5S6W8n1ufOxXBhyQ6X8YN2ApDcV2nrgBdwTMh8NQRs="},"flags/4x3/mm-987d96563a6517ba568b2ad3e8dbcd77c01c0a6114b8497b214cf3e967ce27d1.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2017-08-18T23:12:22+02:00","size":996,"digest":"987d96563a6517ba568b2ad3e8dbcd77c01c0a6114b8497b214cf3e967ce27d1","integrity":"sha256-mH2WVjplF7pWiyrT6NvNd8AcCmEUuEl7IUzz6WfOJ9E="},"flags/1x1/mm-a78cffaf229320ef1cc28570ec3e91e9e188d8cff8cc01f14423b9c5383e87d2.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2017-08-18T23:12:22+02:00","size":1015,"digest":"a78cffaf229320ef1cc28570ec3e91e9e188d8cff8cc01f14423b9c5383e87d2","integrity":"sha256-p4z/ryKTIO8cwoVw7D6R6eGI2M/4zAHxRCO5xTg+h9I="},"flags/4x3/mn-a3dc85a21b868793f084dd954c31e13c0cf993eef59102a102406c95d99e243d.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2017-08-18T23:12:22+02:00","size":1601,"digest":"a3dc85a21b868793f084dd954c31e13c0cf993eef59102a102406c95d99e243d","integrity":"sha256-o9yFohuGh5PwhN2VTDHhPAz5k+71kQKhAkBsldmeJD0="},"flags/1x1/mn-141a15f289b3e49d8e0c1a21b9015f14ebb9e55660ebc23deefa55a3fa6fc9b5.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2017-08-18T23:12:22+02:00","size":1603,"digest":"141a15f289b3e49d8e0c1a21b9015f14ebb9e55660ebc23deefa55a3fa6fc9b5","integrity":"sha256-FBoV8omz5J2ODBohuQFfFOu55VZg68I97vpVo/pvybU="},"flags/4x3/mo-f58284a9e6021d88f7756d6cbe408f79789a30113084ef6bbd8541e15008d684.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2017-08-18T23:12:22+02:00","size":2047,"digest":"f58284a9e6021d88f7756d6cbe408f79789a30113084ef6bbd8541e15008d684","integrity":"sha256-9YKEqeYCHYj3dW1svkCPeXiaMBEwhO9rvYVB4VAI1oQ="},"flags/1x1/mo-b871b2e0087b09318060384476b25c28de16acac946f5ecbb4e162660e6486c1.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2017-08-18T23:12:22+02:00","size":2082,"digest":"b871b2e0087b09318060384476b25c28de16acac946f5ecbb4e162660e6486c1","integrity":"sha256-uHGy4Ah7CTGAYDhEdrJcKN4WrKyUb17LtOFiZg5khsE="},"flags/4x3/mp-d9f8b726babd7cba9e128eb81ce7e7d9adb81945f056072aaa3b5540c8299f9d.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2017-08-18T23:12:22+02:00","size":34391,"digest":"d9f8b726babd7cba9e128eb81ce7e7d9adb81945f056072aaa3b5540c8299f9d","integrity":"sha256-2fi3Jrq9fLqeEo64HOfn2a24GUXwVgcqqjtVQMgpn50="},"flags/1x1/mp-41d27c2d802f8487a3343a962c11711e9ebf682bda766cceb72ccac2b37dbda0.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2017-08-18T23:12:22+02:00","size":34062,"digest":"41d27c2d802f8487a3343a962c11711e9ebf682bda766cceb72ccac2b37dbda0","integrity":"sha256-QdJ8LYAvhIejNDqWLBFxHp6/aCvadmzOtyzKwrN9vaA="},"flags/4x3/mq-21e70a8c243dc97f486dadf01f0b3300a8310c719d5a650fe4d7512e7ee8169d.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2017-08-18T23:12:22+02:00","size":310,"digest":"21e70a8c243dc97f486dadf01f0b3300a8310c719d5a650fe4d7512e7ee8169d","integrity":"sha256-IecKjCQ9yX9Iba3wHwszAKgxDHGdWmUP5NdRLn7oFp0="},"flags/1x1/mq-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/mr-76898913a879ac1eadb03f5950843ea63fd9a0a998d1b9113c386012cf1c80e6.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2017-08-18T23:12:22+02:00","size":935,"digest":"76898913a879ac1eadb03f5950843ea63fd9a0a998d1b9113c386012cf1c80e6","integrity":"sha256-domJE6h5rB6tsD9ZUIQ+pj/ZoKmY0bkRPDhgEs8cgOY="},"flags/1x1/mr-5288f91d4c12b6fdca7129a8564638991028f730a170bb72be9fee1ac8d8f206.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2017-08-18T23:12:22+02:00","size":969,"digest":"5288f91d4c12b6fdca7129a8564638991028f730a170bb72be9fee1ac8d8f206","integrity":"sha256-Uoj5HUwStv3KcSmoVkY4mRAo9zChcLtyvp/uGsjY8gY="},"flags/4x3/ms-add4964ba7fa5a4440d40902dabd49345476d13ddf6e20e7b06834ab30721b79.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2017-08-18T23:12:22+02:00","size":8602,"digest":"add4964ba7fa5a4440d40902dabd49345476d13ddf6e20e7b06834ab30721b79","integrity":"sha256-rdSWS6f6WkRA1AkC2r1JNFR20T3fbiDnsGg0qzByG3k="},"flags/1x1/ms-47f49520f4ba965587509e45980be0ef29792830738cdae717e52616a11bc00b.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2017-08-18T23:12:22+02:00","size":8574,"digest":"47f49520f4ba965587509e45980be0ef29792830738cdae717e52616a11bc00b","integrity":"sha256-R/SVIPS6llWHUJ5FmAvg7yl5KDBzjNrnF+UmFqEbwAs="},"flags/4x3/mt-55b5c69335d7e2691e50443b34fc5b708309c99326fea6233dd3575c3402043a.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2017-08-18T23:12:22+02:00","size":13407,"digest":"55b5c69335d7e2691e50443b34fc5b708309c99326fea6233dd3575c3402043a","integrity":"sha256-VbXGkzXX4mkeUEQ7NPxbcIMJyZMm/qYjPdNXXDQCBDo="},"flags/1x1/mt-bbdc4f8e3dc66dc066d8ad0a264d751090794c53eee6be34f8df84ab389988a0.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2017-08-18T23:12:22+02:00","size":15270,"digest":"bbdc4f8e3dc66dc066d8ad0a264d751090794c53eee6be34f8df84ab389988a0","integrity":"sha256-u9xPjj3GbcBm2K0KJk11EJB5TFPu5r40+N+EqziZiKA="},"flags/4x3/mu-d0d2fd85209d5ca5b9f90da3947f3142b96ae688536ed796f2bc912aef84c333.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2017-08-18T23:12:22+02:00","size":366,"digest":"d0d2fd85209d5ca5b9f90da3947f3142b96ae688536ed796f2bc912aef84c333","integrity":"sha256-0NL9hSCdXKW5+Q2jlH8xQrlq5ohTbteW8ryRKu+EwzM="},"flags/1x1/mu-3e18fa9a066e02636f5a119d445b4f0439c8b75bae4e2999c17a6105bb95bd5a.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2017-08-18T23:12:22+02:00","size":348,"digest":"3e18fa9a066e02636f5a119d445b4f0439c8b75bae4e2999c17a6105bb95bd5a","integrity":"sha256-Phj6mgZuAmNvWhGdRFtPBDnIt1uuTimZwXphBbuVvVo="},"flags/4x3/mv-595fccd022d985bf319bfee09ded164593e8206c364adc1fa3abbc68450c516a.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2017-08-18T23:12:22+02:00","size":304,"digest":"595fccd022d985bf319bfee09ded164593e8206c364adc1fa3abbc68450c516a","integrity":"sha256-WV/M0CLZhb8xm/7gne0WRZPoIGw2Stwfo6u8aEUMUWo="},"flags/1x1/mv-ba59c37e1fcf099ca68e7fa68fc30d5e75c4171aad18be54126fd214a0b0b6b5.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2017-08-18T23:12:22+02:00","size":330,"digest":"ba59c37e1fcf099ca68e7fa68fc30d5e75c4171aad18be54126fd214a0b0b6b5","integrity":"sha256-ulnDfh/PCZymjn+mj8MNXnXEFxqtGL5UEm/SFKCwtrU="},"flags/4x3/mw-67c2a39590afb916054063262e67293e303a264b9f9219767c13feb988f47212.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2017-08-18T23:12:22+02:00","size":5696,"digest":"67c2a39590afb916054063262e67293e303a264b9f9219767c13feb988f47212","integrity":"sha256-Z8KjlZCvuRYFQGMmLmcpPjA6Jkufkhl2fBP+uYj0chI="},"flags/1x1/mw-b82e28e3e51b467c8db86b1dd9cae837204255320928eb5e5f6b8536c7b1b28e.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2017-08-18T23:12:22+02:00","size":5922,"digest":"b82e28e3e51b467c8db86b1dd9cae837204255320928eb5e5f6b8536c7b1b28e","integrity":"sha256-uC4o4+UbRnyNuGsd2croNyBCVTIJKOteX2uFNsexso4="},"flags/4x3/mx-416fe6de02b7d9dfc0e479454d06fa7701631bf848c888365bc56978ea524bc5.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2017-08-18T23:12:22+02:00","size":48965,"digest":"416fe6de02b7d9dfc0e479454d06fa7701631bf848c888365bc56978ea524bc5","integrity":"sha256-QW/m3gK32d/A5HlFTQb6dwFjG/hIyIg2W8VpeOpSS8U="},"flags/1x1/mx-b9461685b2714abb039fbd65510729f7ab324940045465b1c74666721d721f7d.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2017-08-18T23:12:22+02:00","size":49254,"digest":"b9461685b2714abb039fbd65510729f7ab324940045465b1c74666721d721f7d","integrity":"sha256-uUYWhbJxSrsDn71lUQcp96sySUAEVGWxx0Zmch1yH30="},"flags/4x3/my-c0f21e9c6679e1ae455392ded0b9e5d8aad5f5ee79589634ac89d88f0c548060.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2017-08-18T23:12:22+02:00","size":1542,"digest":"c0f21e9c6679e1ae455392ded0b9e5d8aad5f5ee79589634ac89d88f0c548060","integrity":"sha256-wPIenGZ54a5FU5Le0Lnl2KrV9e55WJY0rInYjwxUgGA="},"flags/1x1/my-868a1feec94ccf789db1040a953f25d3982056514195dcd961ff2d6b51b04431.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2017-08-18T23:12:22+02:00","size":1538,"digest":"868a1feec94ccf789db1040a953f25d3982056514195dcd961ff2d6b51b04431","integrity":"sha256-hoof7slMz3idsQQKlT8l05ggVlFBldzZYf8ta1GwRDE="},"flags/4x3/mz-0c06b80f82ab675854d23444740910298f4b8e82b929112dbec4e1927342120f.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2017-08-18T23:12:22+02:00","size":3565,"digest":"0c06b80f82ab675854d23444740910298f4b8e82b929112dbec4e1927342120f","integrity":"sha256-DAa4D4KrZ1hU0jREdAkQKY9LjoK5KREtvsThknNCEg8="},"flags/1x1/mz-09a8632f1d20d400401b944af3c4b13e5d64052466bf9a59f6d2927d188150da.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2017-08-18T23:12:22+02:00","size":3592,"digest":"09a8632f1d20d400401b944af3c4b13e5d64052466bf9a59f6d2927d188150da","integrity":"sha256-CahjLx0g1ABAG5RK88SxPl1kBSRmv5pZ9tKSfRiBUNo="},"flags/4x3/na-43a5f5934fc004e64eadcfb7675114ed1eab3b7f1e9153886edb0b69e7581ce2.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2017-08-18T23:12:22+02:00","size":1311,"digest":"43a5f5934fc004e64eadcfb7675114ed1eab3b7f1e9153886edb0b69e7581ce2","integrity":"sha256-Q6X1k0/ABOZOrc+3Z1EU7R6rO38ekVOIbtsLaedYHOI="},"flags/1x1/na-549c5971f5c2a771c83113a4f9b7a9b5e69546d855e92559b49d6772ff6d3e82.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2017-08-18T23:12:22+02:00","size":1297,"digest":"549c5971f5c2a771c83113a4f9b7a9b5e69546d855e92559b49d6772ff6d3e82","integrity":"sha256-VJxZcfXCp3HIMROk+bepteaVRthV6SVZtJ1ncv9tPoI="},"flags/4x3/nc-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2017-08-18T23:12:22+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/nc-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/ne-3be65335a772b7ba2c8916d0d60f12ed4cc2aebc302151ea23ced9c9a3c38ed4.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2017-08-18T23:12:22+02:00","size":291,"digest":"3be65335a772b7ba2c8916d0d60f12ed4cc2aebc302151ea23ced9c9a3c38ed4","integrity":"sha256-O+ZTNadyt7osiRbQ1g8S7UzCrrwwIVHqI87ZyaPDjtQ="},"flags/1x1/ne-783c25c63f68afe3c462b326b7faec7cc1493f6a4c140bc62fd524604de09d27.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2017-08-18T23:12:22+02:00","size":303,"digest":"783c25c63f68afe3c462b326b7faec7cc1493f6a4c140bc62fd524604de09d27","integrity":"sha256-eDwlxj9or+PEYrMmt/rsfMFJP2pMFAvGL9UkYE3gnSc="},"flags/4x3/nf-6ff37be9a0581fec55eef9e9871aa0d76d61c44007445184712ec6df3a04208a.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2017-08-18T23:12:22+02:00","size":9092,"digest":"6ff37be9a0581fec55eef9e9871aa0d76d61c44007445184712ec6df3a04208a","integrity":"sha256-b/N76aBYH+xV7vnphxqg121hxEAHRFGEcS7G3zoEIIo="},"flags/1x1/nf-2f25b6485f62ce38b25bc9f6428d3e0dc0043d71221eac1f4c3d71bca91c2ea6.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2017-08-18T23:12:22+02:00","size":8982,"digest":"2f25b6485f62ce38b25bc9f6428d3e0dc0043d71221eac1f4c3d71bca91c2ea6","integrity":"sha256-LyW2SF9izjiyW8n2Qo0+DcAEPXEiHqwfTD1xvKkcLqY="},"flags/4x3/ng-22aaf5a93f277f26cbfb21f7b141476fc8853298cf423fe5c849f87c2813d4e1.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2017-08-18T23:12:22+02:00","size":299,"digest":"22aaf5a93f277f26cbfb21f7b141476fc8853298cf423fe5c849f87c2813d4e1","integrity":"sha256-Iqr1qT8nfybL+yH3sUFHb8iFMpjPQj/lyEn4fCgT1OE="},"flags/1x1/ng-8753476807ab9e0c201397dbe6a884155d97e8766667d10071650d64fe277fb0.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2017-08-18T23:12:22+02:00","size":296,"digest":"8753476807ab9e0c201397dbe6a884155d97e8766667d10071650d64fe277fb0","integrity":"sha256-h1NHaAerngwgE5fb5qiEFV2X6HZmZ9EAcWUNZP4nf7A="},"flags/4x3/ni-295d07e91f9417b2ca8c7c918481874a7da7f9ac25035edf3a8d1d79b1230e32.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2017-08-18T23:12:22+02:00","size":28935,"digest":"295d07e91f9417b2ca8c7c918481874a7da7f9ac25035edf3a8d1d79b1230e32","integrity":"sha256-KV0H6R+UF7LKjHyRhIGHSn2n+awlA17fOo0debEjDjI="},"flags/1x1/ni-6786ef719864e51745934adc319ed0ed95fca75687ee6050d580435ee3f2b236.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2017-08-18T23:12:22+02:00","size":28945,"digest":"6786ef719864e51745934adc319ed0ed95fca75687ee6050d580435ee3f2b236","integrity":"sha256-Z4bvcZhk5RdFk0rcMZ7Q7ZX8p1aH7mBQ1YBDXuPysjY="},"flags/4x3/nl-8f7bff63589346e93733c01f1f18c5a11e8c94911253bcf852f173a933cd928e.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2017-08-18T23:12:22+02:00","size":385,"digest":"8f7bff63589346e93733c01f1f18c5a11e8c94911253bcf852f173a933cd928e","integrity":"sha256-j3v/Y1iTRuk3M8AfHxjFoR6MlJESU7z4UvFzqTPNko4="},"flags/1x1/nl-f46400354e3d489228eca5944d9e181114fe1f748fa22ac0a70fd06c557bec92.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2017-08-18T23:12:22+02:00","size":400,"digest":"f46400354e3d489228eca5944d9e181114fe1f748fa22ac0a70fd06c557bec92","integrity":"sha256-9GQANU49SJIo7KWUTZ4YERT+H3SPoirApw/QbFV77JI="},"flags/4x3/no-ecdb24f870c1e6777529ec85e3ea8d989a75b5874ecde94fead0218f7c1b5605.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2017-08-18T23:12:22+02:00","size":336,"digest":"ecdb24f870c1e6777529ec85e3ea8d989a75b5874ecde94fead0218f7c1b5605","integrity":"sha256-7Nsk+HDB5nd1KeyF4+qNmJp1tYdOzelP6tAhj3wbVgU="},"flags/1x1/no-47a12b11ae8b0aca7f7e3d9084e9d3a6c0ef1ad979d22ba9258e6f9ddc3ab16a.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2017-08-18T23:12:22+02:00","size":336,"digest":"47a12b11ae8b0aca7f7e3d9084e9d3a6c0ef1ad979d22ba9258e6f9ddc3ab16a","integrity":"sha256-R6ErEa6LCsp/fj2QhOnTpsDvGtl50iupJY5vndw6sWo="},"flags/4x3/np-b32c3bad572c4f27b5eee9c1ca97a5f2ca1c2a5b720b67fd636c91064e5fbdd9.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2017-08-18T23:12:22+02:00","size":1378,"digest":"b32c3bad572c4f27b5eee9c1ca97a5f2ca1c2a5b720b67fd636c91064e5fbdd9","integrity":"sha256-syw7rVcsTye17unBypel8socKltyC2f9Y2yRBk5fvdk="},"flags/1x1/np-1279e1d699c05de413b30172b7ed97c13bfaa2069abe788ecf8b127210778354.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2017-08-18T23:12:22+02:00","size":1520,"digest":"1279e1d699c05de413b30172b7ed97c13bfaa2069abe788ecf8b127210778354","integrity":"sha256-Ennh1pnAXeQTswFyt+2XwTv6ogaavniOz4sSchB3g1Q="},"flags/4x3/nr-3818437e2251e1f7310734098d13e2eee69a6b9cc310918d3287b345618e6fef.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2017-08-18T23:12:22+02:00","size":811,"digest":"3818437e2251e1f7310734098d13e2eee69a6b9cc310918d3287b345618e6fef","integrity":"sha256-OBhDfiJR4fcxBzQJjRPi7uaaa5zDEJGNMoezRWGOb+8="},"flags/1x1/nr-9b9edbaf4e09989f53511c969520cc2c10f3a693cdb80441b2aeabff30ebb381.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2017-08-18T23:12:22+02:00","size":802,"digest":"9b9edbaf4e09989f53511c969520cc2c10f3a693cdb80441b2aeabff30ebb381","integrity":"sha256-m57br04JmJ9TURyWlSDMLBDzppPNuARBsq6r/zDrs4E="},"flags/4x3/nu-3b27eef18754c7fb8def8deadc730f074b090c8b6e9101d008d529c1d8784e5e.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2017-08-18T23:12:22+02:00","size":2311,"digest":"3b27eef18754c7fb8def8deadc730f074b090c8b6e9101d008d529c1d8784e5e","integrity":"sha256-Oyfu8YdUx/uN743q3HMPB0sJDItukQHQCNUpwdh4Tl4="},"flags/1x1/nu-9f6f9a41e36004711e3ad2e31e3d0425ca698bf242a62b9665b6f41eeb999ac7.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2017-08-18T23:12:22+02:00","size":2303,"digest":"9f6f9a41e36004711e3ad2e31e3d0425ca698bf242a62b9665b6f41eeb999ac7","integrity":"sha256-n2+aQeNgBHEeOtLjHj0EJcppi/JCpiuWZbb0HuuZmsc="},"flags/4x3/nz-9690c3a7cdea4d5d6b88546ad69244a772fd0649e75f6334695fce89f5c4f076.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2017-08-18T23:12:22+02:00","size":2149,"digest":"9690c3a7cdea4d5d6b88546ad69244a772fd0649e75f6334695fce89f5c4f076","integrity":"sha256-lpDDp83qTV1riFRq1pJEp3L9BknnX2M0aV/OifXE8HY="},"flags/1x1/nz-e848215aaf4f9d5738b886ded97ff13b69c752888a27d1ac430116f7133a1c0e.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2017-08-18T23:12:22+02:00","size":2146,"digest":"e848215aaf4f9d5738b886ded97ff13b69c752888a27d1ac430116f7133a1c0e","integrity":"sha256-6EghWq9PnVc4uIbe2X/xO2nHUoiKJ9GsQwEW9xM6HA4="},"flags/4x3/om-7b9135ecdcf42a3bb69c5bf685930d32f9be7c6daaf58d5a8d154e22b6079347.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2017-08-18T23:12:22+02:00","size":29648,"digest":"7b9135ecdcf42a3bb69c5bf685930d32f9be7c6daaf58d5a8d154e22b6079347","integrity":"sha256-e5E17Nz0Kju2nFv2hZMNMvm+fG2q9Y1ajRVOIrYHk0c="},"flags/1x1/om-665da86c6b715f3d5f36bba0e01539e574d7871437b03ecbe29a92e5e703e09a.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2017-08-18T23:12:22+02:00","size":29508,"digest":"665da86c6b715f3d5f36bba0e01539e574d7871437b03ecbe29a92e5e703e09a","integrity":"sha256-Zl2obGtxXz1fNrug4BU55XTXhxQ3sD7L4pqS5ecD4Jo="},"flags/4x3/pa-a5b55e50a411899195a8f2bf8f37bddd94a4436582568c9ddfbddc2c99d1ae2d.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2017-08-18T23:12:22+02:00","size":879,"digest":"a5b55e50a411899195a8f2bf8f37bddd94a4436582568c9ddfbddc2c99d1ae2d","integrity":"sha256-pbVeUKQRiZGVqPK/jze93ZSkQ2WCVoyd373cLJnRri0="},"flags/1x1/pa-6c5566a7ace4125d958ec45ade8ce61e2fc065bb7fdd99cf1d6988a01b6fa73a.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2017-08-18T23:12:22+02:00","size":785,"digest":"6c5566a7ace4125d958ec45ade8ce61e2fc065bb7fdd99cf1d6988a01b6fa73a","integrity":"sha256-bFVmp6zkEl2VjsRa3ozmHi/AZbt/3ZnPHWmIoBtvpzo="},"flags/4x3/pe-12966232fe9a3dcc296389dea282cc8aa400327298d25f2f01c4963d1b900d13.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2017-08-18T23:12:22+02:00","size":315,"digest":"12966232fe9a3dcc296389dea282cc8aa400327298d25f2f01c4963d1b900d13","integrity":"sha256-EpZiMv6aPcwpY4neooLMiqQAMnKY0l8vAcSWPRuQDRM="},"flags/1x1/pe-449b3363ff9efe701e1f662ae71c31bb4b5952710b73346e2ae090a90c79488d.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2017-08-18T23:12:22+02:00","size":271,"digest":"449b3363ff9efe701e1f662ae71c31bb4b5952710b73346e2ae090a90c79488d","integrity":"sha256-RJszY/+e/nAeH2Yq5xwxu0tZUnELczRuKuCQqQx5SI0="},"flags/4x3/pf-db568d96a25e93ea2d51edb9ccb8a0ba15bbe46e1241e1bb4376a856290de4e8.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2017-08-18T23:12:22+02:00","size":6691,"digest":"db568d96a25e93ea2d51edb9ccb8a0ba15bbe46e1241e1bb4376a856290de4e8","integrity":"sha256-21aNlqJek+otUe25zLiguhW75G4SQeG7Q3aoVikN5Og="},"flags/1x1/pf-d6aacd56a7243b922bbbd26c94696f19a3dd242df5e5ede999e0319930bf8d64.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2017-08-18T23:12:22+02:00","size":6623,"digest":"d6aacd56a7243b922bbbd26c94696f19a3dd242df5e5ede999e0319930bf8d64","integrity":"sha256-1qrNVqckO5Iru9JslGlvGaPdJC315e3pmeAxmTC/jWQ="},"flags/4x3/pg-def242bd4b12703b11ddc016962c0ab5ac2252e6afb53647281af0ddf72b08b2.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2017-08-18T23:12:22+02:00","size":2218,"digest":"def242bd4b12703b11ddc016962c0ab5ac2252e6afb53647281af0ddf72b08b2","integrity":"sha256-3vJCvUsScDsR3cAWliwKtawiUuavtTZHKBrw3fcrCLI="},"flags/1x1/pg-0f89210b4effa3e2f248e9d22710191ec8a5f8cc00e24e7a493fcf6013af6985.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2017-08-18T23:12:22+02:00","size":2966,"digest":"0f89210b4effa3e2f248e9d22710191ec8a5f8cc00e24e7a493fcf6013af6985","integrity":"sha256-D4khC07/o+LySOnSJxAZHsil+MwA4k56ST/PYBOvaYU="},"flags/4x3/ph-76da2cb2822b71a1e7f182cfe2b8744af8704640feceb476aadf1753611c124c.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2017-08-18T23:12:22+02:00","size":1377,"digest":"76da2cb2822b71a1e7f182cfe2b8744af8704640feceb476aadf1753611c124c","integrity":"sha256-dtossoIrcaHn8YLP4rh0SvhwRkD+zrR2qt8XU2EcEkw="},"flags/1x1/ph-896fe211ebf65c4aec42a1f115ad43894870bc661eb9f32fd97962f0c6a8b666.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2017-08-18T23:12:22+02:00","size":1377,"digest":"896fe211ebf65c4aec42a1f115ad43894870bc661eb9f32fd97962f0c6a8b666","integrity":"sha256-iW/iEev2XErsQqHxFa1DiUhwvGYeufMv2Xli8MaotmY="},"flags/4x3/pk-d0f9243f586c99692f7d7d18a648095badef0c11bd98645924771c71283f6a51.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2017-08-18T23:12:22+02:00","size":922,"digest":"d0f9243f586c99692f7d7d18a648095badef0c11bd98645924771c71283f6a51","integrity":"sha256-0PkkP1hsmWkvfX0YpkgJW63vDBG9mGRZJHcccSg/alE="},"flags/1x1/pk-c32541b10dabe01538a811d9e1b600b91b1724239fe99325bc1156c4183127d9.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2017-08-18T23:12:22+02:00","size":864,"digest":"c32541b10dabe01538a811d9e1b600b91b1724239fe99325bc1156c4183127d9","integrity":"sha256-wyVBsQ2r4BU4qBHZ4bYAuRsXJCOf6ZMlvBFWxBgxJ9k="},"flags/4x3/pl-0fc0d2ef9f5b48e43bd93818263cc504c825346f09a73d22c6f84dcde8d651af.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2017-08-18T23:12:22+02:00","size":237,"digest":"0fc0d2ef9f5b48e43bd93818263cc504c825346f09a73d22c6f84dcde8d651af","integrity":"sha256-D8DS759bSOQ72TgYJjzFBMglNG8Jpz0ixvhNzejWUa8="},"flags/1x1/pl-44281da3343d3308aaa29a9e7d060a24b8d5bb949d07197e3771aa30793f5ffe.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2017-08-18T23:12:22+02:00","size":237,"digest":"44281da3343d3308aaa29a9e7d060a24b8d5bb949d07197e3771aa30793f5ffe","integrity":"sha256-RCgdozQ9MwiqopqefQYKJLjVu5SdBxl+N3GqMHk/X/4="},"flags/4x3/pm-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2017-08-18T23:12:22+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/pm-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/pn-b9639507463a2e238b7d0f4cd976455ad4108594cc526882ed83807c321ca6b8.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2017-08-18T23:12:22+02:00","size":16790,"digest":"b9639507463a2e238b7d0f4cd976455ad4108594cc526882ed83807c321ca6b8","integrity":"sha256-uWOVB0Y6LiOLfQ9M2XZFWtQQhZTMUmiC7YOAfDIcprg="},"flags/1x1/pn-23189e2aa8792ba5d7bbfba6f21467ec9516f9b366ddddce193a7f26ddc18030.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2017-08-18T23:12:22+02:00","size":17272,"digest":"23189e2aa8792ba5d7bbfba6f21467ec9516f9b366ddddce193a7f26ddc18030","integrity":"sha256-IxieKqh5K6XXu/um8hRn7JUW+bNm3d3OGTp/Jt3BgDA="},"flags/4x3/pr-3194786def8e2510554b4d46d2ac49a10bfd1fb26f0d6803864b5982b36c12bb.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2017-08-18T23:12:22+02:00","size":721,"digest":"3194786def8e2510554b4d46d2ac49a10bfd1fb26f0d6803864b5982b36c12bb","integrity":"sha256-MZR4be+OJRBVS01G0qxJoQv9H7JvDWgDhktZgrNsErs="},"flags/1x1/pr-fb6e6e3064fc00cb41a3752358ba09e006375d6139ed63a13e6b81b4c8c53511.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2017-08-18T23:12:22+02:00","size":697,"digest":"fb6e6e3064fc00cb41a3752358ba09e006375d6139ed63a13e6b81b4c8c53511","integrity":"sha256-+25uMGT8AMtBo3UjWLoJ4AY3XWE57WOhPmuBtMjFNRE="},"flags/4x3/ps-e75b0d2d81c169c45624faf1f51ed1b9bf9b7945d71ceddac505c464f47c639a.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2017-08-18T23:12:22+02:00","size":609,"digest":"e75b0d2d81c169c45624faf1f51ed1b9bf9b7945d71ceddac505c464f47c639a","integrity":"sha256-51sNLYHBacRWJPrx9R7Rub+beUXXHO3axQXEZPR8Y5o="},"flags/1x1/ps-5e45e6b195fa5aa5b3c8bdff0824ef3fb354d4f1d5a1a5c4d92a9d67a568db3b.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2017-08-18T23:12:22+02:00","size":560,"digest":"5e45e6b195fa5aa5b3c8bdff0824ef3fb354d4f1d5a1a5c4d92a9d67a568db3b","integrity":"sha256-XkXmsZX6WqWzyL3/CCTvP7NU1PHVoaXE2SqdZ6Vo2zs="},"flags/4x3/pt-7056421a09bf65c1e96a0891db8b1d37b9ece7b39a7a8ecdfcbc837d0f773cfa.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2017-08-18T23:12:22+02:00","size":12226,"digest":"7056421a09bf65c1e96a0891db8b1d37b9ece7b39a7a8ecdfcbc837d0f773cfa","integrity":"sha256-cFZCGgm/ZcHpagiR24sdN7ns57Oaeo7N/LyDfQ93PPo="},"flags/1x1/pt-4f2b0e37162ed4d197eb28886933009600109e827ac83664f57f3683adc9617a.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2017-08-18T23:12:22+02:00","size":12319,"digest":"4f2b0e37162ed4d197eb28886933009600109e827ac83664f57f3683adc9617a","integrity":"sha256-TysONxYu1NGX6yiIaTMAlgAQnoJ6yDZk9X82g63JYXo="},"flags/4x3/pw-8991b8ae2bef2f0e81e79442947f1c68f843be48f652a4c3a2af5dab84d73170.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2017-08-18T23:12:22+02:00","size":489,"digest":"8991b8ae2bef2f0e81e79442947f1c68f843be48f652a4c3a2af5dab84d73170","integrity":"sha256-iZG4rivvLw6B55RClH8caPhDvkj2UqTDoq9dq4TXMXA="},"flags/1x1/pw-4c45576b7f0be5b37d463d126410bfbca0f9dcdd1539fc6866f9fc116baa3437.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2017-08-18T23:12:22+02:00","size":596,"digest":"4c45576b7f0be5b37d463d126410bfbca0f9dcdd1539fc6866f9fc116baa3437","integrity":"sha256-TEVXa38L5bN9Rj0SZBC/vKD53N0VOfxoZvn8EWuqNDc="},"flags/4x3/py-c416c19abcc7629572203f00253c9272876e59a88eafa893fa4a534ed8977776.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2017-08-18T23:12:22+02:00","size":26946,"digest":"c416c19abcc7629572203f00253c9272876e59a88eafa893fa4a534ed8977776","integrity":"sha256-xBbBmrzHYpVyID8AJTyScoduWaiOr6iT+kpTTtiXd3Y="},"flags/1x1/py-adb6cfc575e9626cd8284964929c88830d0d6f7e5b0c135649eceb8bd9de1368.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2017-08-18T23:12:22+02:00","size":27004,"digest":"adb6cfc575e9626cd8284964929c88830d0d6f7e5b0c135649eceb8bd9de1368","integrity":"sha256-rbbPxXXpYmzYKElkkpyIgw0Nb35bDBNWSezri9neE2g="},"flags/4x3/qa-821f667f3f99992cf08b05498cc1a0769dee9c4e36d2a2561d6cf7827255af1b.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2017-08-18T23:12:22+02:00","size":414,"digest":"821f667f3f99992cf08b05498cc1a0769dee9c4e36d2a2561d6cf7827255af1b","integrity":"sha256-gh9mfz+ZmSzwiwVJjMGgdp3unE420qJWHWz3gnJVrxs="},"flags/1x1/qa-b05242965c0835a82add68dbcfb4523bc5e53e191803eab2c0c8c8762f2fce80.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2017-08-18T23:12:22+02:00","size":430,"digest":"b05242965c0835a82add68dbcfb4523bc5e53e191803eab2c0c8c8762f2fce80","integrity":"sha256-sFJCllwINagq3Wjbz7RSO8XlPhkYA+qywMjIdi8vzoA="},"flags/4x3/re-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2017-08-18T23:12:22+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/re-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/ro-63c55736a245e5fa5e0484b4693d43e171941143fcbdb34d3aa8d4cfd6160c9d.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2017-08-18T23:12:22+02:00","size":320,"digest":"63c55736a245e5fa5e0484b4693d43e171941143fcbdb34d3aa8d4cfd6160c9d","integrity":"sha256-Y8VXNqJF5fpeBIS0aT1D4XGUEUP8vbNNOqjUz9YWDJ0="},"flags/1x1/ro-f5c83b26832bb94b4320340ada4351a695bff66bb1410f6007c87e8395290380.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2017-08-18T23:12:22+02:00","size":324,"digest":"f5c83b26832bb94b4320340ada4351a695bff66bb1410f6007c87e8395290380","integrity":"sha256-9cg7JoMruUtDIDQK2kNRppW/9muxQQ9gB8h+g5UpA4A="},"flags/4x3/rs-a1bff9944ac65bce131f42964a45cfce50e334c6d52eeeea65f5f6179f8acf4d.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2017-08-18T23:12:22+02:00","size":494000,"digest":"a1bff9944ac65bce131f42964a45cfce50e334c6d52eeeea65f5f6179f8acf4d","integrity":"sha256-ob/5lErGW84TH0KWSkXPzlDjNMbVLu7qZfX2F5+Kz00="},"flags/1x1/rs-6af7605aa8aee1da6e0a75c750964b21b404011cd00f2df43ae55a827952251a.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2017-08-18T23:12:22+02:00","size":493892,"digest":"6af7605aa8aee1da6e0a75c750964b21b404011cd00f2df43ae55a827952251a","integrity":"sha256-avdgWqiu4dpuCnXHUJZLIbQEARzQDy30OuVagnlSJRo="},"flags/4x3/ru-2ba8996aa53f5eca5d1b0ea1a67d6d469659ac2523d1b394e3d6e25913bbbc15.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2017-08-18T23:12:22+02:00","size":309,"digest":"2ba8996aa53f5eca5d1b0ea1a67d6d469659ac2523d1b394e3d6e25913bbbc15","integrity":"sha256-K6iZaqU/XspdGw6hpn1tRpZZrCUj0bOU49biWRO7vBU="},"flags/1x1/ru-c8ecec77af983cd6ca10baaf2fa8f3dd67a6fa84f80cabdee10858910fdcc233.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2017-08-18T23:12:22+02:00","size":321,"digest":"c8ecec77af983cd6ca10baaf2fa8f3dd67a6fa84f80cabdee10858910fdcc233","integrity":"sha256-yOzsd6+YPNbKELqvL6jz3Wem+oT4DKve4QhYkQ/cwjM="},"flags/4x3/rw-0fa2c78359e9603d1cf21e4bb9355414ac3eed3635a25ba8f653d0498d61bd16.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2017-08-18T23:12:22+02:00","size":793,"digest":"0fa2c78359e9603d1cf21e4bb9355414ac3eed3635a25ba8f653d0498d61bd16","integrity":"sha256-D6LHg1npYD0c8h5LuTVUFKw+7TY1oluo9lPQSY1hvRY="},"flags/1x1/rw-61cce3e871326334478d73a379b202fc8548581abc02e39a898bc4fd16b2e0eb.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2017-08-18T23:12:22+02:00","size":795,"digest":"61cce3e871326334478d73a379b202fc8548581abc02e39a898bc4fd16b2e0eb","integrity":"sha256-Yczj6HEyYzRHjXOjebIC/IVIWBq8AuOaiYvE/Ray4Os="},"flags/4x3/sa-5aec890788f78356a42e38fe6ea2c30c4c82c99a3f05f654faae5918aae804c4.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2017-08-18T23:12:22+02:00","size":16083,"digest":"5aec890788f78356a42e38fe6ea2c30c4c82c99a3f05f654faae5918aae804c4","integrity":"sha256-WuyJB4j3g1akLjj+bqLDDEyCyZo/BfZU+q5ZGKroBMQ="},"flags/1x1/sa-57bf549298c1c3cb533120975d49b6cdb9c839addf278497d133236e666239f4.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2017-08-18T23:12:22+02:00","size":16334,"digest":"57bf549298c1c3cb533120975d49b6cdb9c839addf278497d133236e666239f4","integrity":"sha256-V79UkpjBw8tTMSCXXUm2zbnIOa3fJ4SX0TMjbmZiOfQ="},"flags/4x3/sb-3433de16f2b3f2a8373de87f879dd3b31ec8369256e23193947318976b51a182.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2017-08-18T23:12:22+02:00","size":1196,"digest":"3433de16f2b3f2a8373de87f879dd3b31ec8369256e23193947318976b51a182","integrity":"sha256-NDPeFvKz8qg3Peh/h53Tsx7INpJW4jGTlHMYl2tRoYI="},"flags/1x1/sb-e5352ddacf8edb727ef8f68dbb0951f00ae84b96e9b3b224cdf0c3ee2d33e8db.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2017-08-18T23:12:22+02:00","size":1221,"digest":"e5352ddacf8edb727ef8f68dbb0951f00ae84b96e9b3b224cdf0c3ee2d33e8db","integrity":"sha256-5TUt2s+O23J++PaNuwlR8AroS5bps7IkzfDD7i0z6Ns="},"flags/4x3/sc-9c1764a913e0577cadb24d11b883978389a818e94b39f6ac5cf4993dd041d501.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2017-08-18T23:12:22+02:00","size":591,"digest":"9c1764a913e0577cadb24d11b883978389a818e94b39f6ac5cf4993dd041d501","integrity":"sha256-nBdkqRPgV3ytsk0RuIOXg4moGOlLOfasXPSZPdBB1QE="},"flags/1x1/sc-c1abe18095ce0b84c2b21aa2453b916e00d8c0fd72fd5161f212e6bcf9c8ccd8.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2017-08-18T23:12:22+02:00","size":644,"digest":"c1abe18095ce0b84c2b21aa2453b916e00d8c0fd72fd5161f212e6bcf9c8ccd8","integrity":"sha256-wavhgJXOC4TCshqiRTuRbgDYwP1y/VFh8hLmvPnIzNg="},"flags/4x3/sd-df15037b269e643062988e5273f3cd5a379b18d0ff496bdac97e840deb0793bc.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2017-08-18T23:12:22+02:00","size":501,"digest":"df15037b269e643062988e5273f3cd5a379b18d0ff496bdac97e840deb0793bc","integrity":"sha256-3xUDeyaeZDBimI5Sc/PNWjebGND/SWvayX6EDesHk7w="},"flags/1x1/sd-baedc80da37d70ce8fa4d5619d85b4823435180311f0c2995717116e681c20d3.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2017-08-18T23:12:22+02:00","size":515,"digest":"baedc80da37d70ce8fa4d5619d85b4823435180311f0c2995717116e681c20d3","integrity":"sha256-uu3IDaN9cM6PpNVhnYW0gjQ1GAMR8MKZVxcRbmgcINM="},"flags/4x3/se-73964261d5ec45c856c9f7b57f1be90f60c5e748596e494aafa5facd817c7118.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2017-08-18T23:12:22+02:00","size":765,"digest":"73964261d5ec45c856c9f7b57f1be90f60c5e748596e494aafa5facd817c7118","integrity":"sha256-c5ZCYdXsRchWyfe1fxvpD2DF50hZbklKr6X6zYF8cRg="},"flags/1x1/se-ea6d6caac7db4cfc8d68548f70afbf6ddbf072993e655bdb0b0860f724202e2b.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2017-08-18T23:12:22+02:00","size":799,"digest":"ea6d6caac7db4cfc8d68548f70afbf6ddbf072993e655bdb0b0860f724202e2b","integrity":"sha256-6m1sqsfbTPyNaFSPcK+/bdvwcpk+ZVvbCwhg9yQgLis="},"flags/4x3/sg-2c8851a3c456051d7510b78da650054ee411ecdb01508ab3aa8ddac220de984a.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2017-08-18T23:12:22+02:00","size":1278,"digest":"2c8851a3c456051d7510b78da650054ee411ecdb01508ab3aa8ddac220de984a","integrity":"sha256-LIhRo8RWBR11ELeNplAFTuQR7NsBUIqzqo3awiDemEo="},"flags/1x1/sg-81517add5de364935b2173fd1ed3db2fefc22e07a072d03fd4f91e8543ffcb22.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2017-08-18T23:12:22+02:00","size":1373,"digest":"81517add5de364935b2173fd1ed3db2fefc22e07a072d03fd4f91e8543ffcb22","integrity":"sha256-gVF63V3jZJNbIXP9HtPbL+/CLgegctA/1PkehUP/yyI="},"flags/4x3/sh-cdfa61ab262caf8d6b13cc66f1d0e1e935dadb144d93ad28fcd850e9164c33d9.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2017-08-18T23:12:22+02:00","size":48963,"digest":"cdfa61ab262caf8d6b13cc66f1d0e1e935dadb144d93ad28fcd850e9164c33d9","integrity":"sha256-zfphqyYsr41rE8xm8dDh6TXa2xRNk60o/NhQ6RZMM9k="},"flags/1x1/sh-763ae01f8c0189641321a0de1085f0d1ceeb962d94bb989c6255dae4616fd14f.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2017-08-18T23:12:22+02:00","size":49731,"digest":"763ae01f8c0189641321a0de1085f0d1ceeb962d94bb989c6255dae4616fd14f","integrity":"sha256-djrgH4wBiWQTIaDeEIXw0c7rli2Uu5icYlXa5GFv0U8="},"flags/4x3/si-81f600f18fae95b3e2a6813cc012e94bdfd67965eb7ce1676780bc7d04f4f203.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2017-08-18T23:12:22+02:00","size":2910,"digest":"81f600f18fae95b3e2a6813cc012e94bdfd67965eb7ce1676780bc7d04f4f203","integrity":"sha256-gfYA8Y+ulbPipoE8wBLpS9/WeWXrfOFnZ4C8fQT08gM="},"flags/1x1/si-6481bc748939a46efccac3df22ccc34341cc006d871a7ff521769c562a5325df.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2017-08-18T23:12:22+02:00","size":2924,"digest":"6481bc748939a46efccac3df22ccc34341cc006d871a7ff521769c562a5325df","integrity":"sha256-ZIG8dIk5pG78ysPfIszDQ0HMAG2HGn/1IXacVipTJd8="},"flags/4x3/sj-8c78bb614796386f416c677e7ee2984c9997d0789306a9861e0d3f85edf62608.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2017-08-18T23:12:22+02:00","size":809,"digest":"8c78bb614796386f416c677e7ee2984c9997d0789306a9861e0d3f85edf62608","integrity":"sha256-jHi7YUeWOG9BbGd+fuKYTJmX0HiTBqmGHg0/he32Jgg="},"flags/1x1/sj-15448521086e54b5dc1b51bce3e8424a3282aaa539514a8d63fae537d400bc08.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2017-08-18T23:12:22+02:00","size":751,"digest":"15448521086e54b5dc1b51bce3e8424a3282aaa539514a8d63fae537d400bc08","integrity":"sha256-FUSFIQhuVLXcG1G84+hCSjKCqqU5UUqNY/rlN9QAvAg="},"flags/4x3/sk-271dd9219a226c5e9768072c3d0512b9ab07d1af59a3a5642eba620e3f53ea2c.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2017-08-18T23:12:22+02:00","size":1633,"digest":"271dd9219a226c5e9768072c3d0512b9ab07d1af59a3a5642eba620e3f53ea2c","integrity":"sha256-Jx3ZIZoibF6XaAcsPQUSuasH0a9Zo6VkLrpiDj9T6iw="},"flags/1x1/sk-4ee51ed995ad80a8f9a335b5f36b00a830da6e7065ecda1e84e427cf19dda736.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2017-08-18T23:12:22+02:00","size":1644,"digest":"4ee51ed995ad80a8f9a335b5f36b00a830da6e7065ecda1e84e427cf19dda736","integrity":"sha256-TuUe2ZWtgKj5ozW182sAqDDabnBl7NoehOQnzxndpzY="},"flags/4x3/sl-3fd8765025c44c215906c9d33be69326118f5025b35a93636df059926053c84c.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2017-08-18T23:12:22+02:00","size":340,"digest":"3fd8765025c44c215906c9d33be69326118f5025b35a93636df059926053c84c","integrity":"sha256-P9h2UCXETCFZBsnTO+aTJhGPUCWzWpNjbfBZkmBTyEw="},"flags/1x1/sl-ffbed472a2b3677e9339adfd150ffc76bbae85071cbf1b14f75c67b03fff29d8.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2017-08-18T23:12:22+02:00","size":454,"digest":"ffbed472a2b3677e9339adfd150ffc76bbae85071cbf1b14f75c67b03fff29d8","integrity":"sha256-/77UcqKzZ36TOa39FQ/8druuhQccvxsU91xnsD//Kdg="},"flags/4x3/sm-72df25d7ba785caa3201dc9ea30349a5bd3891de99e6d818bff2f34914264654.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2017-08-18T23:12:22+02:00","size":22920,"digest":"72df25d7ba785caa3201dc9ea30349a5bd3891de99e6d818bff2f34914264654","integrity":"sha256-ct8l17p4XKoyAdyeowNJpb04kd6Z5tgYv/LzSRQmRlQ="},"flags/1x1/sm-afa36059e43d3014dfc9088d30e86449b8463d282611b99f8d496aca155075c2.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2017-08-18T23:12:22+02:00","size":23051,"digest":"afa36059e43d3014dfc9088d30e86449b8463d282611b99f8d496aca155075c2","integrity":"sha256-r6NgWeQ9MBTfyQiNMOhkSbhGPSgmEbmfjUlqyhVQdcI="},"flags/4x3/sn-3465e8417cd4bd6d948ab2311442757688af8516c6aa7c4f73c48a9447087b8c.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2017-08-18T23:12:22+02:00","size":485,"digest":"3465e8417cd4bd6d948ab2311442757688af8516c6aa7c4f73c48a9447087b8c","integrity":"sha256-NGXoQXzUvW2UirIxFEJ1doivhRbGqnxPc8SKlEcIe4w="},"flags/1x1/sn-dfbe30abf15b2937f1b2de375b832ef3fe11e78f3536df35232b2f7265c00d9e.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2017-08-18T23:12:22+02:00","size":480,"digest":"dfbe30abf15b2937f1b2de375b832ef3fe11e78f3536df35232b2f7265c00d9e","integrity":"sha256-374wq/FbKTfxst43W4Mu8/4R5481Nt81IysvcmXADZ4="},"flags/4x3/so-16f7af15587913f17fd988f914c55de175ed1d4b2282ba2fa52b414c7359b440.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2017-08-18T23:12:22+02:00","size":558,"digest":"16f7af15587913f17fd988f914c55de175ed1d4b2282ba2fa52b414c7359b440","integrity":"sha256-FvevFVh5E/F/2Yj5FMVd4XXtHUsigrovpStBTHNZtEA="},"flags/1x1/so-bbf08e60fbda4e45791d985450f6dbcd9ea779f93c818973271845dd01fc8df6.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2017-08-18T23:12:22+02:00","size":571,"digest":"bbf08e60fbda4e45791d985450f6dbcd9ea779f93c818973271845dd01fc8df6","integrity":"sha256-u/COYPvaTkV5HZhUUPbbzZ6nefk8gYlzJxhF3QH8jfY="},"flags/4x3/sr-7718ec6fbe85ea55c72189bf0dc94b10f20a7948ab913903e5b8050af20e4f6f.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2017-08-18T23:12:22+02:00","size":331,"digest":"7718ec6fbe85ea55c72189bf0dc94b10f20a7948ab913903e5b8050af20e4f6f","integrity":"sha256-dxjsb76F6lXHIYm/DclLEPIKeUirkTkD5bgFCvIOT28="},"flags/1x1/sr-692dfcca46c35b618f0358ef0cc9b2ee7c27c839f98b12134318804f6498ceee.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2017-08-18T23:12:22+02:00","size":341,"digest":"692dfcca46c35b618f0358ef0cc9b2ee7c27c839f98b12134318804f6498ceee","integrity":"sha256-aS38ykbDW2GPA1jvDMmy7nwnyDn5ixITQxiAT2SYzu4="},"flags/4x3/ss-aebe3fc1b10d93add9906690e262b1baf5338529a832ff954e329c897e014e9c.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2017-08-18T23:12:22+02:00","size":406,"digest":"aebe3fc1b10d93add9906690e262b1baf5338529a832ff954e329c897e014e9c","integrity":"sha256-rr4/wbENk63ZkGaQ4mKxuvUzhSmoMv+VTjKciX4BTpw="},"flags/1x1/ss-1d0ebcb31f2c0fe874bd046253de4eec410239c2e0f41eb1cea1f312b51bc8a8.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2017-08-18T23:12:22+02:00","size":424,"digest":"1d0ebcb31f2c0fe874bd046253de4eec410239c2e0f41eb1cea1f312b51bc8a8","integrity":"sha256-HQ68sx8sD+h0vQRiU95O7EECOcLg9B6xzqHzErUbyKg="},"flags/4x3/st-b24fa19cb51844a3187239e3cbacf828f02e7b8ddf4b01e9ec3366e75966c5d6.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2017-08-18T23:12:22+02:00","size":822,"digest":"b24fa19cb51844a3187239e3cbacf828f02e7b8ddf4b01e9ec3366e75966c5d6","integrity":"sha256-sk+hnLUYRKMYcjnjy6z4KPAue43fSwHp7DNm51lmxdY="},"flags/1x1/st-d4d96bc9009e10cec6a00ce0d6fae3746ddefce867f63503595110b2fd539d17.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2017-08-18T23:12:22+02:00","size":790,"digest":"d4d96bc9009e10cec6a00ce0d6fae3746ddefce867f63503595110b2fd539d17","integrity":"sha256-1NlryQCeEM7GoAzg1vrjdG3e/Ohn9jUDWVEQsv1TnRc="},"flags/4x3/sv-cd0c1acd571abd1756fc4e7eea2369c0466265b1d170a7a3618a66800ddbb4c2.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2017-08-18T23:12:22+02:00","size":129725,"digest":"cd0c1acd571abd1756fc4e7eea2369c0466265b1d170a7a3618a66800ddbb4c2","integrity":"sha256-zQwazVcavRdW/E5+6iNpwEZiZbHRcKejYYpmgA3btMI="},"flags/1x1/sv-e86857616aaa7fc022b68dafd4a58d4be7ddfcc6d5b2c3d5dad67b457d1e75c9.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2017-08-18T23:12:22+02:00","size":129880,"digest":"e86857616aaa7fc022b68dafd4a58d4be7ddfcc6d5b2c3d5dad67b457d1e75c9","integrity":"sha256-6GhXYWqqf8Aito2v1KWNS+fd/MbVssPV2tZ7RX0edck="},"flags/4x3/sx-7ed9e6d8c02b265181248986ccd927f6540a7d55b4ec82b60baef06face66ee1.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2017-08-18T23:12:22+02:00","size":19945,"digest":"7ed9e6d8c02b265181248986ccd927f6540a7d55b4ec82b60baef06face66ee1","integrity":"sha256-ftnm2MArJlGBJImGzNkn9lQKfVW07IK2C67wb6zmbuE="},"flags/1x1/sx-09ab7415791d37231c9fb79b51fc52583407d7721e6f401cc98fc1ab12d2b62d.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2017-08-18T23:12:22+02:00","size":19770,"digest":"09ab7415791d37231c9fb79b51fc52583407d7721e6f401cc98fc1ab12d2b62d","integrity":"sha256-Cat0FXkdNyMcn7ebUfxSWDQH13Ieb0AcyY/BqxLSti0="},"flags/4x3/sy-49bb1803affb9e4ee070fb6e333a445f6df15ac11db6abe0a62f1aa922fe3c16.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2017-08-18T23:12:22+02:00","size":1029,"digest":"49bb1803affb9e4ee070fb6e333a445f6df15ac11db6abe0a62f1aa922fe3c16","integrity":"sha256-SbsYA6/7nk7gcPtuMzpEX23xWsEdtqvgpi8aqSL+PBY="},"flags/1x1/sy-b52b5ed6037c8e0e0a3ecd13006b79027d5fac2059fdd54109b591e5c5ada752.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2017-08-18T23:12:22+02:00","size":1193,"digest":"b52b5ed6037c8e0e0a3ecd13006b79027d5fac2059fdd54109b591e5c5ada752","integrity":"sha256-tSte1gN8jg4KPs0TAGt5An1frCBZ/dVBCbWR5cWtp1I="},"flags/4x3/sz-a545e703e03ec7f9e108fa348d9e222aba1d7514bad2786f9ca8c6c3063a0e68.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2017-08-18T23:12:22+02:00","size":9230,"digest":"a545e703e03ec7f9e108fa348d9e222aba1d7514bad2786f9ca8c6c3063a0e68","integrity":"sha256-pUXnA+A+x/nhCPo0jZ4iKroddRS60nhvnKjGwwY6Dmg="},"flags/1x1/sz-784ee11c6629bc411d3e274eea68a3739ddfaa4c3bd18e46e62262518ae0b93e.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2017-08-18T23:12:22+02:00","size":9135,"digest":"784ee11c6629bc411d3e274eea68a3739ddfaa4c3bd18e46e62262518ae0b93e","integrity":"sha256-eE7hHGYpvEEdPidO6mijc53fqkw70Y5G5iJiUYrguT4="},"flags/4x3/tc-a20d2d87632b3c19e16a599dd45f3918a5f2db3025867c5f1b279050af68f637.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2017-08-18T23:12:22+02:00","size":19596,"digest":"a20d2d87632b3c19e16a599dd45f3918a5f2db3025867c5f1b279050af68f637","integrity":"sha256-og0th2MrPBnhalmd1F85GKXy2zAlhnxfGyeQUK9o9jc="},"flags/1x1/tc-4c7c0e4227d06fb697b8c5ec5f95382b1549342013ea80211f2942f81d472d5a.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2017-08-18T23:12:22+02:00","size":19881,"digest":"4c7c0e4227d06fb697b8c5ec5f95382b1549342013ea80211f2942f81d472d5a","integrity":"sha256-THwOQifQb7aXuMXsX5U4KxVJNCAT6oAhHylC+B1HLVo="},"flags/4x3/td-1b92327abb7d3ba9b54361f6a38018979e57d5083990af57adac25102146b939.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2017-08-18T23:12:22+02:00","size":342,"digest":"1b92327abb7d3ba9b54361f6a38018979e57d5083990af57adac25102146b939","integrity":"sha256-G5Iyert9O6m1Q2H2o4AYl55X1Qg5kK9XrawlECFGuTk="},"flags/1x1/td-977813c5dfc3b6b640d1390c04c469cf92e84827ca06ed7f4984a58782a059c5.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2017-08-18T23:12:22+02:00","size":294,"digest":"977813c5dfc3b6b640d1390c04c469cf92e84827ca06ed7f4984a58782a059c5","integrity":"sha256-l3gTxd/DtrZA0TkMBMRpz5LoSCfKBu1/SYSlh4KgWcU="},"flags/4x3/tf-f45e133cfa8a01239d65e1693492ca1de1949f3660de77d802b41c9a9fc662e8.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2017-08-18T23:12:22+02:00","size":1130,"digest":"f45e133cfa8a01239d65e1693492ca1de1949f3660de77d802b41c9a9fc662e8","integrity":"sha256-9F4TPPqKASOdZeFpNJLKHeGUnzZg3nfYArQcmp/GYug="},"flags/1x1/tf-53581d6af7751cf4c126459a2226fd19cd10040d25e33d1653ece9e57a1a0e2b.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2017-08-18T23:12:22+02:00","size":1303,"digest":"53581d6af7751cf4c126459a2226fd19cd10040d25e33d1653ece9e57a1a0e2b","integrity":"sha256-U1gdavd1HPTBJkWaIib9Gc0QBA0l4z0WU+zp5XoaDis="},"flags/4x3/tg-de9fe13020d702ce964ff7d712c6b6a3a57c3933f56fbd0c783fe0309f0dbae3.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2017-08-18T23:12:22+02:00","size":831,"digest":"de9fe13020d702ce964ff7d712c6b6a3a57c3933f56fbd0c783fe0309f0dbae3","integrity":"sha256-3p/hMCDXAs6WT/fXEsa2o6V8OTP1b70MeD/gMJ8NuuM="},"flags/1x1/tg-92f575529494b0ba885e47302167a14343c1fd78fef5008ec3aacde7f840fd23.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2017-08-18T23:12:22+02:00","size":839,"digest":"92f575529494b0ba885e47302167a14343c1fd78fef5008ec3aacde7f840fd23","integrity":"sha256-kvV1UpSUsLqIXkcwIWehQ0PB/Xj+9QCOw6rN5/hA/SM="},"flags/4x3/th-6211c6caabbc4fdd4ff054cb689406bc9cc7816c01d482a6222e873b0e8fc9b0.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2017-08-18T23:12:22+02:00","size":312,"digest":"6211c6caabbc4fdd4ff054cb689406bc9cc7816c01d482a6222e873b0e8fc9b0","integrity":"sha256-YhHGyqu8T91P8FTLaJQGvJzHgWwB1IKmIi6HOw6PybA="},"flags/1x1/th-b8a0cf7c820f9010ce12333bfa7f8713358dee291bc955fa7e5333fcf5fc8a07.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2017-08-18T23:12:22+02:00","size":311,"digest":"b8a0cf7c820f9010ce12333bfa7f8713358dee291bc955fa7e5333fcf5fc8a07","integrity":"sha256-uKDPfIIPkBDOEjM7+n+HEzWN7ikbyVX6flMz/PX8igc="},"flags/4x3/tj-4bf387aa434be996fc00be6dbb457282e311ff6c7538a484f5cb4d99e45b0747.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2017-08-18T23:12:22+02:00","size":2023,"digest":"4bf387aa434be996fc00be6dbb457282e311ff6c7538a484f5cb4d99e45b0747","integrity":"sha256-S/OHqkNL6Zb8AL5tu0VyguMR/2x1OKSE9ctNmeRbB0c="},"flags/1x1/tj-b371ab0647e7dfba73251169fe1e3180058d6556aa7293b7b573eaf43add617d.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2017-08-18T23:12:22+02:00","size":1908,"digest":"b371ab0647e7dfba73251169fe1e3180058d6556aa7293b7b573eaf43add617d","integrity":"sha256-s3GrBkfn37pzJRFp/h4xgAWNZVaqcpO3tXPq9DrdYX0="},"flags/4x3/tk-cef6e368398b0cbaa4ee0b943d02155c51f9e8ab5ba27b9562ccd629f9a72183.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2017-08-18T23:12:22+02:00","size":841,"digest":"cef6e368398b0cbaa4ee0b943d02155c51f9e8ab5ba27b9562ccd629f9a72183","integrity":"sha256-zvbjaDmLDLqk7guUPQIVXFH56KtbonuVYszWKfmnIYM="},"flags/1x1/tk-1544aef42090102ba2e154b48f8c059dfddd5789fc5f12aa859939c41673a661.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2017-08-18T23:12:22+02:00","size":840,"digest":"1544aef42090102ba2e154b48f8c059dfddd5789fc5f12aa859939c41673a661","integrity":"sha256-FUSu9CCQECui4VS0j4wFnf3dV4n8XxKqhZk5xBZzpmE="},"flags/4x3/tl-cd74f59871cf5453b4e9454a4820e683c06dc8c9c84dae4c47af9264bed7ab22.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2017-08-18T23:12:22+02:00","size":658,"digest":"cd74f59871cf5453b4e9454a4820e683c06dc8c9c84dae4c47af9264bed7ab22","integrity":"sha256-zXT1mHHPVFO06UVKSCDmg8BtyMnITa5MR6+SZL7XqyI="},"flags/1x1/tl-a7cd9977244579380914f288bf358ec8b1b0abec6b8dc99e65cc35afe41bc405.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2017-08-18T23:12:22+02:00","size":675,"digest":"a7cd9977244579380914f288bf358ec8b1b0abec6b8dc99e65cc35afe41bc405","integrity":"sha256-p82ZdyRFeTgJFPKIvzWOyLGwq+xrjcmeZcw1r+QbxAU="},"flags/4x3/tm-3db83810be6239a1c7e594a0b11a4847a7d300cc54e12e4cf4c8a9558520dd67.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2017-08-18T23:12:22+02:00","size":45153,"digest":"3db83810be6239a1c7e594a0b11a4847a7d300cc54e12e4cf4c8a9558520dd67","integrity":"sha256-Pbg4EL5iOaHH5ZSgsRpIR6fTAMxU4S5M9MipVYUg3Wc="},"flags/1x1/tm-ade1696d2299d73cc6fa06304144055f9a02c1800846516c4e21baba2a05d4cf.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2017-08-18T23:12:22+02:00","size":45051,"digest":"ade1696d2299d73cc6fa06304144055f9a02c1800846516c4e21baba2a05d4cf","integrity":"sha256-reFpbSKZ1zzG+gYwQUQFX5oCwYAIRlFsTiG6uioF1M8="},"flags/4x3/tn-17e7bc4e9dad2da8f12c95c56de46b21890b9d1c725ba400fa7d8df17d59fd4d.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2017-08-18T23:12:22+02:00","size":984,"digest":"17e7bc4e9dad2da8f12c95c56de46b21890b9d1c725ba400fa7d8df17d59fd4d","integrity":"sha256-F+e8Tp2tLajxLJXFbeRrIYkLnRxyW6QA+n2N8X1Z/U0="},"flags/1x1/tn-55604ef719cd538ba0e2541667d4c52b08f18efe91bb52ad0954802d38ea12f7.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2017-08-18T23:12:22+02:00","size":957,"digest":"55604ef719cd538ba0e2541667d4c52b08f18efe91bb52ad0954802d38ea12f7","integrity":"sha256-VWBO9xnNU4ug4lQWZ9TFKwjxjv6Ru1KtCVSALTjqEvc="},"flags/4x3/to-db07012009b9d6ac0c8eca209a68c310d9371771cca8c6c4c2022b3db1ba39d9.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2017-08-18T23:12:22+02:00","size":385,"digest":"db07012009b9d6ac0c8eca209a68c310d9371771cca8c6c4c2022b3db1ba39d9","integrity":"sha256-2wcBIAm51qwMjsogmmjDENk3F3HMqMbEwgIrPbG6Odk="},"flags/1x1/to-1ed20c5d05424776b5d3cc17487ed8311998cb69db89109a380d59722d4bc2bc.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2017-08-18T23:12:22+02:00","size":387,"digest":"1ed20c5d05424776b5d3cc17487ed8311998cb69db89109a380d59722d4bc2bc","integrity":"sha256-HtIMXQVCR3a108wXSH7YMRmYy2nbiRCaOA1Zci1Lwrw="},"flags/4x3/tr-b8b3b6850c4c0ffa840db30c814dce6cb86e00e78138bafe8c2c58d263fb4503.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2017-08-18T23:12:22+02:00","size":688,"digest":"b8b3b6850c4c0ffa840db30c814dce6cb86e00e78138bafe8c2c58d263fb4503","integrity":"sha256-uLO2hQxMD/qEDbMMgU3ObLhuAOeBOLr+jCxY0mP7RQM="},"flags/1x1/tr-be0c612d78c2662c4e9c0dc836b63c8a7a5cfff48afc533f81c2ba2423542f5e.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2017-08-18T23:12:22+02:00","size":690,"digest":"be0c612d78c2662c4e9c0dc836b63c8a7a5cfff48afc533f81c2ba2423542f5e","integrity":"sha256-vgxhLXjCZixOnA3INrY8inpc//SK/FM/gcK6JCNUL14="},"flags/4x3/tt-05d9799b6519267990dccbc997c620c6478e00a96a79841494707cc3d036a381.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2017-08-18T23:12:22+02:00","size":365,"digest":"05d9799b6519267990dccbc997c620c6478e00a96a79841494707cc3d036a381","integrity":"sha256-Bdl5m2UZJnmQ3MvJl8YgxkeOAKlqeYQUlHB8w9A2o4E="},"flags/1x1/tt-4ab2fff1efee93f41060975098c5c11e043dc0853456c8c0c70cacd4ba92e8ed.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2017-08-18T23:12:22+02:00","size":393,"digest":"4ab2fff1efee93f41060975098c5c11e043dc0853456c8c0c70cacd4ba92e8ed","integrity":"sha256-SrL/8e/uk/QQYJdQmMXBHgQ9wIU0VsjAxwys1LqS6O0="},"flags/4x3/tv-14be4bb5a1fe44a8d3d58bde3dca6c63ed2974554c2008b4a2441a096c9f1fea.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2017-08-18T23:12:22+02:00","size":2957,"digest":"14be4bb5a1fe44a8d3d58bde3dca6c63ed2974554c2008b4a2441a096c9f1fea","integrity":"sha256-FL5LtaH+RKjT1YvePcpsY+0pdFVMIAi0okQaCWyfH+o="},"flags/1x1/tv-71e98b9502d12d655a169e8c89de6d5b2fcc957d67d0b7e93dd2be8ff9e6f2a8.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2017-08-18T23:12:22+02:00","size":2956,"digest":"71e98b9502d12d655a169e8c89de6d5b2fcc957d67d0b7e93dd2be8ff9e6f2a8","integrity":"sha256-cemLlQLRLWVaFp6Mid5tWy/MlX1n0LfpPdK+j/nm8qg="},"flags/4x3/tw-3b699e4e60f9765601c0f84bbf3f16f953f5a454a0cf62487a0eef358f456e66.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2017-08-18T23:12:22+02:00","size":1252,"digest":"3b699e4e60f9765601c0f84bbf3f16f953f5a454a0cf62487a0eef358f456e66","integrity":"sha256-O2meTmD5dlYBwPhLvz8W+VP1pFSgz2JIeg7vNY9FbmY="},"flags/1x1/tw-62cd36c5fc2aff70bbd11312601821ca09729e9e246e32d895e0f4a2017ac0b6.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2017-08-18T23:12:22+02:00","size":1228,"digest":"62cd36c5fc2aff70bbd11312601821ca09729e9e246e32d895e0f4a2017ac0b6","integrity":"sha256-Ys02xfwq/3C70RMSYBghyglynp4kbjLYleD0ogF6wLY="},"flags/4x3/tz-f219bcd0e3536ea3653178e0281620ebfe4c5b3b461c2c79fdf2b2a852de372e.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2017-08-18T23:12:22+02:00","size":582,"digest":"f219bcd0e3536ea3653178e0281620ebfe4c5b3b461c2c79fdf2b2a852de372e","integrity":"sha256-8hm80ONTbqNlMXjgKBYg6/5MWztGHCx5/fKyqFLeNy4="},"flags/1x1/tz-2829d5fc4fcdf2e6a149f63ea6b5a5f1af7b6b08fec523ec217ab5a6d9fb7e77.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2017-08-18T23:12:22+02:00","size":692,"digest":"2829d5fc4fcdf2e6a149f63ea6b5a5f1af7b6b08fec523ec217ab5a6d9fb7e77","integrity":"sha256-KCnV/E/N8uahSfY+prWl8a97awj+xSPsIXq1ptn7fnc="},"flags/4x3/ua-07199c03990a6b4f285e421d928ab4dba2dfdfdb3e40dd9bfa207c86bc0f3c9d.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2017-08-18T23:12:22+02:00","size":253,"digest":"07199c03990a6b4f285e421d928ab4dba2dfdfdb3e40dd9bfa207c86bc0f3c9d","integrity":"sha256-BxmcA5kKa08oXkIdkoq026Lf39s+QN2b+iB8hrwPPJ0="},"flags/1x1/ua-7c939efc452c13b0f8f489f3dfd37d3eba97c0f577c97f0b6673968af62a3207.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2017-08-18T23:12:22+02:00","size":261,"digest":"7c939efc452c13b0f8f489f3dfd37d3eba97c0f577c97f0b6673968af62a3207","integrity":"sha256-fJOe/EUsE7D49Inz39N9PrqXwPV3yX8LZnOWivYqMgc="},"flags/4x3/ug-48c6cbeae1a865915dd5a06f56bdd576e9ed9ce5085b627ef31f3757c0937a5d.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2017-08-18T23:12:22+02:00","size":5381,"digest":"48c6cbeae1a865915dd5a06f56bdd576e9ed9ce5085b627ef31f3757c0937a5d","integrity":"sha256-SMbL6uGoZZFd1aBvVr3VduntnOUIW2J+8x83V8CTel0="},"flags/1x1/ug-da6257aa7e40121a6e8e574bf201701910bbd838cbc8d76030397c0f34ae906b.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2017-08-18T23:12:22+02:00","size":5316,"digest":"da6257aa7e40121a6e8e574bf201701910bbd838cbc8d76030397c0f34ae906b","integrity":"sha256-2mJXqn5AEhpujldL8gFwGRC72DjLyNdgMDl8DzSukGs="},"flags/4x3/um-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2017-08-18T23:12:22+02:00","size":6989,"digest":"6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7","integrity":"sha256-bQU/TW4UEnRXSfyNmBgz1tf48ZtyBC0aZeM1bKKafvc="},"flags/1x1/um-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2017-08-18T23:12:22+02:00","size":6201,"digest":"5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435","integrity":"sha256-W89dQaptX9v8kgoBT8d9bNvfN7205n2/5o7RYbrkpDU="},"flags/4x3/us-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2017-08-18T23:12:22+02:00","size":6989,"digest":"6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7","integrity":"sha256-bQU/TW4UEnRXSfyNmBgz1tf48ZtyBC0aZeM1bKKafvc="},"flags/1x1/us-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2017-08-18T23:12:22+02:00","size":6201,"digest":"5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435","integrity":"sha256-W89dQaptX9v8kgoBT8d9bNvfN7205n2/5o7RYbrkpDU="},"flags/4x3/uy-3fc569672f687b4f08581179bea609b616d4b5c7d9524df918134fbcdfce6f9f.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2017-08-18T23:12:22+02:00","size":1753,"digest":"3fc569672f687b4f08581179bea609b616d4b5c7d9524df918134fbcdfce6f9f","integrity":"sha256-P8VpZy9oe08IWBF5vqYJthbUtcfZUk35GBNPvN/Ob58="},"flags/1x1/uy-90def9dd4890c96d1b6355d0bbcebe2a6f25e2bb3bbdc29c4fbba8a5fc601254.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2017-08-18T23:12:22+02:00","size":1758,"digest":"90def9dd4890c96d1b6355d0bbcebe2a6f25e2bb3bbdc29c4fbba8a5fc601254","integrity":"sha256-kN753UiQyW0bY1XQu86+Km8l4rs7vcKcT7uopfxgElQ="},"flags/4x3/uz-e3f628aff038df64725d75a863bc636ae9da4a16f58850ad86470cc012e3a40f.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2017-08-18T23:12:22+02:00","size":1465,"digest":"e3f628aff038df64725d75a863bc636ae9da4a16f58850ad86470cc012e3a40f","integrity":"sha256-4/Yor/A432RyXXWoY7xjaunaShb1iFCthkcMwBLjpA8="},"flags/1x1/uz-db8cba32635e9c36565f28fbd6b17e1e5afe26ce0af8560eeda3f9d815ecc749.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2017-08-18T23:12:22+02:00","size":1487,"digest":"db8cba32635e9c36565f28fbd6b17e1e5afe26ce0af8560eeda3f9d815ecc749","integrity":"sha256-24y6MmNenDZWXyj71rF+Hlr+Js4K+FYO7aP52BXsx0k="},"flags/4x3/va-c8b81b061cbe7a9b0b5f376e10f1a863b4609c742dbb5663ef923b80d43984a2.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2017-08-18T23:12:22+02:00","size":114058,"digest":"c8b81b061cbe7a9b0b5f376e10f1a863b4609c742dbb5663ef923b80d43984a2","integrity":"sha256-yLgbBhy+epsLXzduEPGoY7RgnHQtu1Zj75I7gNQ5hKI="},"flags/1x1/va-d267dbb1213d75780a8d41a34f9eba098a66973c1c2e7d974257f24b4be9df1c.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2017-08-18T23:12:22+02:00","size":113397,"digest":"d267dbb1213d75780a8d41a34f9eba098a66973c1c2e7d974257f24b4be9df1c","integrity":"sha256-0mfbsSE9dXgKjUGjT566CYpmlzwcLn2XQlfyS0vp3xw="},"flags/4x3/vc-a578edb2904169d050107b4c02051531e4164120c4ac0ad19faabd41fccdd821.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2017-08-18T23:12:22+02:00","size":518,"digest":"a578edb2904169d050107b4c02051531e4164120c4ac0ad19faabd41fccdd821","integrity":"sha256-pXjtspBBadBQEHtMAgUVMeQWQSDErArRn6q9QfzN2CE="},"flags/1x1/vc-85bbaa2c82ed6a9e077e73501bbf071956c761a897d1c4e1bbe061ad5ca9c0ed.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2017-08-18T23:12:22+02:00","size":597,"digest":"85bbaa2c82ed6a9e077e73501bbf071956c761a897d1c4e1bbe061ad5ca9c0ed","integrity":"sha256-hbuqLILtap4HfnNQG78HGVbHYaiX0cThu+BhrVypwO0="},"flags/4x3/ve-77718854ace7f0a8d8a087e331112e4b20f76e9ca7eeb9af41bacccef09bc9b4.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2017-08-18T23:12:22+02:00","size":1199,"digest":"77718854ace7f0a8d8a087e331112e4b20f76e9ca7eeb9af41bacccef09bc9b4","integrity":"sha256-d3GIVKzn8KjYoIfjMREuSyD3bpyn7rmvQbrMzvCbybQ="},"flags/1x1/ve-27cf5f75e9b842c417f62e3c3c502acafb67db674d5a1eba8709371c186f0fe9.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2017-08-18T23:12:22+02:00","size":1229,"digest":"27cf5f75e9b842c417f62e3c3c502acafb67db674d5a1eba8709371c186f0fe9","integrity":"sha256-J89fdem4QsQX9i48PFAqyvtn22dNWh66hwk3HBhvD+k="},"flags/4x3/vg-cefdd08a49ab6cf0ce32bf42cb7a72513dfd0a1619bac86ebedee3a86fa35c80.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2017-08-18T23:12:22+02:00","size":34914,"digest":"cefdd08a49ab6cf0ce32bf42cb7a72513dfd0a1619bac86ebedee3a86fa35c80","integrity":"sha256-zv3QikmrbPDOMr9Cy3pyUT39ChYZushuvt7jqG+jXIA="},"flags/1x1/vg-45357a28f1dc16c13df5cfc44454ff28f082b90a4747898d27575650bc93cb1e.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2017-08-18T23:12:22+02:00","size":34418,"digest":"45357a28f1dc16c13df5cfc44454ff28f082b90a4747898d27575650bc93cb1e","integrity":"sha256-RTV6KPHcFsE99c/ERFT/KPCCuQpHR4mNJ1dWULyTyx4="},"flags/4x3/vi-a83bcb200832191afa4091bf2c275289aa37f664027dfce6db6b0f7109fe3b6a.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2017-08-18T23:12:22+02:00","size":12347,"digest":"a83bcb200832191afa4091bf2c275289aa37f664027dfce6db6b0f7109fe3b6a","integrity":"sha256-qDvLIAgyGRr6QJG/LCdSiao39mQCffzm22sPcQn+O2o="},"flags/1x1/vi-cf017aea4123b31f1cf60087c4742b6d57a4213bece5b3f760e16a84a811a74c.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2017-08-18T23:12:22+02:00","size":12314,"digest":"cf017aea4123b31f1cf60087c4742b6d57a4213bece5b3f760e16a84a811a74c","integrity":"sha256-zwF66kEjsx8c9gCHxHQrbVekITvs5bP3YOFqhKgRp0w="},"flags/4x3/vn-16730ca8238b081b7376fc3829eaac4ddd61a5b423c24c9f07c9a02848c4827f.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2017-08-18T23:12:22+02:00","size":560,"digest":"16730ca8238b081b7376fc3829eaac4ddd61a5b423c24c9f07c9a02848c4827f","integrity":"sha256-FnMMqCOLCBtzdvw4KeqsTd1hpbQjwkyfB8mgKEjEgn8="},"flags/1x1/vn-fa15ba0b7d997046ffb7f2469f1254f7119503f2e95b35467151a947ff9b45d6.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2017-08-18T23:12:22+02:00","size":571,"digest":"fa15ba0b7d997046ffb7f2469f1254f7119503f2e95b35467151a947ff9b45d6","integrity":"sha256-+hW6C32ZcEb/t/JGnxJU9xGVA/LpWzVGcVGpR/+bRdY="},"flags/4x3/vu-4e084d69e403d0af11dfc47f622fb2ba88649b17b2038f6ebf533ce3c9907404.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2017-08-18T23:12:22+02:00","size":5820,"digest":"4e084d69e403d0af11dfc47f622fb2ba88649b17b2038f6ebf533ce3c9907404","integrity":"sha256-TghNaeQD0K8R38R/Yi+yuohkmxeyA49uv1M848mQdAQ="},"flags/1x1/vu-3c93d045c0ec3c08c0e9af785016995cbd7a28ddf08ec9abfce0e39c4e842058.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2017-08-18T23:12:22+02:00","size":5783,"digest":"3c93d045c0ec3c08c0e9af785016995cbd7a28ddf08ec9abfce0e39c4e842058","integrity":"sha256-PJPQRcDsPAjA6a94UBaZXL16KN3wjsmr/ODjnE6EIFg="},"flags/4x3/wf-039b39c2ab1d92470427e12e2310b2ad9d8a97a36a064b197858a083f5d7fd23.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2017-08-18T23:12:22+02:00","size":322,"digest":"039b39c2ab1d92470427e12e2310b2ad9d8a97a36a064b197858a083f5d7fd23","integrity":"sha256-A5s5wqsdkkcEJ+EuIxCyrZ2Kl6NqBksZeFigg/XX/SM="},"flags/1x1/wf-94672c2e6f10547f0023b9f0fff3adfda4d60f91340f287767f1ce68e5a57a12.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2017-08-18T23:12:22+02:00","size":310,"digest":"94672c2e6f10547f0023b9f0fff3adfda4d60f91340f287767f1ce68e5a57a12","integrity":"sha256-lGcsLm8QVH8AI7nw//Ot/aTWD5E0Dyh3Z/HOaOWlehI="},"flags/4x3/ws-f91aa288555a505b3e965c781de8207e2cb6e1d165603c80c54cfb111d277874.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2017-08-18T23:12:22+02:00","size":901,"digest":"f91aa288555a505b3e965c781de8207e2cb6e1d165603c80c54cfb111d277874","integrity":"sha256-+RqiiFVaUFs+llx4Heggfiy24dFlYDyAxUz7ER0neHQ="},"flags/1x1/ws-e6b2a35c9702941a1fe9d84ab2bf8b28b4931b6fce24efb4ce63d3a8fb8c3b90.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2017-08-18T23:12:22+02:00","size":879,"digest":"e6b2a35c9702941a1fe9d84ab2bf8b28b4931b6fce24efb4ce63d3a8fb8c3b90","integrity":"sha256-5rKjXJcClBof6dhKsr+LKLSTG2/OJO+0zmPTqPuMO5A="},"flags/4x3/ye-f3c80f7f99e1f12a079fe0d96830005657aff1687da92391c0acb882b014ff8c.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2017-08-18T23:12:22+02:00","size":287,"digest":"f3c80f7f99e1f12a079fe0d96830005657aff1687da92391c0acb882b014ff8c","integrity":"sha256-88gPf5nh8SoHn+DZaDAAVlev8Wh9qSORwKy4grAU/4w="},"flags/1x1/ye-a9b9b54ec295aed99c5439093242110193626524d336cc3115864e5ec0b787da.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2017-08-18T23:12:22+02:00","size":298,"digest":"a9b9b54ec295aed99c5439093242110193626524d336cc3115864e5ec0b787da","integrity":"sha256-qbm1TsKVrtmcVDkJMkIRAZNiZSTTNswxFYZOXsC3h9o="},"flags/4x3/yt-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2017-08-18T23:12:22+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/yt-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2017-08-18T23:12:22+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/za-57f1167ce07b3f345798c69ca8f159cb159f5dccb3c101616cc007ef1f2663d6.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2017-08-18T23:12:22+02:00","size":1085,"digest":"57f1167ce07b3f345798c69ca8f159cb159f5dccb3c101616cc007ef1f2663d6","integrity":"sha256-V/EWfOB7PzRXmMacqPFZyxWfXcyzwQFhbMAH7x8mY9Y="},"flags/1x1/za-79fe7bd792f8b520caaa2c3db12ab5138cf24867d344a38167580ab6243322b1.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2017-08-18T23:12:22+02:00","size":1033,"digest":"79fe7bd792f8b520caaa2c3db12ab5138cf24867d344a38167580ab6243322b1","integrity":"sha256-ef5715L4tSDKqiw9sSq1E4zySGfTRKOBZ1gKtiQzIrE="},"flags/4x3/zm-9a1622c4151a7379ecc32434948be48ba5af564e136232d1eb6e2a4dfec3baa9.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2017-08-18T23:12:22+02:00","size":8223,"digest":"9a1622c4151a7379ecc32434948be48ba5af564e136232d1eb6e2a4dfec3baa9","integrity":"sha256-mhYixBUac3nswyQ0lIvki6WvVk4TYjLR624qTf7Duqk="},"flags/1x1/zm-7bc0c09a0b3fd9f0dd01481080be99465d71218ac0679fbb077086f24835433e.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2017-08-18T23:12:22+02:00","size":8281,"digest":"7bc0c09a0b3fd9f0dd01481080be99465d71218ac0679fbb077086f24835433e","integrity":"sha256-e8DAmgs/2fDdAUgQgL6ZRl1xIYrAZ5+7B3CG8kg1Qz4="},"flags/4x3/zw-2576570465c39038f092c242d89e300a0943c50c090c922bc3bd9c8af9161478.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2017-08-18T23:12:22+02:00","size":3083,"digest":"2576570465c39038f092c242d89e300a0943c50c090c922bc3bd9c8af9161478","integrity":"sha256-JXZXBGXDkDjwksJC2J4wCglDxQwJDJIrw72civkWFHg="},"flags/1x1/zw-4ee873fa4e174f8d150c672917c8f506b530edcca86288e4b7942c7c74a63caf.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2017-08-18T23:12:22+02:00","size":2985,"digest":"4ee873fa4e174f8d150c672917c8f506b530edcca86288e4b7942c7c74a63caf","integrity":"sha256-Tuhz+k4XT40VDGcpF8j1BrUw7cyoYojkt5QsfHSmPK8="},"flags/4x3/eu-ca89dc2597154e6887930fd8bdf47636f82dc13c02d9610a3da2d156f09265d0.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2017-08-18T23:12:22+02:00","size":1289,"digest":"ca89dc2597154e6887930fd8bdf47636f82dc13c02d9610a3da2d156f09265d0","integrity":"sha256-yoncJZcVTmiHkw/YvfR2NvgtwTwC2WEKPaLRVvCSZdA="},"flags/1x1/eu-73d6f1f646500e1dc04ca798c0d192f9174268e3480a8b1d742004919b7463f9.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2017-08-18T23:12:22+02:00","size":1290,"digest":"73d6f1f646500e1dc04ca798c0d192f9174268e3480a8b1d742004919b7463f9","integrity":"sha256-c9bx9kZQDh3ATKeYwNGS+RdCaONICosddCAEkZt0Y/k="},"flags/4x3/gb-eng-ec744a15618e0a99abee9e53b70985e4cbf2fc2b7051cf239d6dd19b302e4ae9.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2017-08-18T23:12:22+02:00","size":253,"digest":"ec744a15618e0a99abee9e53b70985e4cbf2fc2b7051cf239d6dd19b302e4ae9","integrity":"sha256-7HRKFWGOCpmr7p5TtwmF5Mvy/CtwUc8jnW3RmzAuSuk="},"flags/1x1/gb-eng-b1650bba14f5fa14df73f964c3b3dfeca8e1d48c19f1f9b3fded729cc96cf39d.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2017-08-18T23:12:22+02:00","size":258,"digest":"b1650bba14f5fa14df73f964c3b3dfeca8e1d48c19f1f9b3fded729cc96cf39d","integrity":"sha256-sWULuhT1+hTfc/lkw7Pf7Kjh1IwZ8fmz/e1ynMls850="},"flags/4x3/gb-nir-0a09e794313d063a01d817f3ae931054dc9baddd38cfb9a0e4b3c9fa5852bc41.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2017-08-18T23:12:22+02:00","size":34786,"digest":"0a09e794313d063a01d817f3ae931054dc9baddd38cfb9a0e4b3c9fa5852bc41","integrity":"sha256-CgnnlDE9BjoB2BfzrpMQVNybrd04z7mg5LPJ+lhSvEE="},"flags/1x1/gb-nir-c54214991841f1e32a4aaee502c6a7bde3ec3b43c0e74886d9bc7112f652035a.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2017-08-18T23:12:22+02:00","size":35668,"digest":"c54214991841f1e32a4aaee502c6a7bde3ec3b43c0e74886d9bc7112f652035a","integrity":"sha256-xUIUmRhB8eMqSq7lAsanvePsO0PA50iG2bxxEvZSA1o="},"flags/4x3/gb-sct-c78f4e58aa162732c0a401eebe714a632ed03c5171a13bb98eb67365b338a0ab.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2017-08-18T23:12:22+02:00","size":242,"digest":"c78f4e58aa162732c0a401eebe714a632ed03c5171a13bb98eb67365b338a0ab","integrity":"sha256-x49OWKoWJzLApAHuvnFKYy7QPFFxoTu5jrZzZbM4oKs="},"flags/1x1/gb-sct-4983d57dfd37f55b40b22dddfeefef38d2113818914755ee830c61b97549aaf3.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2017-08-18T23:12:22+02:00","size":250,"digest":"4983d57dfd37f55b40b22dddfeefef38d2113818914755ee830c61b97549aaf3","integrity":"sha256-SYPVff039VtAsi3d/u/vONIROBiRR1XugwxhuXVJqvM="},"flags/4x3/gb-wls-963f0b8dfe114a50032ae1db25542a12d2032a30d88bbfd4698e30f50e752e31.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2017-08-18T23:12:22+02:00","size":14488,"digest":"963f0b8dfe114a50032ae1db25542a12d2032a30d88bbfd4698e30f50e752e31","integrity":"sha256-lj8Ljf4RSlADKuHbJVQqEtIDKjDYi7/UaY4w9Q51LjE="},"flags/1x1/gb-wls-7d5a4120e3e0f7618bde0d4270b0c097f18472e6b1a285918d11538fb001cb60.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2017-08-18T23:12:22+02:00","size":14312,"digest":"7d5a4120e3e0f7618bde0d4270b0c097f18472e6b1a285918d11538fb001cb60","integrity":"sha256-fVpBIOPg92GL3g1CcLDAl/GEcuaxooWRjRFTj7ABy2A="},"flags/4x3/un-c75bef804cdbe6617032bfb0332f009c144b1317cb073e71deb5619fbedefcdb.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2017-08-18T23:12:22+02:00","size":31012,"digest":"c75bef804cdbe6617032bfb0332f009c144b1317cb073e71deb5619fbedefcdb","integrity":"sha256-x1vvgEzb5mFwMr+wMy8AnBRLExfLBz5x3rVhn77e/Ns="},"flags/1x1/un-ccaaa4bfae7e430b8bd72ddfa6fb07f167c1001490fd247a37898f4632803b1e.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2017-08-18T23:12:22+02:00","size":32142,"digest":"ccaaa4bfae7e430b8bd72ddfa6fb07f167c1001490fd247a37898f4632803b1e","integrity":"sha256-zKqkv65+QwuL1y3fpvsH8WfBABSQ/SR6N4mPRjKAOx4="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2017-04-24T19:17:40+02:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2017-04-24T19:17:40+02:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2017-04-24T19:17:40+02:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2017-04-24T19:17:40+02:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2017-04-24T19:17:40+02:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"markers-soft-e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739.png":{"logical_path":"markers-soft.png","mtime":"2016-05-21T23:41:15+02:00","size":41226,"digest":"e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739","integrity":"sha256-54eE5O1wqv/d1zwxX6tZAjPMTntyOI191HoUeW/Hxzk="},"markers-shadow-8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20.png":{"logical_path":"markers-shadow.png","mtime":"2016-05-21T23:41:15+02:00","size":535,"digest":"8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20","integrity":"sha256-hwOiJicQ9ePSnmXSrN+Q1lEuFZ4RnSe4I0cx2KYgiiA="},"markers-soft@2x-c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf.png":{"logical_path":"markers-soft@2x.png","mtime":"2016-05-21T23:41:15+02:00","size":66408,"digest":"c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf","integrity":"sha256-wedyU6i/vjDOwkiF1wRvRDt267ZvTJYfdwg7A/Sly68="},"markers-shadow@2x-b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a.png":{"logical_path":"markers-shadow@2x.png","mtime":"2016-05-21T23:41:15+02:00","size":1469,"digest":"b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a","integrity":"sha256-shpTa+JzE/tQT2n1iZ/wsSRbJ2VxdprAjWwyw1Z25Ho="},"leaflet/dist/images/layers-1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6.png":{"logical_path":"leaflet/dist/images/layers.png","mtime":"2017-08-18T23:12:10+02:00","size":696,"digest":"1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6","integrity":"sha256-Hbvp0CjikvNvy6j4s6KNXokydU/CIVuaxp5M3s9RB8Y="},"leaflet/dist/images/layers-2x-066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf.png":{"logical_path":"leaflet/dist/images/layers-2x.png","mtime":"2017-08-18T23:12:10+02:00","size":1259,"digest":"066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf","integrity":"sha256-Bm2sqFDY/77wB68AsG6sABVyje4nnFHzy2xxbffELt8="},"leaflet/dist/images/marker-icon-574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437.png":{"logical_path":"leaflet/dist/images/marker-icon.png","mtime":"2017-08-18T23:12:10+02:00","size":1466,"digest":"574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437","integrity":"sha256-V0w6XMqF9BFAhbaEFZbWLwDXyJLHsD8oy/owHesdxDc="},"regions/CA-QC-776d563b6a4ac4312cae9f0bfe630c20711346e8dbddd41040998eba79f4b588.png":{"logical_path":"regions/CA-QC.png","mtime":"2015-10-22T22:54:30+02:00","size":567,"digest":"776d563b6a4ac4312cae9f0bfe630c20711346e8dbddd41040998eba79f4b588","integrity":"sha256-d21WO2pKxDEsrp8L/mMMIHETRujb3dQQQJmOunn0tYg="},"modernizr-654222debe8018b12f1993ceddff30dc163a7d5008d79869c399d6d167321f97.js":{"logical_path":"modernizr.js","mtime":"2017-04-24T19:16:49+02:00","size":51365,"digest":"654222debe8018b12f1993ceddff30dc163a7d5008d79869c399d6d167321f97","integrity":"sha256-ZUIi3r6AGLEvGZPO3f8w3BY6fVAI15hpw5nW0WcyH5c="},"agendadescommuns-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png":{"logical_path":"agendadescommuns.png","mtime":"2015-10-22T22:54:30+02:00","size":2760,"digest":"cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6","integrity":"sha256-zUDjQgJL4Fh/jnoOOQLTLPZwCdNJtnwA9ofgSZ/en/Y="},"alert-762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906.png":{"logical_path":"alert.png","mtime":"2014-07-04T14:08:56+02:00","size":47876,"digest":"762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906","integrity":"sha256-dirOlHkygkOkQGE0a2TE1rmX6WPGjfxr3dnk0kEZKQY="},"baby_gnu_adl-232caf355c30740d5d9b30491887cd546b8849b33ca9bdb6cc71f8a47ea61815.png":{"logical_path":"baby_gnu_adl.png","mtime":"2016-09-11T17:42:49+02:00","size":10155,"digest":"232caf355c30740d5d9b30491887cd546b8849b33ca9bdb6cc71f8a47ea61815","integrity":"sha256-IyyvNVwwdA1dmzBJGIfNVGuISbM8qb22zHH4pH6mGBU="},"baby_gnu_adl-97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e.svg":{"logical_path":"baby_gnu_adl.svg","mtime":"2016-09-11T17:42:49+02:00","size":109635,"digest":"97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e","integrity":"sha256-lyUQBdMiXPHVi4xJfWt5BdvJVgzIrNUBGPzOYNCiZ54="},"communs-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png":{"logical_path":"communs.png","mtime":"2015-10-22T22:54:30+02:00","size":2760,"digest":"cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6","integrity":"sha256-zUDjQgJL4Fh/jnoOOQLTLPZwCdNJtnwA9ofgSZ/en/Y="},"lef-small-160cf5b883add60c9c0f4361bd8425c75f6fb23b0e551a0b941fa0491c70e0c9.png":{"logical_path":"lef-small.png","mtime":"2015-03-29T11:07:15+02:00","size":1089,"digest":"160cf5b883add60c9c0f4361bd8425c75f6fb23b0e551a0b941fa0491c70e0c9","integrity":"sha256-Fgz1uIOt1gycD0NhvYQlx19vsjsOVRoLlB+gSRxw4Mk="},"lef-9fcdd7ddd4d40de29c3809b59688c668b85f5628e219d4cd8a8810b72a64533b.png":{"logical_path":"lef.png","mtime":"2017-01-07T19:07:36+01:00","size":8332,"digest":"9fcdd7ddd4d40de29c3809b59688c668b85f5628e219d4cd8a8810b72a64533b","integrity":"sha256-n83X3dTUDeKcOAm1lojGaLhfVijiGdTNiogQtypkUzs="},"priorite-logiciel-libre-je-soutiens-april_2_m-6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc.png":{"logical_path":"priorite-logiciel-libre-je-soutiens-april_2_m.png","mtime":"2015-10-22T22:54:30+02:00","size":16952,"digest":"6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc","integrity":"sha256-ZELkVOlu1FzB68QGc6bFC9KGucKOpqi1hXLpT31kWfw="},"team-cb04c7a311f7160c4eb6a281eae68be84f26991dde5d415bb4e205e6726ae275.png":{"logical_path":"team.png","mtime":"2014-07-04T14:08:56+02:00","size":3586,"digest":"cb04c7a311f7160c4eb6a281eae68be84f26991dde5d415bb4e205e6726ae275","integrity":"sha256-ywTHoxH3FgxOtqKB6uaL6E8mmR3eXUFbtOIF5nJq4nU="},"application-7a3f00de5ab63c63aeb8d9d4911869e3ee0ac0e05c869adbfdb78ba2a79dd517.js":{"logical_path":"application.js","mtime":"2017-10-08T00:43:01+02:00","size":2822533,"digest":"7a3f00de5ab63c63aeb8d9d4911869e3ee0ac0e05c869adbfdb78ba2a79dd517","integrity":"sha256-ej8A3lq2PGOuuNnUkRhp4+4KwOBchprb/beLoqed1Rc="},"markers-matte-497826545a90e09a240504d14530eba45823b19fd44175e09e27c47cd822ddb9.png":{"logical_path":"markers-matte.png","mtime":"2016-05-21T23:41:15+02:00","size":14323,"digest":"497826545a90e09a240504d14530eba45823b19fd44175e09e27c47cd822ddb9","integrity":"sha256-SXgmVFqQ4JokBQTRRTDrpFgjsZ/UQXXgnifEfNgi3bk="},"markers-matte@2x-948fc8c4426f04f60964ed20394247f45b0b60e575d02398b9b6810e7a29a823.png":{"logical_path":"markers-matte@2x.png","mtime":"2016-05-21T23:41:15+02:00","size":31113,"digest":"948fc8c4426f04f60964ed20394247f45b0b60e575d02398b9b6810e7a29a823","integrity":"sha256-lI/IxEJvBPYJZO0gOUJH9FsLYOV10COYubaBDnopqCM="},"markers-plain-cf233423aa44e75ac0031e77b8ba571cd3331010517e1197e63fb7b06856c1ff.png":{"logical_path":"markers-plain.png","mtime":"2016-05-21T23:41:15+02:00","size":7946,"digest":"cf233423aa44e75ac0031e77b8ba571cd3331010517e1197e63fb7b06856c1ff","integrity":"sha256-zyM0I6pE51rAAx53uLpXHNMzEBBRfhGX5j+3sGhWwf8="},"leaflet/dist/images/marker-icon-2x-2d77a2e4c2f08bbac41808324ef946b9a2fe61b6150480d011b72b379c3b238d.png":{"logical_path":"leaflet/dist/images/marker-icon-2x.png","mtime":"2017-08-18T23:12:10+02:00","size":2586,"digest":"2d77a2e4c2f08bbac41808324ef946b9a2fe61b6150480d011b72b379c3b238d","integrity":"sha256-LXei5MLwi7rEGAgyTvlGuaL+YbYVBIDQEbcrN5w7I40="},"leaflet/dist/images/marker-shadow-264f5c640339f042dd729062cfc04c17f8ea0f29882b538e3848ed8f10edb4da.png":{"logical_path":"leaflet/dist/images/marker-shadow.png","mtime":"2017-08-18T23:12:10+02:00","size":618,"digest":"264f5c640339f042dd729062cfc04c17f8ea0f29882b538e3848ed8f10edb4da","integrity":"sha256-Jk9cZAM58ELdcpBiz8BMF/jqDymIK1OOOEjtjxDttNo="},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-ae65a7ae22c4c23115948fdeb5c05c9137dbd13ca2d426b3c4c3c4183451e410.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2017-04-24T19:17:54+02:00","size":86,"digest":"ae65a7ae22c4c23115948fdeb5c05c9137dbd13ca2d426b3c4c3c4183451e410","integrity":"sha256-rmWnriLEwjEVlI/etcBckTfb0Tyi1CazxMPEGDRR5BA="},"tinymce/langs/ar-e47a394dbc461d20aa547fa0c2027a9dad45fe55e18adb0da309045be6ed4109.js":{"logical_path":"tinymce/langs/ar.js","mtime":"2017-04-24T19:17:55+02:00","size":17776,"digest":"e47a394dbc461d20aa547fa0c2027a9dad45fe55e18adb0da309045be6ed4109","integrity":"sha256-5Ho5TbxGHSCqVH+gwgJ6na1F/lXhitsNowkEW+btQQk="},"tinymce/langs/ar_SA-24b62c76e99e114ae44480a67edbacf74f9fed0ff7afbeacce4966f1bc80333b.js":{"logical_path":"tinymce/langs/ar_SA.js","mtime":"2017-04-24T19:17:55+02:00","size":10003,"digest":"24b62c76e99e114ae44480a67edbacf74f9fed0ff7afbeacce4966f1bc80333b","integrity":"sha256-JLYsdumeEUrkRICmftus90+f7Q/3r76szklm8byAMzs="},"tinymce/langs/az-d40cecd6eb423f910f528ae98dcdaba4c2449802621759437174cf8c8c0d5b25.js":{"logical_path":"tinymce/langs/az.js","mtime":"2017-04-24T19:17:55+02:00","size":9680,"digest":"d40cecd6eb423f910f528ae98dcdaba4c2449802621759437174cf8c8c0d5b25","integrity":"sha256-1Azs1utCP5EPUorpjc2rpMJEmAJiF1lDcXTPjIwNWyU="},"tinymce/langs/be-42e2884c0f2394afa1a17e31e702660eeea0d84618bbd18155cb0313c6eb5f69.js":{"logical_path":"tinymce/langs/be.js","mtime":"2017-04-24T19:17:55+02:00","size":21064,"digest":"42e2884c0f2394afa1a17e31e702660eeea0d84618bbd18155cb0313c6eb5f69","integrity":"sha256-QuKITA8jlK+hoX4x5wJmDu6g2EYYu9GBVcsDE8brX2k="},"tinymce/langs/bg_BG-2fac9d785519d2791d42881fcc08c6a82e841575785690259d7f64e1b88d7db3.js":{"logical_path":"tinymce/langs/bg_BG.js","mtime":"2017-04-24T19:17:55+02:00","size":23945,"digest":"2fac9d785519d2791d42881fcc08c6a82e841575785690259d7f64e1b88d7db3","integrity":"sha256-L6ydeFUZ0nkdQogfzAjGqC6EFXV4VpAlnX9k4biNfbM="},"tinymce/langs/bn_BD-ef48a9094445dfa624af0c35902f60b7949b30585b5e9bc760a225fe2c07cbd3.js":{"logical_path":"tinymce/langs/bn_BD.js","mtime":"2017-04-24T19:17:55+02:00","size":6846,"digest":"ef48a9094445dfa624af0c35902f60b7949b30585b5e9bc760a225fe2c07cbd3","integrity":"sha256-70ipCURF36Ykrww1kC9gt5SbMFhbXpvHYKIl/iwHy9M="},"tinymce/langs/bs-eb66c6d6910a30b950d7a0e784027ed288e6e5a2c6db7741da3359f2067e2e0e.js":{"logical_path":"tinymce/langs/bs.js","mtime":"2017-04-24T19:17:55+02:00","size":6970,"digest":"eb66c6d6910a30b950d7a0e784027ed288e6e5a2c6db7741da3359f2067e2e0e","integrity":"sha256-62bG1pEKMLlQ16DnhAJ+0ojm5aLG23dB2jNZ8gZ+Lg4="},"tinymce/langs/ca-77ab49d6420318ed7f5fd51b6856bc396c393095bd78ea91dad83e38e5859637.js":{"logical_path":"tinymce/langs/ca.js","mtime":"2017-04-24T19:17:55+02:00","size":7787,"digest":"77ab49d6420318ed7f5fd51b6856bc396c393095bd78ea91dad83e38e5859637","integrity":"sha256-d6tJ1kIDGO1/X9UbaFa8OWw5MJW9eOqR2tg+OOWFljc="},"tinymce/langs/cs-3d7ecd619895e3e4c7e1db06f6526682ef88f22f6e8b50d7b45ed0ae7c206714.js":{"logical_path":"tinymce/langs/cs.js","mtime":"2017-04-24T19:17:55+02:00","size":8751,"digest":"3d7ecd619895e3e4c7e1db06f6526682ef88f22f6e8b50d7b45ed0ae7c206714","integrity":"sha256-PX7NYZiV4+TH4dsG9lJmgu+I8i9ui1DXtF7QrnwgZxQ="},"tinymce/langs/cs_CZ-4b0778d233e200dea350f8361129da2844e23d1c0f2d524aeffa6d34e581368d.js":{"logical_path":"tinymce/langs/cs_CZ.js","mtime":"2017-04-24T19:17:55+02:00","size":8399,"digest":"4b0778d233e200dea350f8361129da2844e23d1c0f2d524aeffa6d34e581368d","integrity":"sha256-Swd40jPiAN6jUPg2ESnaKETiPRwPLVJK7/ptNOWBNo0="},"tinymce/langs/cy-a847ff54657ccf76eec362cc14fbc63adb4c67f9b1de023b29d817aba4fec062.js":{"logical_path":"tinymce/langs/cy.js","mtime":"2017-04-24T19:17:55+02:00","size":6142,"digest":"a847ff54657ccf76eec362cc14fbc63adb4c67f9b1de023b29d817aba4fec062","integrity":"sha256-qEf/VGV8z3buw2LMFPvGOttMZ/mx3gI7KdgXq6T+wGI="},"tinymce/langs/da-a87f3ae1c442c3bb26b81569687e98072d038269360361ec9728f00d6b17c282.js":{"logical_path":"tinymce/langs/da.js","mtime":"2017-04-24T19:17:55+02:00","size":7513,"digest":"a87f3ae1c442c3bb26b81569687e98072d038269360361ec9728f00d6b17c282","integrity":"sha256-qH864cRCw7smuBVpaH6YBy0Dgmk2A2HslyjwDWsXwoI="},"tinymce/langs/de-a10c8f6f1e53da776e7026dffd54ea8ba527492b767e5b54ae5c3974f6953311.js":{"logical_path":"tinymce/langs/de.js","mtime":"2017-04-24T19:17:55+02:00","size":8280,"digest":"a10c8f6f1e53da776e7026dffd54ea8ba527492b767e5b54ae5c3974f6953311","integrity":"sha256-oQyPbx5T2nducCbf/VTqi6UnSSt2fltUrlw5dPaVMxE="},"tinymce/langs/de_AT-a32eec12ce12b06fc2c8919d2372242e9596712c96dc9bcfff1fc8b7dc458627.js":{"logical_path":"tinymce/langs/de_AT.js","mtime":"2017-04-24T19:17:55+02:00","size":8308,"digest":"a32eec12ce12b06fc2c8919d2372242e9596712c96dc9bcfff1fc8b7dc458627","integrity":"sha256-oy7sEs4SsG/CyJGdI3IkLpWWcSyW3JvP/x/It9xFhic="},"tinymce/langs/dv-182756bf33409a8b76bc684d0a2ab86881718c360d1f1fb3fbc609ce3f5e3f49.js":{"logical_path":"tinymce/langs/dv.js","mtime":"2017-04-24T19:17:55+02:00","size":18100,"digest":"182756bf33409a8b76bc684d0a2ab86881718c360d1f1fb3fbc609ce3f5e3f49","integrity":"sha256-GCdWvzNAmot2vGhNCiq4aIFxjDYNHx+z+8YJzj9eP0k="},"tinymce/langs/el-6bbdbf3ccb2b2f22f961eb6749b43fe401c84fd6d89cd3f76a538dc2d06bb071.js":{"logical_path":"tinymce/langs/el.js","mtime":"2017-04-24T19:17:55+02:00","size":22973,"digest":"6bbdbf3ccb2b2f22f961eb6749b43fe401c84fd6d89cd3f76a538dc2d06bb071","integrity":"sha256-a72/PMsrLyL5YetnSbQ/5AHIT9bYnNP3alONwtBrsHE="},"tinymce/langs/en_CA-1a9457da814b0a1f15687a00f3ae4b38da0301445b52c29a423a38c943d9a431.js":{"logical_path":"tinymce/langs/en_CA.js","mtime":"2017-04-24T19:17:55+02:00","size":6916,"digest":"1a9457da814b0a1f15687a00f3ae4b38da0301445b52c29a423a38c943d9a431","integrity":"sha256-GpRX2oFLCh8VaHoA865LONoDAURbUsKaQjo4yUPZpDE="},"tinymce/langs/en_GB-a0f7752ff9ddf3ed3d2cd24fee04fe585bca0babc4ce655560c923ad386c0c07.js":{"logical_path":"tinymce/langs/en_GB.js","mtime":"2017-04-24T19:17:55+02:00","size":5907,"digest":"a0f7752ff9ddf3ed3d2cd24fee04fe585bca0babc4ce655560c923ad386c0c07","integrity":"sha256-oPd1L/nd8+09LNJP7gT+WFvKC6vEzmVVYMkjrThsDAc="},"tinymce/langs/eo-cbac4d7ebcb0679845b852d9354e74586e78cf13eef82de1400cf6b465e203cd.js":{"logical_path":"tinymce/langs/eo.js","mtime":"2017-04-24T19:17:55+02:00","size":7466,"digest":"cbac4d7ebcb0679845b852d9354e74586e78cf13eef82de1400cf6b465e203cd","integrity":"sha256-y6xNfrywZ5hFuFLZNU50WG54zxPu+C3hQAz2tGXiA80="},"tinymce/langs/es-133cb5bd627c2a299544586bf365859b5a1c96c57d18c90e7853048434a809b6.js":{"logical_path":"tinymce/langs/es.js","mtime":"2017-04-24T19:17:55+02:00","size":7809,"digest":"133cb5bd627c2a299544586bf365859b5a1c96c57d18c90e7853048434a809b6","integrity":"sha256-Ezy1vWJ8KimVRFhr82WFm1oclsV9GMkOeFMEhDSoCbY="},"tinymce/langs/es_MX-352fcdff567919ff09a2e19c56d8059d339bffdbd999bcc82aa6d8340c19bbb9.js":{"logical_path":"tinymce/langs/es_MX.js","mtime":"2017-04-24T19:17:55+02:00","size":7894,"digest":"352fcdff567919ff09a2e19c56d8059d339bffdbd999bcc82aa6d8340c19bbb9","integrity":"sha256-NS/N/1Z5Gf8JouGcVtgFnTOb/9vZmbzIKqbYNAwZu7k="},"tinymce/langs/et-2cfc3da0ff39a37f0bd3c896d49604028f231ff0e7d8ebbc30dbfd4b87125f06.js":{"logical_path":"tinymce/langs/et.js","mtime":"2017-04-24T19:17:55+02:00","size":7784,"digest":"2cfc3da0ff39a37f0bd3c896d49604028f231ff0e7d8ebbc30dbfd4b87125f06","integrity":"sha256-LPw9oP85o38L08iW1JYEAo8jH/Dn2Ou8MNv9S4cSXwY="},"tinymce/langs/eu-8698ae4de236fcd490d0f45d485dbd33d8e9de6eb3db51191e1b4f8ea96a4d06.js":{"logical_path":"tinymce/langs/eu.js","mtime":"2017-04-24T19:17:55+02:00","size":7011,"digest":"8698ae4de236fcd490d0f45d485dbd33d8e9de6eb3db51191e1b4f8ea96a4d06","integrity":"sha256-hpiuTeI2/NSQ0PRdSF29M9jp3m6z21EZHhtPjqlqTQY="},"tinymce/langs/fa-7eff96595e93d4b0df484dd90c14b7b412966157ed8293f54429e9418882bdb2.js":{"logical_path":"tinymce/langs/fa.js","mtime":"2017-04-24T19:17:55+02:00","size":16462,"digest":"7eff96595e93d4b0df484dd90c14b7b412966157ed8293f54429e9418882bdb2","integrity":"sha256-fv+WWV6T1LDfSE3ZDBS3tBKWYVftgpP1RCnpQYiCvbI="},"tinymce/langs/fa_IR-2f9d33f16718ae9c1f3642905b58434ed2662fb66448c4d115b8491aa68e7904.js":{"logical_path":"tinymce/langs/fa_IR.js","mtime":"2017-04-24T19:17:55+02:00","size":17725,"digest":"2f9d33f16718ae9c1f3642905b58434ed2662fb66448c4d115b8491aa68e7904","integrity":"sha256-L50z8WcYrpwfNkKQW1hDTtJmL7ZkSMTRFbhJGqaOeQQ="},"tinymce/langs/fi-6ca2a93d045067a86e8ea973d0b89368054b15eb9b9625bf1ca871608a5cb77c.js":{"logical_path":"tinymce/langs/fi.js","mtime":"2017-04-24T19:17:55+02:00","size":8143,"digest":"6ca2a93d045067a86e8ea973d0b89368054b15eb9b9625bf1ca871608a5cb77c","integrity":"sha256-bKKpPQRQZ6hujqlz0LiTaAVLFeubliW/HKhxYIpct3w="},"tinymce/langs/fo-340609cecd5571e4eacb8fe7bd1343c8553d96d12610fb77d9a812dc6d3635fd.js":{"logical_path":"tinymce/langs/fo.js","mtime":"2017-04-24T19:17:55+02:00","size":8044,"digest":"340609cecd5571e4eacb8fe7bd1343c8553d96d12610fb77d9a812dc6d3635fd","integrity":"sha256-NAYJzs1VceTqy4/nvRNDyFU9ltEmEPt32agS3G02Nf0="},"tinymce/langs/fr_CH-e0f43c0f20727368ff0767f3bf099bc23eed9fe3e81f8bbe514381e786526928.js":{"logical_path":"tinymce/langs/fr_CH.js","mtime":"2017-04-24T19:17:55+02:00","size":8074,"digest":"e0f43c0f20727368ff0767f3bf099bc23eed9fe3e81f8bbe514381e786526928","integrity":"sha256-4PQ8DyByc2j/B2fzvwmbwj7tn+PoH4u+UUOB54ZSaSg="},"tinymce/langs/fr_FR-2702de7be93bd1e0d7120ae3c9e637061565186c66886f155ffca0663df25b4c.js":{"logical_path":"tinymce/langs/fr_FR.js","mtime":"2017-04-24T19:17:55+02:00","size":8009,"digest":"2702de7be93bd1e0d7120ae3c9e637061565186c66886f155ffca0663df25b4c","integrity":"sha256-JwLee+k70eDXEgrjyeY3BhVlGGxmiG8VX/ygZj3yW0w="},"tinymce/langs/ga-d2a3de6f28723d75b03f7f42fd3aedfd045d473425ee38f02350b56035383af1.js":{"logical_path":"tinymce/langs/ga.js","mtime":"2017-04-24T19:17:55+02:00","size":8591,"digest":"d2a3de6f28723d75b03f7f42fd3aedfd045d473425ee38f02350b56035383af1","integrity":"sha256-0qPebyhyPXWwP39C/Trt/QRdRzQl7jjwI1C1YDU4OvE="},"tinymce/langs/gd-0453e8b97bf3b6cca4065712ec59f20343ad6131735b38547e865177a1c1c490.js":{"logical_path":"tinymce/langs/gd.js","mtime":"2017-04-24T19:17:55+02:00","size":8808,"digest":"0453e8b97bf3b6cca4065712ec59f20343ad6131735b38547e865177a1c1c490","integrity":"sha256-BFPouXvztsykBlcS7FnyA0OtYTFzWzhUfoZRd6HBxJA="},"tinymce/langs/gl-1ff612222934f558870111f10934110c5656df3bb293c917e4eeceeb6605fcc5.js":{"logical_path":"tinymce/langs/gl.js","mtime":"2017-04-24T19:17:55+02:00","size":7066,"digest":"1ff612222934f558870111f10934110c5656df3bb293c917e4eeceeb6605fcc5","integrity":"sha256-H/YSIik09ViHARHxCTQRDFZW3zuyk8kX5O7O62YF/MU="},"tinymce/langs/he_IL-981f5250a4b8d404b37040ca5a35c30498cbeeb36e298d81bf1592b43fff7656.js":{"logical_path":"tinymce/langs/he_IL.js","mtime":"2017-04-24T19:17:55+02:00","size":16081,"digest":"981f5250a4b8d404b37040ca5a35c30498cbeeb36e298d81bf1592b43fff7656","integrity":"sha256-mB9SUKS41ASzcEDKWjXDBJjL7rNuKY2BvxWStD//dlY="},"tinymce/langs/hi_IN-695e0cdc22974fe45e0f35289f0249ddab87245165c9df765ec1b885ec55f0be.js":{"logical_path":"tinymce/langs/hi_IN.js","mtime":"2017-04-24T19:17:55+02:00","size":18458,"digest":"695e0cdc22974fe45e0f35289f0249ddab87245165c9df765ec1b885ec55f0be","integrity":"sha256-aV4M3CKXT+ReDzUonwJJ3auHJFFlyd92XsG4hexV8L4="},"tinymce/langs/hr-f77f1da2736d13f9a9a86ebf596f592fcc748f2975a0b9904b512d630f2c1a17.js":{"logical_path":"tinymce/langs/hr.js","mtime":"2017-04-24T19:17:55+02:00","size":7577,"digest":"f77f1da2736d13f9a9a86ebf596f592fcc748f2975a0b9904b512d630f2c1a17","integrity":"sha256-938donNtE/mpqG6/WW9ZL8x0jyl1oLmQS1EtYw8sGhc="},"tinymce/langs/hu_HU-1e22021a4f9c61919aa024041af555eac277bfc08ccb8c07fd329b87090a15e5.js":{"logical_path":"tinymce/langs/hu_HU.js","mtime":"2017-04-24T19:17:55+02:00","size":9410,"digest":"1e22021a4f9c61919aa024041af555eac277bfc08ccb8c07fd329b87090a15e5","integrity":"sha256-HiICGk+cYZGaoCQEGvVV6sJ3v8CMy4wH/TKbhwkKFeU="},"tinymce/langs/hy-0d384f3f82cd76793d3e7428a2140ea97f40a943f25ef99a2e3709a3e02b0930.js":{"logical_path":"tinymce/langs/hy.js","mtime":"2017-04-24T19:17:55+02:00","size":20375,"digest":"0d384f3f82cd76793d3e7428a2140ea97f40a943f25ef99a2e3709a3e02b0930","integrity":"sha256-DThPP4LNdnk9PnQoohQOqX9AqUPyXvmaLjcJo+ArCTA="},"tinymce/langs/id-e9fd018be745b5f14f4af47887420f98c590c607e01d57aca77ef5affe188523.js":{"logical_path":"tinymce/langs/id.js","mtime":"2017-04-24T19:17:55+02:00","size":7141,"digest":"e9fd018be745b5f14f4af47887420f98c590c607e01d57aca77ef5affe188523","integrity":"sha256-6f0Bi+dFtfFPSvR4h0IPmMWQxgfgHVesp371r/4YhSM="},"tinymce/langs/is_IS-c6e8c3e7b0e6b447faec3d8d258928f97c84558b29882c056513fb71cf237bfa.js":{"logical_path":"tinymce/langs/is_IS.js","mtime":"2017-04-24T19:17:55+02:00","size":7928,"digest":"c6e8c3e7b0e6b447faec3d8d258928f97c84558b29882c056513fb71cf237bfa","integrity":"sha256-xujD57DmtEf67D2NJYko+XyEVYspiCwFZRP7cc8je/o="},"tinymce/langs/it-25b5546d48c80ad666b600e5be3a05718b80645721b191785c1fafe1853f4a46.js":{"logical_path":"tinymce/langs/it.js","mtime":"2017-04-24T19:17:55+02:00","size":7598,"digest":"25b5546d48c80ad666b600e5be3a05718b80645721b191785c1fafe1853f4a46","integrity":"sha256-JbVUbUjICtZmtgDlvjoFcYuAZFchsZF4XB+v4YU/SkY="},"tinymce/langs/ja-80f0e7414030c32617ff651da1affa0bc85ee514fc9bc81f46edfd8ce0053ac0.js":{"logical_path":"tinymce/langs/ja.js","mtime":"2017-04-24T19:17:55+02:00","size":12290,"digest":"80f0e7414030c32617ff651da1affa0bc85ee514fc9bc81f46edfd8ce0053ac0","integrity":"sha256-gPDnQUAwwyYX/2Udoa/6C8he5RT8m8gfRu39jOAFOsA="},"tinymce/langs/ka_GE-3c6b82346a7070a8b6a15ae6e8faeecc5bfe63ad7e616b7de2e8ab8a75ec39c2.js":{"logical_path":"tinymce/langs/ka_GE.js","mtime":"2017-04-24T19:17:55+02:00","size":21284,"digest":"3c6b82346a7070a8b6a15ae6e8faeecc5bfe63ad7e616b7de2e8ab8a75ec39c2","integrity":"sha256-PGuCNGpwcKi2oVrm6PruzFv+Y61+YWt94uirinXsOcI="},"tinymce/langs/kab-3651d08aacd5bda15a04698f202bf616efbf13d3789aadd9ce4f93e430818c13.js":{"logical_path":"tinymce/langs/kab.js","mtime":"2017-04-24T19:17:55+02:00","size":7391,"digest":"3651d08aacd5bda15a04698f202bf616efbf13d3789aadd9ce4f93e430818c13","integrity":"sha256-NlHQiqzVvaFaBGmPICv2Fu+/E9N4mq3Zzk+T5DCBjBM="},"tinymce/langs/kk-0c1ba792ed9445c6512f310228f64d1cde7b5a98e0b212cca749dcb2d728fe86.js":{"logical_path":"tinymce/langs/kk.js","mtime":"2017-04-24T19:17:55+02:00","size":16681,"digest":"0c1ba792ed9445c6512f310228f64d1cde7b5a98e0b212cca749dcb2d728fe86","integrity":"sha256-DBunku2URcZRLzECKPZNHN57WpjgshLMp0ncstco/oY="},"tinymce/langs/km_KH-8bec84e4078db8c2a680260c073dfb486c85b61df62e14ca330d66d2ca2a85b5.js":{"logical_path":"tinymce/langs/km_KH.js","mtime":"2017-04-24T19:17:55+02:00","size":21396,"digest":"8bec84e4078db8c2a680260c073dfb486c85b61df62e14ca330d66d2ca2a85b5","integrity":"sha256-i+yE5AeNuMKmgCYMBz37SGyFth32LhTKMw1m0soqhbU="},"tinymce/langs/ko-ca535bfa388701fb020d24bdfb3f1e3aab127005b54e943cb1bd60b723c8194d.js":{"logical_path":"tinymce/langs/ko.js","mtime":"2017-04-24T19:17:55+02:00","size":10105,"digest":"ca535bfa388701fb020d24bdfb3f1e3aab127005b54e943cb1bd60b723c8194d","integrity":"sha256-ylNb+jiHAfsCDSS9+z8eOqsScAW1TpQ8sb1gtyPIGU0="},"tinymce/langs/ko_KR-daa3ae950d70260bb0901a5349034952247905523bbc2bcbe527701b6aad8e28.js":{"logical_path":"tinymce/langs/ko_KR.js","mtime":"2017-04-24T19:17:55+02:00","size":10005,"digest":"daa3ae950d70260bb0901a5349034952247905523bbc2bcbe527701b6aad8e28","integrity":"sha256-2qOulQ1wJguwkBpTSQNJUiR5BVI7vCvL5SdwG2qtjig="},"tinymce/langs/ku-95e2ffe4f0112df658f10327c26f2cdddedc2e2ed769767366ae22a465c14725.js":{"logical_path":"tinymce/langs/ku.js","mtime":"2017-04-24T19:17:55+02:00","size":18274,"digest":"95e2ffe4f0112df658f10327c26f2cdddedc2e2ed769767366ae22a465c14725","integrity":"sha256-leL/5PARLfZY8QMnwm8s3d7cLi7XaXZzZq4ipGXBRyU="},"tinymce/langs/ku_IQ-a212e8d41695989e56834facf72474e1934ef166c3fcaf7e255ef573a3c6e76c.js":{"logical_path":"tinymce/langs/ku_IQ.js","mtime":"2017-04-24T19:17:55+02:00","size":18364,"digest":"a212e8d41695989e56834facf72474e1934ef166c3fcaf7e255ef573a3c6e76c","integrity":"sha256-ohLo1BaVmJ5Wg0+s9yR04ZNO8WbD/K9+JV71c6PG52w="},"tinymce/langs/lb-94992279091f1a0be927d5d858d3724037d8d81ee6b63cc9ddde84af6124cc04.js":{"logical_path":"tinymce/langs/lb.js","mtime":"2017-04-24T19:17:55+02:00","size":7467,"digest":"94992279091f1a0be927d5d858d3724037d8d81ee6b63cc9ddde84af6124cc04","integrity":"sha256-lJkieQkfGgvpJ9XYWNNyQDfY2B7mtjzJ3d6Er2EkzAQ="},"tinymce/langs/lt-ae7cefbe2cb5420770b31eabf92605728135ab5d6a2d2cfca2d19809be67e6a8.js":{"logical_path":"tinymce/langs/lt.js","mtime":"2017-04-24T19:17:55+02:00","size":8899,"digest":"ae7cefbe2cb5420770b31eabf92605728135ab5d6a2d2cfca2d19809be67e6a8","integrity":"sha256-rnzvviy1Qgdwsx6r+SYFcoE1q11qLSz8otGYCb5n5qg="},"tinymce/langs/lv-e468ed0c78466d1fff9f4957645606d8aa683cb5dc35931e047df97b8e4f5433.js":{"logical_path":"tinymce/langs/lv.js","mtime":"2017-04-24T19:17:55+02:00","size":8282,"digest":"e468ed0c78466d1fff9f4957645606d8aa683cb5dc35931e047df97b8e4f5433","integrity":"sha256-5GjtDHhGbR//n0lXZFYG2KpoPLXcNZMeBH35e45PVDM="},"tinymce/langs/mk_MK-55aadb5d7c82c940cfcf42f24423ef0471294c9b02994a6b22e1b4173baa7ec6.js":{"logical_path":"tinymce/langs/mk_MK.js","mtime":"2017-04-24T19:17:55+02:00","size":18733,"digest":"55aadb5d7c82c940cfcf42f24423ef0471294c9b02994a6b22e1b4173baa7ec6","integrity":"sha256-VarbXXyCyUDPz0LyRCPvBHEpTJsCmUprIuG0FzuqfsY="},"tinymce/langs/ml-685de0808683c02274dcbe9f8de023a4d72a49b040e7526a99e3d5c786ff71ae.js":{"logical_path":"tinymce/langs/ml.js","mtime":"2017-04-24T19:17:55+02:00","size":7339,"digest":"685de0808683c02274dcbe9f8de023a4d72a49b040e7526a99e3d5c786ff71ae","integrity":"sha256-aF3ggIaDwCJ03L6fjeAjpNcqSbBA51JqmePVx4b/ca4="},"tinymce/langs/ml_IN-1ab433621d6257c7632718048bacc5ed98a302d33cf0438bbbb4200914e01aac.js":{"logical_path":"tinymce/langs/ml_IN.js","mtime":"2017-04-24T19:17:55+02:00","size":20019,"digest":"1ab433621d6257c7632718048bacc5ed98a302d33cf0438bbbb4200914e01aac","integrity":"sha256-GrQzYh1iV8djJxgEi6zF7ZijAtM88EOLu7QgCRTgGqw="},"tinymce/langs/mn_MN-b89f88cb9b0dd7c879e27532b2979c421c1e69648f65a4108a56060f1e1cb009.js":{"logical_path":"tinymce/langs/mn_MN.js","mtime":"2017-04-24T19:17:55+02:00","size":6877,"digest":"b89f88cb9b0dd7c879e27532b2979c421c1e69648f65a4108a56060f1e1cb009","integrity":"sha256-uJ+Iy5sN18h54nUyspecQhweaWSPZaQQilYGDx4csAk="},"tinymce/langs/nb_NO-602ee249e98a26ae24c1ee1311090c68a782050086a835f1e7bd46ebfe7879ef.js":{"logical_path":"tinymce/langs/nb_NO.js","mtime":"2017-04-24T19:17:55+02:00","size":7528,"digest":"602ee249e98a26ae24c1ee1311090c68a782050086a835f1e7bd46ebfe7879ef","integrity":"sha256-YC7iSemKJq4kwe4TEQkMaKeCBQCGqDXx571G6/54ee8="},"tinymce/langs/nl-9c77e9404a27fd7e4bd162ad44538b72d2725b7fee7be7ca3ff801cf217c4968.js":{"logical_path":"tinymce/langs/nl.js","mtime":"2017-04-24T19:17:55+02:00","size":7235,"digest":"9c77e9404a27fd7e4bd162ad44538b72d2725b7fee7be7ca3ff801cf217c4968","integrity":"sha256-nHfpQEon/X5L0WKtRFOLctJyW3/ue+fKP/gBzyF8SWg="},"tinymce/langs/pl-5cdd1586ec8fa67293f2175cd92edbd0392c4c77b24ed64cfdceccba8d99f152.js":{"logical_path":"tinymce/langs/pl.js","mtime":"2017-04-24T19:17:55+02:00","size":8129,"digest":"5cdd1586ec8fa67293f2175cd92edbd0392c4c77b24ed64cfdceccba8d99f152","integrity":"sha256-XN0VhuyPpnKT8hdc2S7b0DksTHeyTtZM/c7Muo2Z8VI="},"tinymce/langs/pt_BR-e3955318582d58bd241a62c3a81afe74e0ae7f31bdc92a562b75243701f114df.js":{"logical_path":"tinymce/langs/pt_BR.js","mtime":"2017-04-24T19:17:55+02:00","size":8002,"digest":"e3955318582d58bd241a62c3a81afe74e0ae7f31bdc92a562b75243701f114df","integrity":"sha256-45VTGFgtWL0kGmLDqBr+dOCufzG9ySpWK3UkNwHxFN8="},"tinymce/langs/pt_PT-1101d080ecd5da091c7ef70b23200adbd5136c5c32f0c79dae665a443d76c35d.js":{"logical_path":"tinymce/langs/pt_PT.js","mtime":"2017-04-24T19:17:55+02:00","size":8145,"digest":"1101d080ecd5da091c7ef70b23200adbd5136c5c32f0c79dae665a443d76c35d","integrity":"sha256-EQHQgOzV2gkcfvcLIyAK29UTbFwy8MedrmZaRD12w10="},"tinymce/langs/ro-484799d182031efab087d749b024014fd06ed06c1e7712b8bf87f3a4a965c2e4.js":{"logical_path":"tinymce/langs/ro.js","mtime":"2017-04-24T19:17:55+02:00","size":8275,"digest":"484799d182031efab087d749b024014fd06ed06c1e7712b8bf87f3a4a965c2e4","integrity":"sha256-SEeZ0YIDHvqwh9dJsCQBT9Bu0GwedxK4v4fzpKllwuQ="},"tinymce/langs/ru-bdd59cb662a7b4d61e770b07014d1791051312c87513ecc1891e80beba617171.js":{"logical_path":"tinymce/langs/ru.js","mtime":"2017-04-24T19:17:55+02:00","size":22290,"digest":"bdd59cb662a7b4d61e770b07014d1791051312c87513ecc1891e80beba617171","integrity":"sha256-vdWctmKntNYedwsHAU0XkQUTEsh1E+zBiR6AvrphcXE="},"tinymce/langs/ru_RU-9f18ef14f3493cc586cc0b4827fd9e1c2ed3d5790ce536d94f87e2d6aac2a688.js":{"logical_path":"tinymce/langs/ru_RU.js","mtime":"2017-04-24T19:17:55+02:00","size":4955,"digest":"9f18ef14f3493cc586cc0b4827fd9e1c2ed3d5790ce536d94f87e2d6aac2a688","integrity":"sha256-nxjvFPNJPMWGzAtIJ/2eHC7T1XkM5TbZT4fi1qrCpog="},"tinymce/langs/si_LK-5bfefe9b2fe82574d8ed839df18fd8ff65f1e1cd458b0a843cf1aadd1be704ea.js":{"logical_path":"tinymce/langs/si_LK.js","mtime":"2017-04-24T19:17:55+02:00","size":15856,"digest":"5bfefe9b2fe82574d8ed839df18fd8ff65f1e1cd458b0a843cf1aadd1be704ea","integrity":"sha256-W/7+my/oJXTY7YOd8Y/Y/2Xx4c1FiwqEPPGq3RvnBOo="},"tinymce/langs/sk-412fa7f982ad2733341203daa035c8ba10035262ca8f5f65e0a41507512209bd.js":{"logical_path":"tinymce/langs/sk.js","mtime":"2017-04-24T19:17:55+02:00","size":8958,"digest":"412fa7f982ad2733341203daa035c8ba10035262ca8f5f65e0a41507512209bd","integrity":"sha256-QS+n+YKtJzM0EgPaoDXIuhADUmLKj19l4KQVB1EiCb0="},"tinymce/langs/sl_SI-2bea4f3854a992ea840808019dc99467dc173b12454ea6016135234a741671d8.js":{"logical_path":"tinymce/langs/sl_SI.js","mtime":"2017-04-24T19:17:55+02:00","size":7039,"digest":"2bea4f3854a992ea840808019dc99467dc173b12454ea6016135234a741671d8","integrity":"sha256-K+pPOFSpkuqECAgBncmUZ9wXOxJFTqYBYTUjSnQWcdg="},"tinymce/langs/sr-e0b97453a0c1000b19f7ce37fcf86bcacbf9125d81076f60a77686820c7925c6.js":{"logical_path":"tinymce/langs/sr.js","mtime":"2017-04-24T19:17:55+02:00","size":6336,"digest":"e0b97453a0c1000b19f7ce37fcf86bcacbf9125d81076f60a77686820c7925c6","integrity":"sha256-4Ll0U6DBAAsZ9843/Phrysv5El2BB29gp3aGggx5JcY="},"tinymce/langs/sv_SE-fa561a7e49fdb42d5913337176fed6bc8a9997eb3ca8f20ecd9520d5391e17be.js":{"logical_path":"tinymce/langs/sv_SE.js","mtime":"2017-04-24T19:17:55+02:00","size":7496,"digest":"fa561a7e49fdb42d5913337176fed6bc8a9997eb3ca8f20ecd9520d5391e17be","integrity":"sha256-+lYafkn9tC1ZEzNxdv7WvIqZl+s8qPIOzZUg1TkeF74="},"tinymce/langs/ta-0fd0e62250fc1a3626ac2111c5adb4194a6a898888bb224414f6dc8adf53d385.js":{"logical_path":"tinymce/langs/ta.js","mtime":"2017-04-24T19:17:55+02:00","size":22617,"digest":"0fd0e62250fc1a3626ac2111c5adb4194a6a898888bb224414f6dc8adf53d385","integrity":"sha256-D9DmIlD8GjYmrCERxa20GUpqiYiIuyJEFPbcit9T04U="},"tinymce/langs/ta_IN-32303f65d2378e8202b17b0920b79277a2580872e3a6bd9409aeceef90867dd0.js":{"logical_path":"tinymce/langs/ta_IN.js","mtime":"2017-04-24T19:17:55+02:00","size":22620,"digest":"32303f65d2378e8202b17b0920b79277a2580872e3a6bd9409aeceef90867dd0","integrity":"sha256-MjA/ZdI3joICsXsJILeSd6JYCHLjpr2UCa7O75CGfdA="},"tinymce/langs/tg-1618248bf0aeda614a37ced9fd28b6623ae24f8453368bfb8c483ce820a3cb34.js":{"logical_path":"tinymce/langs/tg.js","mtime":"2017-04-24T19:17:55+02:00","size":18183,"digest":"1618248bf0aeda614a37ced9fd28b6623ae24f8453368bfb8c483ce820a3cb34","integrity":"sha256-Fhgki/Cu2mFKN87Z/Si2YjriT4RTNov7jEg86CCjyzQ="},"tinymce/langs/th_TH-5279a379afc886c2a31e22aba9d7ee7a8e3edf4c0785f39aaa20ccd03d46b19a.js":{"logical_path":"tinymce/langs/th_TH.js","mtime":"2017-04-24T19:17:55+02:00","size":17297,"digest":"5279a379afc886c2a31e22aba9d7ee7a8e3edf4c0785f39aaa20ccd03d46b19a","integrity":"sha256-Unmjea/IhsKjHiKrqdfueo4+30wHhfOaqiDM0D1GsZo="},"tinymce/langs/tr-3765d4a8923ef22864747d9c825c3e0af401e1356e75a5458bed837d486b7673.js":{"logical_path":"tinymce/langs/tr.js","mtime":"2017-04-24T19:17:55+02:00","size":8705,"digest":"3765d4a8923ef22864747d9c825c3e0af401e1356e75a5458bed837d486b7673","integrity":"sha256-N2XUqJI+8ihkdH2cglw+CvQB4TVudaVFi+2DfUhrdnM="},"tinymce/langs/tr_TR-5c93f80b89e5dd2eb6972f37bf50b76d7705c61f28120b836704a91fa5c14399.js":{"logical_path":"tinymce/langs/tr_TR.js","mtime":"2017-04-24T19:17:55+02:00","size":8141,"digest":"5c93f80b89e5dd2eb6972f37bf50b76d7705c61f28120b836704a91fa5c14399","integrity":"sha256-XJP4C4nl3S62ly83v1C3bXcFxh8oEguDZwSpH6XBQ5k="},"tinymce/langs/tt-22e302672df0a77de14688f58dbedf82de7a26e9089c9535a2a3cd1c0ccd7903.js":{"logical_path":"tinymce/langs/tt.js","mtime":"2017-04-24T19:17:55+02:00","size":19035,"digest":"22e302672df0a77de14688f58dbedf82de7a26e9089c9535a2a3cd1c0ccd7903","integrity":"sha256-IuMCZy3wp33hRoj1jb7fgt56JukInJU1oqPNHAzNeQM="},"tinymce/langs/ug-50232038bf7262c90be4f2919c74ff93792cdb82e6064d0f5c86f885b93271c5.js":{"logical_path":"tinymce/langs/ug.js","mtime":"2017-04-24T19:17:55+02:00","size":16888,"digest":"50232038bf7262c90be4f2919c74ff93792cdb82e6064d0f5c86f885b93271c5","integrity":"sha256-UCMgOL9yYskL5PKRnHT/k3ks24LmBk0PXIb4hbkyccU="},"tinymce/langs/uk-f6d7911714c422b178c0249df323cf7ec415a83195d751c7e4024590b1738c42.js":{"logical_path":"tinymce/langs/uk.js","mtime":"2017-04-24T19:17:55+02:00","size":22264,"digest":"f6d7911714c422b178c0249df323cf7ec415a83195d751c7e4024590b1738c42","integrity":"sha256-9teRFxTEIrF4wCSd8yPPfsQVqDGV11HH5AJFkLFzjEI="},"tinymce/langs/uk_UA-bd8cd7ca66228d85f8a4cadb651c49981f26e007fa2a952856c8c3d3c1baa66a.js":{"logical_path":"tinymce/langs/uk_UA.js","mtime":"2017-04-24T19:17:55+02:00","size":21691,"digest":"bd8cd7ca66228d85f8a4cadb651c49981f26e007fa2a952856c8c3d3c1baa66a","integrity":"sha256-vYzXymYijYX4pMrbZRxJmB8m4Af6KpUoVsjD08G6pmo="},"tinymce/langs/vi-6aa451047e4df911c92e10178e6a70147534e438c64df7a88eee37b4a440726e.js":{"logical_path":"tinymce/langs/vi.js","mtime":"2017-04-24T19:17:55+02:00","size":9901,"digest":"6aa451047e4df911c92e10178e6a70147534e438c64df7a88eee37b4a440726e","integrity":"sha256-aqRRBH5N+RHJLhAXjmpwFHU05DjGTfeoju43tKRAcm4="},"tinymce/langs/vi_VN-aea52c2e9397f8a657d54d50a42b3c5be0ca79480555a4fa1e0f5d785c5f6561.js":{"logical_path":"tinymce/langs/vi_VN.js","mtime":"2017-04-24T19:17:55+02:00","size":9899,"digest":"aea52c2e9397f8a657d54d50a42b3c5be0ca79480555a4fa1e0f5d785c5f6561","integrity":"sha256-rqUsLpOX+KZX1U1QpCs8W+DKeUgFVaT6Hg9deFxfZWE="},"tinymce/langs/zh_CN-8622ec46e2980b6f5baf3b745c6b0187dd2a54ddecbbf69a21f0b3e72f84f6dc.js":{"logical_path":"tinymce/langs/zh_CN.js","mtime":"2017-04-24T19:17:55+02:00","size":8483,"digest":"8622ec46e2980b6f5baf3b745c6b0187dd2a54ddecbbf69a21f0b3e72f84f6dc","integrity":"sha256-hiLsRuKYC29brzt0XGsBh90qVN3su/aaIfCz5y+E9tw="},"tinymce/langs/zh_TW-90723da3b889f2a4477d4aaf00ca3e75439998269b36b359ea4caa37e1defb4a.js":{"logical_path":"tinymce/langs/zh_TW.js","mtime":"2017-04-24T19:17:55+02:00","size":9379,"digest":"90723da3b889f2a4477d4aaf00ca3e75439998269b36b359ea4caa37e1defb4a","integrity":"sha256-kHI9o7iJ8qRHfUqvAMo+dUOZmCabNrNZ6kyqN+He+0o="},"tinymce/preinit-4eb7f4ac58f2f450d20185cf83ca1d8550d2a1419141bfe70eb5a2c4afe67349.js":{"logical_path":"tinymce/preinit.js","mtime":"2017-10-07T16:14:30+02:00","size":248,"digest":"4eb7f4ac58f2f450d20185cf83ca1d8550d2a1419141bfe70eb5a2c4afe67349","integrity":"sha256-Trf0rFjy9FDSAYXPg8odhVDSoUGRQb/nDrWixK/mc0k="},"tinymce/tinymce-ea002509455c2d4e12e195ec050ff03ce90bbe0bdf22bb0d4180bba730c2bcc6.js":{"logical_path":"tinymce/tinymce.js","mtime":"2017-10-07T16:14:30+02:00","size":1733332,"digest":"ea002509455c2d4e12e195ec050ff03ce90bbe0bdf22bb0d4180bba730c2bcc6","integrity":"sha256-6gAlCUVcLU4S4ZXsBQ/wPOkLvgvfIrsNQYC7pzDCvMY="},"tinymce/jquery.tinymce-c4e34b289f498e7a8e4ff16c48b895310113eae7c296ac5f17680704bc3a0032.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2017-10-07T16:14:30+02:00","size":4275,"digest":"c4e34b289f498e7a8e4ff16c48b895310113eae7c296ac5f17680704bc3a0032","integrity":"sha256-xONLKJ9JjnqOT/FsSLiVMQET6ufClqxfF2gHBLw6ADI="},"tinymce/langs/readme-5a8b6a04d57b5c88e3fb7f2a870b8e2d3a48ec03ce6474206c41df78c155b2de.md":{"logical_path":"tinymce/langs/readme.md","mtime":"2017-10-07T16:14:30+02:00","size":151,"digest":"5a8b6a04d57b5c88e3fb7f2a870b8e2d3a48ec03ce6474206c41df78c155b2de","integrity":"sha256-WotqBNV7XIjj+38qhwuOLTpI7APOZHQgbEHfeMFVst4="},"tinymce/license-47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66.txt":{"logical_path":"tinymce/license.txt","mtime":"2017-10-07T16:14:30+02:00","size":26441,"digest":"47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66","integrity":"sha256-R6nc0ldIkaWkZREv2d/OvMfmGETt7Cf6k2pkZCAI/mY="},"tinymce/plugins/advlist/plugin-8298c4226e435f9350b2bfedab63fec1a9a153277a48930406bd9446ca3d9206.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2683,"digest":"8298c4226e435f9350b2bfedab63fec1a9a153277a48930406bd9446ca3d9206","integrity":"sha256-gpjEIm5DX5NQsr/tq2P+wamhUyd6SJMEBr2URso9kgY="},"tinymce/plugins/anchor/plugin-910353b28da9ffa1075fd37b1c95f1f05f0d6809e41a5e4250b33e1a3a7a86c8.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2110,"digest":"910353b28da9ffa1075fd37b1c95f1f05f0d6809e41a5e4250b33e1a3a7a86c8","integrity":"sha256-kQNTso2p/6EHX9N7HJXx8F8NaAnkGl5CULM+Gjp6hsg="},"tinymce/plugins/autolink/plugin-ee2bb5e9c684882fb0db4d350f0c7feab2643841f2b8729db0f9111043c70d39.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3017,"digest":"ee2bb5e9c684882fb0db4d350f0c7feab2643841f2b8729db0f9111043c70d39","integrity":"sha256-7iu16caEiC+w2001Dwx/6rJkOEHyuHKdsPkREEPHDTk="},"tinymce/plugins/autoresize/plugin-2e0a2856650e8fa09fba9a00fd18a9078e5ee436c6c47ead6ba6689fee74cafa.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2916,"digest":"2e0a2856650e8fa09fba9a00fd18a9078e5ee436c6c47ead6ba6689fee74cafa","integrity":"sha256-LgooVmUOj6CfupoA/RipB45e5DbGxH6ta6Zon+50yvo="},"tinymce/plugins/autosave/plugin-54b4451f49d642d08cbec840341ac6edb501b69d2383115c62bc7070eb0a57f4.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3217,"digest":"54b4451f49d642d08cbec840341ac6edb501b69d2383115c62bc7070eb0a57f4","integrity":"sha256-VLRFH0nWQtCMvshANBrG7bUBtp0jgxFcYrxwcOsKV/Q="},"tinymce/plugins/bbcode/plugin-3e2fdc6fa5b587ce568ca570974d0e910b6684e392a9ecaba02b5c6c15269080.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3990,"digest":"3e2fdc6fa5b587ce568ca570974d0e910b6684e392a9ecaba02b5c6c15269080","integrity":"sha256-Pi/cb6W1h85WjKVwl00OkQtmhOOSqeyroCtcbBUmkIA="},"tinymce/plugins/charmap/plugin-49d7ef5688ed83d2a102b0c9702dc3aac70a33c22a7ef4885d6528a61b8210e2.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":9164,"digest":"49d7ef5688ed83d2a102b0c9702dc3aac70a33c22a7ef4885d6528a61b8210e2","integrity":"sha256-SdfvVojtg9KhArDJcC3DqscKM8IqfvSIXWUophuCEOI="},"tinymce/plugins/code/plugin-2c12bcd21813fa52b23a65c3080cc6f4ecb33be04ee058b6c460719724511372.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1656,"digest":"2c12bcd21813fa52b23a65c3080cc6f4ecb33be04ee058b6c460719724511372","integrity":"sha256-LBK80hgT+lKyOmXDCAzG9OyzO+BO4Fi2xGBxlyRRE3I="},"tinymce/plugins/codesample/css/prism-1988b66704b4d23e78c6c20c38a6856cbc1f0be96d6d60a3a0b12f4408f1057e.css":{"logical_path":"tinymce/plugins/codesample/css/prism.css","mtime":"2017-10-07T16:14:30+02:00","size":1776,"digest":"1988b66704b4d23e78c6c20c38a6856cbc1f0be96d6d60a3a0b12f4408f1057e","integrity":"sha256-GYi2ZwS00j54xsIMOKaFbLwfC+ltbWCjoLEvRAjxBX4="},"tinymce/plugins/codesample/plugin-a3591d2c33d0499eed106bbdc9d0aa698115456632cb806e8f44bdf270d8d6b8.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":19950,"digest":"a3591d2c33d0499eed106bbdc9d0aa698115456632cb806e8f44bdf270d8d6b8","integrity":"sha256-o1kdLDPQSZ7tEGu9ydCqaYEVRWYyy4Buj0S98nDY1rg="},"tinymce/plugins/colorpicker/plugin-f4ea1ac5bfaaef5adef0789427a1ef1e3c07814ff9a7623953bfb1a79f9f502d.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2144,"digest":"f4ea1ac5bfaaef5adef0789427a1ef1e3c07814ff9a7623953bfb1a79f9f502d","integrity":"sha256-9Ooaxb+q71re8HiUJ6HvHjwHgU/5p2I5U7+xp5+fUC0="},"tinymce/plugins/contextmenu/plugin-36bf2806ad2d3ead1a04e45b840bd6cea455f38ca02d88f973302219e05734ab.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":7098,"digest":"36bf2806ad2d3ead1a04e45b840bd6cea455f38ca02d88f973302219e05734ab","integrity":"sha256-Nr8oBq0tPq0aBORbhAvWzqRV84ygLYj5czAiGeBXNKs="},"tinymce/plugins/directionality/plugin-8b9d9e0d97d8cf5c20b4f74509a94cbd84c59b330d7badaad66ff2d0553479fd.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1653,"digest":"8b9d9e0d97d8cf5c20b4f74509a94cbd84c59b330d7badaad66ff2d0553479fd","integrity":"sha256-i52eDZfYz1wgtPdFCalMvYTFmzMNe62q1m/y0FU0ef0="},"tinymce/plugins/emoticons/img/smiley-cool-bb0e93a050a32df7913e4026b3c88a176998e0e3e073ba06e9b73f6c24227c9c.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-cool.gif","mtime":"2017-10-07T16:14:30+02:00","size":354,"digest":"bb0e93a050a32df7913e4026b3c88a176998e0e3e073ba06e9b73f6c24227c9c","integrity":"sha256-uw6ToFCjLfeRPkAms8iKF2mY4OPgc7oG6bc/bCQifJw="},"tinymce/plugins/emoticons/img/smiley-cry-a0c5f3e7a682449c973c9d9f7c46342081c46920686d2353f57aff91ab907f68.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-cry.gif","mtime":"2017-10-07T16:14:30+02:00","size":329,"digest":"a0c5f3e7a682449c973c9d9f7c46342081c46920686d2353f57aff91ab907f68","integrity":"sha256-oMXz56aCRJyXPJ2ffEY0IIHEaSBobSNT9Xr/kauQf2g="},"tinymce/plugins/emoticons/img/smiley-embarassed-d3cafcb50b335672cb5e9f4600ea9ea261dac7828dd28844d4927c393a25618f.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-embarassed.gif","mtime":"2017-10-07T16:14:30+02:00","size":331,"digest":"d3cafcb50b335672cb5e9f4600ea9ea261dac7828dd28844d4927c393a25618f","integrity":"sha256-08r8tQszVnLLXp9GAOqeomHax4KN0ohE1JJ8OTolYY8="},"tinymce/plugins/emoticons/img/smiley-foot-in-mouth-03fe04d3ed533423ac81f05146584b0c451be3d4a30e76687ceef283ed07071f.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif","mtime":"2017-10-07T16:14:30+02:00","size":342,"digest":"03fe04d3ed533423ac81f05146584b0c451be3d4a30e76687ceef283ed07071f","integrity":"sha256-A/4E0+1TNCOsgfBRRlhLDEUb49SjDnZofO7yg+0HBx8="},"tinymce/plugins/emoticons/img/smiley-frown-1b984bf98931dd1debb54461eb9d83e985f2b2999fe14bcb556d6c0921bc83b0.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-frown.gif","mtime":"2017-10-07T16:14:30+02:00","size":340,"digest":"1b984bf98931dd1debb54461eb9d83e985f2b2999fe14bcb556d6c0921bc83b0","integrity":"sha256-G5hL+Ykx3R3rtURh652D6YXyspmf4UvLVW1sCSG8g7A="},"tinymce/plugins/emoticons/img/smiley-innocent-8db353ef102196f2c6ddf5c4666446de955d7b14fc0957c806c9dbfb48fb0c29.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-innocent.gif","mtime":"2017-10-07T16:14:30+02:00","size":336,"digest":"8db353ef102196f2c6ddf5c4666446de955d7b14fc0957c806c9dbfb48fb0c29","integrity":"sha256-jbNT7xAhlvLG3fXEZmRG3pVdexT8CVfIBsnb+0j7DCk="},"tinymce/plugins/emoticons/img/smiley-kiss-3154c3665356c13ab10fefdbac1fe187fff978a0052037c99cdc4a97103413f2.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-kiss.gif","mtime":"2017-10-07T16:14:30+02:00","size":338,"digest":"3154c3665356c13ab10fefdbac1fe187fff978a0052037c99cdc4a97103413f2","integrity":"sha256-MVTDZlNWwTqxD+/brB/hh//5eKAFIDfJnNxKlxA0E/I="},"tinymce/plugins/emoticons/img/smiley-laughing-8f6adedcd091975ffead171867a6304d908bb6541a6ccb4919286ec6b7d4551e.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-laughing.gif","mtime":"2017-10-07T16:14:30+02:00","size":343,"digest":"8f6adedcd091975ffead171867a6304d908bb6541a6ccb4919286ec6b7d4551e","integrity":"sha256-j2re3NCRl1/+rRcYZ6YwTZCLtlQabMtJGShuxrfUVR4="},"tinymce/plugins/emoticons/img/smiley-money-mouth-f0b9f4f22e237f5dbc851f900fed8d7eca4c954ae6fbc606c0cd8be431d0ac80.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-money-mouth.gif","mtime":"2017-10-07T16:14:30+02:00","size":321,"digest":"f0b9f4f22e237f5dbc851f900fed8d7eca4c954ae6fbc606c0cd8be431d0ac80","integrity":"sha256-8Ln08i4jf128hR+QD+2NfspMlUrm+8YGwM2L5DHQrIA="},"tinymce/plugins/emoticons/img/smiley-sealed-9933b442636b6e537df7b564e2c3f7a2873526eea6b022a98eb1e468e5204c32.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-sealed.gif","mtime":"2017-10-07T16:14:30+02:00","size":323,"digest":"9933b442636b6e537df7b564e2c3f7a2873526eea6b022a98eb1e468e5204c32","integrity":"sha256-mTO0QmNrblN997Vk4sP3ooc1Ju6msCKpjrHkaOUgTDI="},"tinymce/plugins/emoticons/img/smiley-smile-fd89cd460ffcacb7e725e00c0275ef5b3924ce468248e5ff4fb43545571cfa65.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-smile.gif","mtime":"2017-10-07T16:14:30+02:00","size":344,"digest":"fd89cd460ffcacb7e725e00c0275ef5b3924ce468248e5ff4fb43545571cfa65","integrity":"sha256-/YnNRg/8rLfnJeAMAnXvWzkkzkaCSOX/T7Q1RVcc+mU="},"tinymce/plugins/emoticons/img/smiley-surprised-3871f356cb41976d7ae8a5f005e8739e4d014352a8adef9b33f773d81b6e6c01.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-surprised.gif","mtime":"2017-10-07T16:14:30+02:00","size":338,"digest":"3871f356cb41976d7ae8a5f005e8739e4d014352a8adef9b33f773d81b6e6c01","integrity":"sha256-OHHzVstBl2166KXwBehznk0BQ1Kore+bM/dz2BtubAE="},"tinymce/plugins/emoticons/img/smiley-tongue-out-5843c85667a8226dc43be83749fd9fbbc5d20b1577de2b763915d99815d37d47.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-tongue-out.gif","mtime":"2017-10-07T16:14:30+02:00","size":328,"digest":"5843c85667a8226dc43be83749fd9fbbc5d20b1577de2b763915d99815d37d47","integrity":"sha256-WEPIVmeoIm3EO+g3Sf2fu8XSCxV33it2ORXZmBXTfUc="},"tinymce/plugins/emoticons/img/smiley-undecided-d8b9bcbb433951ff3c4ca8dd959ac3844239b98e6d52218833e1485a91f67347.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-undecided.gif","mtime":"2017-10-07T16:14:30+02:00","size":337,"digest":"d8b9bcbb433951ff3c4ca8dd959ac3844239b98e6d52218833e1485a91f67347","integrity":"sha256-2Lm8u0M5Uf88TKjdlZrDhEI5uY5tUiGIM+FIWpH2c0c="},"tinymce/plugins/emoticons/img/smiley-wink-2af75ad7b1c08488505513503e34b15f40005e04a2a9568f698f0945d2d8ba1f.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-wink.gif","mtime":"2017-10-07T16:14:30+02:00","size":350,"digest":"2af75ad7b1c08488505513503e34b15f40005e04a2a9568f698f0945d2d8ba1f","integrity":"sha256-Kvda17HAhIhQVRNQPjSxX0AAXgSiqVaPaY8JRdLYuh8="},"tinymce/plugins/emoticons/img/smiley-yell-bba903fbcb46fce8c68b9e01863fd095b3b1d0e6aa72161f3a88d762a5f90a79.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-yell.gif","mtime":"2017-10-07T16:14:30+02:00","size":336,"digest":"bba903fbcb46fce8c68b9e01863fd095b3b1d0e6aa72161f3a88d762a5f90a79","integrity":"sha256-u6kD+8tG/OjGi54Bhj/QlbOx0OaqchYfOojXYqX5Cnk="},"tinymce/plugins/emoticons/plugin-4e4ed709e1a04969c1d82745d84b01eb7fdd36a19a3529452c81cc2ed4e6b58d.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1838,"digest":"4e4ed709e1a04969c1d82745d84b01eb7fdd36a19a3529452c81cc2ed4e6b58d","integrity":"sha256-Tk7XCeGgSWnB2CdF2EsB63/dNqGaNSlFLIHMLtTmtY0="},"tinymce/plugins/fullpage/plugin-2184bd5db93788e2ead614801f7f96ed7aea38a25dd6f5f94a836807da12f4b7.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":7649,"digest":"2184bd5db93788e2ead614801f7f96ed7aea38a25dd6f5f94a836807da12f4b7","integrity":"sha256-IYS9Xbk3iOLq1hSAH3+W7XrqOKJd1vX5SoNoB9oS9Lc="},"tinymce/plugins/fullscreen/plugin-58355e469e27d887f7c5cedc4ab9c33268605171d0a6ef7539d7889bd6c22e95.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2611,"digest":"58355e469e27d887f7c5cedc4ab9c33268605171d0a6ef7539d7889bd6c22e95","integrity":"sha256-WDVeRp4n2If3xc7cSrnDMmhgUXHQpu91OdeIm9bCLpU="},"tinymce/plugins/help/img/logo-8b03dc4f83c4fea0b62c4f9866898c98e81057c55b3e3b8c1da3f5fdbf0086e9.png":{"logical_path":"tinymce/plugins/help/img/logo.png","mtime":"2017-10-07T16:14:30+02:00","size":23101,"digest":"8b03dc4f83c4fea0b62c4f9866898c98e81057c55b3e3b8c1da3f5fdbf0086e9","integrity":"sha256-iwPcT4PE/qC2LE+YZomMmOgQV8VbPjuMHaP1/b8Ahuk="},"tinymce/plugins/help/plugin-fe41ec41705f0ab8974189c7a262bd6abfca631da91bec80cca08557d933400e.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":13955,"digest":"fe41ec41705f0ab8974189c7a262bd6abfca631da91bec80cca08557d933400e","integrity":"sha256-/kHsQXBfCriXQYnHomK9ar/KYx2pG+yAzKCFV9kzQA4="},"tinymce/plugins/hr/plugin-7e54a59e7cc42e5dbcb208c5e1e171bfa1e07a12a4f2bc29eb924e3b56b2137e.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1198,"digest":"7e54a59e7cc42e5dbcb208c5e1e171bfa1e07a12a4f2bc29eb924e3b56b2137e","integrity":"sha256-flSlnnzELl28sgjF4eFxv6HgehKk8rwp65JOO1ayE34="},"tinymce/plugins/image/plugin-9c58ff73baa30b22932a2940f6499720916ff0667664c0fd1879facb30c7e15e.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":12180,"digest":"9c58ff73baa30b22932a2940f6499720916ff0667664c0fd1879facb30c7e15e","integrity":"sha256-nFj/c7qjCyKTKilA9kmXIJFv8GZ2ZMD9GHn6yzDH4V4="},"tinymce/plugins/imagetools/plugin-cde4e862daaa1072a4a548d462ecd155e4c5798ea673bdab3ba4bf6193123257.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":38257,"digest":"cde4e862daaa1072a4a548d462ecd155e4c5798ea673bdab3ba4bf6193123257","integrity":"sha256-zeToYtqqEHKkpUjUYuzRVeTFeY6mc72rO6S/YZMSMlc="},"tinymce/plugins/importcss/plugin-c9f390348b03c3c6311b5babcb935a60ba6fb23cf30013749dd3cda157b784b9.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3760,"digest":"c9f390348b03c3c6311b5babcb935a60ba6fb23cf30013749dd3cda157b784b9","integrity":"sha256-yfOQNIsDw8YxG1ury5NaYLpvsjzzABN0ndPNoVe3hLk="},"tinymce/plugins/insertdatetime/plugin-918c81e56c28ac5ecf1a7cf1441532a94637da84ae8119d69f5628a42dc1a70a.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2904,"digest":"918c81e56c28ac5ecf1a7cf1441532a94637da84ae8119d69f5628a42dc1a70a","integrity":"sha256-kYyB5WworF7PGnzxRBUyqUY32oSugRnWn1YopC3Bpwo="},"tinymce/plugins/legacyoutput/plugin-367fc211a27027020d9cab6dec42bf1a86f428a507bb47530386439a9d581bd7.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":4184,"digest":"367fc211a27027020d9cab6dec42bf1a86f428a507bb47530386439a9d581bd7","integrity":"sha256-Nn/CEaJwJwINnKtt7EK/Gob0KKUHu0dTA4ZDmp1YG9c="},"tinymce/plugins/link/plugin-188203a47fcc2b8092733c0999105e52aa76af1fc7fa86d82791feee615105e5.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":11309,"digest":"188203a47fcc2b8092733c0999105e52aa76af1fc7fa86d82791feee615105e5","integrity":"sha256-GIIDpH/MK4CSczwJmRBeUqp2rx/H+obYJ5H+7mFRBeU="},"tinymce/plugins/lists/plugin-570f4ed934292f815ba8a8ab0309e44abd776120f629c35a9e6d19d8fb2f7890.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":16394,"digest":"570f4ed934292f815ba8a8ab0309e44abd776120f629c35a9e6d19d8fb2f7890","integrity":"sha256-Vw9O2TQpL4FbqKirAwnkSr13YSD2KcNanm0Z2PsveJA="},"tinymce/plugins/media/plugin-5b4758de69f15a33a07cc4cddd1a896c9de832cdd120b901a7188e57f31cb570.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":16814,"digest":"5b4758de69f15a33a07cc4cddd1a896c9de832cdd120b901a7188e57f31cb570","integrity":"sha256-W0dY3mnxWjOgfMTN3RqJbJ3oMs3RILkBpxiOV/MctXA="},"tinymce/plugins/nonbreaking/plugin-911e6f2517df4ca758f67e28dadebaf921d1b7bb120b23ee2779dce0cf7bb842.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1573,"digest":"911e6f2517df4ca758f67e28dadebaf921d1b7bb120b23ee2779dce0cf7bb842","integrity":"sha256-kR5vJRffTKdY9n4o2t66+SHRt7sSCyPuJ3nc4M97uEI="},"tinymce/plugins/noneditable/plugin-99b4ff9b08ba148764914357b4c626cf07ce5dae739ec678d43fd6f6c6461bc0.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2191,"digest":"99b4ff9b08ba148764914357b4c626cf07ce5dae739ec678d43fd6f6c6461bc0","integrity":"sha256-mbT/mwi6FIdkkUNXtMYmzwfOXa5znsZ41D/W9sZGG8A="},"tinymce/plugins/pagebreak/plugin-ba3703ad8ce5ff341f209e6fa1ab0afdb66d66365dde2f322338d9382f8cabcb.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2152,"digest":"ba3703ad8ce5ff341f209e6fa1ab0afdb66d66365dde2f322338d9382f8cabcb","integrity":"sha256-ujcDrYzl/zQfIJ5voasK/bZtZjZd3i8yIzjZOC+Mq8s="},"tinymce/plugins/paste/plugin-e32879a5ac81dedf097e5a06653c4740fc4fab4766589bab761312d0b2d560c9.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":21374,"digest":"e32879a5ac81dedf097e5a06653c4740fc4fab4766589bab761312d0b2d560c9","integrity":"sha256-4yh5payB3t8JfloGZTxHQPxPq0dmWJurdhMS0LLVYMk="},"tinymce/plugins/preview/plugin-326a8321cd75624f9b746e4efcd8e6f1d5e4d0b2d96155e3b8c8345ec70a95aa.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2611,"digest":"326a8321cd75624f9b746e4efcd8e6f1d5e4d0b2d96155e3b8c8345ec70a95aa","integrity":"sha256-MmqDIc11Yk+bdG5O/Njm8dXk0LLZYVXjuMg0XscKlao="},"tinymce/plugins/print/plugin-360588108f9b3c4d49e62b084a288f7b789d4555ff53eaedd793b7880d5b0799.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1169,"digest":"360588108f9b3c4d49e62b084a288f7b789d4555ff53eaedd793b7880d5b0799","integrity":"sha256-NgWIEI+bPE1J5isISiiPe3idRVX/U+rt15O3iA1bB5k="},"tinymce/plugins/save/plugin-18a4bdbbb2894ce2f3badb7a901ce2b21f18c9cbe54c1c346245ea3092f1d230.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2202,"digest":"18a4bdbbb2894ce2f3badb7a901ce2b21f18c9cbe54c1c346245ea3092f1d230","integrity":"sha256-GKS9u7KJTOLzutt6kBzish8YycvlTBw0YkXqMJLx0jA="},"tinymce/plugins/searchreplace/plugin-cf1237ef21f140faadb3977c326cca488796cae1bafc26f201ab78dd6a498752.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":7494,"digest":"cf1237ef21f140faadb3977c326cca488796cae1bafc26f201ab78dd6a498752","integrity":"sha256-zxI37yHxQPqts5d8MmzKSIeWyuG6/CbyAat43WpJh1I="},"tinymce/plugins/spellchecker/plugin-c4b0e6c01647313b0beda3037aff99d35fd3c10e74afd56329210239cee26a53.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":10081,"digest":"c4b0e6c01647313b0beda3037aff99d35fd3c10e74afd56329210239cee26a53","integrity":"sha256-xLDmwBZHMTsL7aMDev+Z01/TwQ50r9VjKSECOc7ialM="},"tinymce/plugins/tabfocus/plugin-c004f18acdee65bc533bf582e05017cb72a1c78e235e6a6301d7f8cb218f059e.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2368,"digest":"c004f18acdee65bc533bf582e05017cb72a1c78e235e6a6301d7f8cb218f059e","integrity":"sha256-wATxis3uZbxTO/WC4FAXy3Khx44jXmpjAdf4yyGPBZ4="},"tinymce/plugins/table/plugin-dbea734fa37f0c2143ea225ff48c358261941b6cf347292de89f6d503a16cd27.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":48127,"digest":"dbea734fa37f0c2143ea225ff48c358261941b6cf347292de89f6d503a16cd27","integrity":"sha256-2+pzT6N/DCFD6iJf9Iw1gmGUG2zzRykt6J9tUDoWzSc="},"tinymce/plugins/template/plugin-9d2e073f0fa6d0e2c9433260db997138945ea2c73402420a8b12dbba432c5726.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":6762,"digest":"9d2e073f0fa6d0e2c9433260db997138945ea2c73402420a8b12dbba432c5726","integrity":"sha256-nS4HPw+m0OLJQzJg25lxOJReosc0AkIKixLbukMsVyY="},"tinymce/plugins/textcolor/plugin-7f993a50c7d5ca5af4a2117aecbafa820fc5c669bae6916509bc392b21ec10d7.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":5169,"digest":"7f993a50c7d5ca5af4a2117aecbafa820fc5c669bae6916509bc392b21ec10d7","integrity":"sha256-f5k6UMfVylr0ohF67Lr6gg/Fxmm65pFlCbw5KyHsENc="},"tinymce/plugins/textpattern/plugin-3abf3b59885a2b30139e25377c6ebf369e77178752ded63a8ae3a04bba7dabeb.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":4951,"digest":"3abf3b59885a2b30139e25377c6ebf369e77178752ded63a8ae3a04bba7dabeb","integrity":"sha256-Or87WYhaKzATniU3fG6/Np53F4dS3tY6iuOgS7p9q+s="},"tinymce/plugins/toc/plugin-24e4d24233ae96b5d80a1add45fed792c0be45c2ffb266957112465cd45ed0b7.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3764,"digest":"24e4d24233ae96b5d80a1add45fed792c0be45c2ffb266957112465cd45ed0b7","integrity":"sha256-JOTSQjOulrXYChrdRf7XksC+RcL/smaVcRJGXNRe0Lc="},"tinymce/plugins/visualblocks/css/visualblocks-859e261c1d940c90994673ce593b60946710cc4f71371164db4ea695035ea593.css":{"logical_path":"tinymce/plugins/visualblocks/css/visualblocks.css","mtime":"2017-10-07T16:14:30+02:00","size":4995,"digest":"859e261c1d940c90994673ce593b60946710cc4f71371164db4ea695035ea593","integrity":"sha256-hZ4mHB2UDJCZRnPOWTtglGcQzE9xNxFk206mlQNepZM="},"tinymce/plugins/visualblocks/plugin-d65e950bb619d5c52a4fb236da31bb0ecc492e7477e7b0841a2ac06b6faeea26.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2029,"digest":"d65e950bb619d5c52a4fb236da31bb0ecc492e7477e7b0841a2ac06b6faeea26","integrity":"sha256-1l6VC7YZ1cUqT7I22jG7DsxJLnR357CEGirAa2+u6iY="},"tinymce/plugins/visualchars/plugin-d56ff99b2792abbb690ebafe6d70e6c4487a7f5cf2788cb1f3fa4ea62d8b70a2.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":8944,"digest":"d56ff99b2792abbb690ebafe6d70e6c4487a7f5cf2788cb1f3fa4ea62d8b70a2","integrity":"sha256-1W/5myeSq7tpDrr+bXDmxEh6f1zyeIyx8/pOpi2LcKI="},"tinymce/plugins/wordcount/plugin-15f7440d901e81ffa69553b6cb42b1c9ed94c8d9a2417bbe47802539d152bdbc.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":12201,"digest":"15f7440d901e81ffa69553b6cb42b1c9ed94c8d9a2417bbe47802539d152bdbc","integrity":"sha256-FfdEDZAegf+mlVO2y0Kxye2UyNmiQXu+R4AlOdFSvbw="},"tinymce/skins/lightgray/content.inline.min-244f66927d819115fc6403d3562ac16d18884dcd2ca4766e464a03ec6f223adf.css":{"logical_path":"tinymce/skins/lightgray/content.inline.min.css","mtime":"2017-10-07T16:14:30+02:00","size":3335,"digest":"244f66927d819115fc6403d3562ac16d18884dcd2ca4766e464a03ec6f223adf","integrity":"sha256-JE9mkn2BkRX8ZAPTVirBbRiITc0spHZuRkoD7G8iOt8="},"tinymce/skins/lightgray/content.min-c59b96ac316de5e14c27896f4ffdfb27da41502112b8a9c5ea0851a25a742e4e.css":{"logical_path":"tinymce/skins/lightgray/content.min.css","mtime":"2017-10-07T16:14:30+02:00","size":3741,"digest":"c59b96ac316de5e14c27896f4ffdfb27da41502112b8a9c5ea0851a25a742e4e","integrity":"sha256-xZuWrDFt5eFMJ4lvT/37J9pBUCESuKnF6ghRolp0Lk4="},"tinymce/skins/lightgray/fonts/tinymce-small-a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9.eot":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.eot","mtime":"2017-10-07T16:14:30+02:00","size":9492,"digest":"a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9","integrity":"sha256-oQ/END2VtxbBbXdGPUdb5cB5WZ6mfhzSvTqU1ef1CPk="},"tinymce/skins/lightgray/fonts/tinymce-small-e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee.svg":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.svg","mtime":"2017-10-07T16:14:30+02:00","size":24727,"digest":"e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee","integrity":"sha256-53cwAURquTfh2NS9Xo29mzHREgNzU6FLMZ423QEO2O4="},"tinymce/skins/lightgray/fonts/tinymce-small-2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09.ttf":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.ttf","mtime":"2017-10-07T16:14:30+02:00","size":9304,"digest":"2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09","integrity":"sha256-L2V1ApBtb1w/yN86gpaRFOvgMK3f3AYcYMl0sPUV/Qk="},"tinymce/skins/lightgray/fonts/tinymce-small-d3efbb678ca6de5632902bd93772746ba2f8e4e2322b953936e12694a183aa31.woff":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.woff","mtime":"2017-10-07T16:14:30+02:00","size":9380,"digest":"d3efbb678ca6de5632902bd93772746ba2f8e4e2322b953936e12694a183aa31","integrity":"sha256-0++7Z4ym3lYykCvZN3J0a6L45OIyK5U5NuEmlKGDqjE="},"tinymce/skins/lightgray/fonts/tinymce-2e9c4a68fde992476e0db9e44128cb1f2e898f0de0b80f552a8acb52bb7ca0db.eot":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.eot","mtime":"2017-10-07T16:14:30+02:00","size":17572,"digest":"2e9c4a68fde992476e0db9e44128cb1f2e898f0de0b80f552a8acb52bb7ca0db","integrity":"sha256-LpxKaP3pkkduDbnkQSjLHy6Jjw3guA9VKorLUrt8oNs="},"tinymce/skins/lightgray/fonts/tinymce-2094ddadc265c7f33570475fc78ef7adcdcb814e49060d17f5b4c4f8d1cb7ec6.svg":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.svg","mtime":"2017-10-07T16:14:30+02:00","size":45991,"digest":"2094ddadc265c7f33570475fc78ef7adcdcb814e49060d17f5b4c4f8d1cb7ec6","integrity":"sha256-IJTdrcJlx/M1cEdfx473rc3LgU5JBg0X9bTE+NHLfsY="},"tinymce/skins/lightgray/fonts/tinymce-477ea2d46c1a975dd492af4c10235fabfd09069595779cce00ea0381ca9b4a20.ttf":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.ttf","mtime":"2017-10-07T16:14:30+02:00","size":17408,"digest":"477ea2d46c1a975dd492af4c10235fabfd09069595779cce00ea0381ca9b4a20","integrity":"sha256-R36i1Gwal13Ukq9MECNfq/0JBpWVd5zOAOoDgcqbSiA="},"tinymce/skins/lightgray/fonts/tinymce-1ebc636bb24cbea637946ba8c22cbf4f35d8343ba9763045d2aee59e3714ae78.woff":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.woff","mtime":"2017-10-07T16:14:30+02:00","size":17484,"digest":"1ebc636bb24cbea637946ba8c22cbf4f35d8343ba9763045d2aee59e3714ae78","integrity":"sha256-Hrxja7JMvqY3lGuowiy/TzXYNDupdjBF0q7lnjcUrng="},"tinymce/skins/lightgray/img/anchor-2861666fd107d278d4449970615136d06d7f746be9bb19072cf9c8f30e565e1e.gif":{"logical_path":"tinymce/skins/lightgray/img/anchor.gif","mtime":"2017-10-07T16:14:30+02:00","size":53,"digest":"2861666fd107d278d4449970615136d06d7f746be9bb19072cf9c8f30e565e1e","integrity":"sha256-KGFmb9EH0njURJlwYVE20G1/dGvpuxkHLPnI8w5WXh4="},"tinymce/skins/lightgray/img/loader-eb7cfd3d959b2e09c170f532e29f8b825f9bc770b2279fde58e595617753e244.gif":{"logical_path":"tinymce/skins/lightgray/img/loader.gif","mtime":"2017-10-07T16:14:30+02:00","size":2608,"digest":"eb7cfd3d959b2e09c170f532e29f8b825f9bc770b2279fde58e595617753e244","integrity":"sha256-63z9PZWbLgnBcPUy4p+Lgl+bx3CyJ5/eWOWVYXdT4kQ="},"tinymce/skins/lightgray/img/object-e6a15e52bc4a17b085073ba8debd4708ead6ae3d4cbeb3880c65cb7afc489777.gif":{"logical_path":"tinymce/skins/lightgray/img/object.gif","mtime":"2017-10-07T16:14:30+02:00","size":152,"digest":"e6a15e52bc4a17b085073ba8debd4708ead6ae3d4cbeb3880c65cb7afc489777","integrity":"sha256-5qFeUrxKF7CFBzuo3r1HCOrWrj1MvrOIDGXLevxIl3c="},"tinymce/skins/lightgray/img/trans-9cf020d7c3bba7f5ab10cda54aabef934f906d4f9a3acf99e9e7dc6c98579635.gif":{"logical_path":"tinymce/skins/lightgray/img/trans.gif","mtime":"2017-10-07T16:14:30+02:00","size":43,"digest":"9cf020d7c3bba7f5ab10cda54aabef934f906d4f9a3acf99e9e7dc6c98579635","integrity":"sha256-nPAg18O7p/WrEM2lSqvvk0+QbU+aOs+Z6efcbJhXljU="},"tinymce/skins/lightgray/skin.min-b12163641969e8e7775e00e73f8691e2892c35bf53d399deb4399832950c8acf.css":{"logical_path":"tinymce/skins/lightgray/skin.min.css","mtime":"2017-10-07T16:14:30+02:00","size":40376,"digest":"b12163641969e8e7775e00e73f8691e2892c35bf53d399deb4399832950c8acf","integrity":"sha256-sSFjZBlp6Od3XgDnP4aR4oksNb9T05netDmYMpUMis8="},"tinymce/themes/inlite/theme-705c8874883e10384f2f0f31576331734af05e4871ea70c8b54c09acf68b562a.js":{"logical_path":"tinymce/themes/inlite/theme.js","mtime":"2017-10-07T16:14:30+02:00","size":17114,"digest":"705c8874883e10384f2f0f31576331734af05e4871ea70c8b54c09acf68b562a","integrity":"sha256-cFyIdIg+EDhPLw8xV2Mxc0rwXkhx6nDItUwJrPaLVio="},"tinymce/themes/modern/theme-acb8d1f30de151cc3b7f6b5131ed0e7e45abfd745256260b2d57b3594c97c685.js":{"logical_path":"tinymce/themes/modern/theme.js","mtime":"2017-10-07T16:14:30+02:00","size":14361,"digest":"acb8d1f30de151cc3b7f6b5131ed0e7e45abfd745256260b2d57b3594c97c685","integrity":"sha256-rLjR8w3hUcw7f2tRMe0OfkWr/XRSViYLLVezWUyXxoU="},"application-a3e14c617593fb4bc194d8021b38514c9b130e782e45cf92a07e546d36602c13.js":{"logical_path":"application.js","mtime":"2017-10-14T19:50:25+02:00","size":2822537,"digest":"a3e14c617593fb4bc194d8021b38514c9b130e782e45cf92a07e546d36602c13","integrity":"sha256-o+FMYXWT+0vBlNgCGzhRTJsTDnguRc+SoH5UbTZgLBM="}},"assets":{"active_admin.css":"active_admin-d4f38d29ff0b2b9b05ed4ecbcebd736e750ad4b29369bc58d35194f7e107eaae.css","active_admin/nested_menu_arrow.gif":"active_admin/nested_menu_arrow-15084d93c65c1964d7077700ea748bd2d70cfa2d4c19707c58a9c64e232dd442.gif","active_admin/nested_menu_arrow_dark.gif":"active_admin/nested_menu_arrow_dark-7c43b8e0a5f8823875f49a093c9d7a6b374f885b6f9cc248ae9cd7e6e9b29034.gif","active_admin/orderable.png":"active_admin/orderable-29374dbb55b0012d78a37c614d573bb3474f0779849b478a147d0f1845ca6617.png","active_admin/print.css":"active_admin/print-cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6.css","active_admin.js":"active_admin-115a9ff718613239e12adb1f3bf498a1ccba1735051b69a5d1fbee5e495ff489.js","tinymce.js":"tinymce-d01e33fd7bee04ec85526d769634c548ffc9d13584e1e3ecb754f48c8a3a0662.js","application.css":"application-ba1c3eda80784b6eec3860ce601adf04370c8c8b17855bd3438a42dc8a69cfa2.css","jquery-ui/ui-icons_444444_256x240.png":"jquery-ui/ui-icons_444444_256x240-31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d.png","jquery-ui/ui-icons_555555_256x240.png":"jquery-ui/ui-icons_555555_256x240-32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5.png","jquery-ui/ui-icons_ffffff_256x240.png":"jquery-ui/ui-icons_ffffff_256x240-350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a.png","jquery-ui/ui-icons_777620_256x240.png":"jquery-ui/ui-icons_777620_256x240-0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b.png","jquery-ui/ui-icons_cc0000_256x240.png":"jquery-ui/ui-icons_cc0000_256x240-40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69.png","jquery-ui/ui-icons_777777_256x240.png":"jquery-ui/ui-icons_777777_256x240-faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f.png","flags/4x3/ad.svg":"flags/4x3/ad-3fc30cc000942b4f3369bdf6ccb85b16f59f4e78f9c53d73252ab529da35ba0a.svg","flags/1x1/ad.svg":"flags/1x1/ad-db2c38d603b8eecc9085d6ac1261bbefd3bcd852d44bec476e5e115914bcb2fd.svg","flags/4x3/ae.svg":"flags/4x3/ae-7f41692ef179841ca6e9cae42c704113274707228ff3d2b1ee5169916db15b1e.svg","flags/1x1/ae.svg":"flags/1x1/ae-8c9b9b1f108511722e1f1b0f9a029edf808ff285406545f24e327052e0efa780.svg","flags/4x3/af.svg":"flags/4x3/af-e271fd8f2fcdd0adda22a0e699173ff4e4cc65adfe7f05652cb77375eea99a93.svg","flags/1x1/af.svg":"flags/1x1/af-2629bc2e10edd54c384650f9aab1c6dfaf7101fda43ba3af627f0ec226db5892.svg","flags/4x3/ag.svg":"flags/4x3/ag-91fee45d7e1bab658f840a721364dd6eff0b67f9135dc8445a1b3554c347c2e9.svg","flags/1x1/ag.svg":"flags/1x1/ag-476bf833d4e0789f71d7b0d24164734ed97627f36edd09cc75991bcfbb2aa7af.svg","flags/4x3/ai.svg":"flags/4x3/ai-0106851bba5120a0f2bca5e6187ea65c9846e696f5ca57631aa89371cdf98871.svg","flags/1x1/ai.svg":"flags/1x1/ai-50a3279d492c2932919c02880b69da7bb7948ce96988d8ccc9b16357f006165c.svg","flags/4x3/al.svg":"flags/4x3/al-f8bc9837446a4880d29088f18bfc014b4cde95d8edda1241be22b5724a74ea8d.svg","flags/1x1/al.svg":"flags/1x1/al-fb2c4d723ddbfb2c659ee2b3052d33347c130fb1024e2cb0ddd17f25b082542c.svg","flags/4x3/am.svg":"flags/4x3/am-aeabb81fbe6ac768ba7b95bb22e5a1791eb35ff83d0b5d6785c88ddc6835444e.svg","flags/1x1/am.svg":"flags/1x1/am-6fc2c9fb24a6a079960d619cc1fdaeee31cdb52d27c75bb9b065d9664d853c11.svg","flags/4x3/ao.svg":"flags/4x3/ao-34ea70b51c9069ef1a859935f07a64cfffab4e08438a9c746898da56b495d127.svg","flags/1x1/ao.svg":"flags/1x1/ao-1240d65f5dd9d8945701ed46611bd97f53f2cecf15b435cc54604eb79f4b97a8.svg","flags/4x3/aq.svg":"flags/4x3/aq-6e2cee0eae620cd3f1fe6be665fd216f9a54a2afe215441005904dfeca24c169.svg","flags/1x1/aq.svg":"flags/1x1/aq-73c87173b09f476af2367895c76cf65d159c0a0b2ec292c1f1f5b08b2e78f829.svg","flags/4x3/ar.svg":"flags/4x3/ar-71eca3c44a303392f2c8db443add184c4c79d9fa8a3e729be2528c8db53790b6.svg","flags/1x1/ar.svg":"flags/1x1/ar-0f75960e9ea2b2533e9112d4fc02154182f72460720c5a7d4dc21ef47758c369.svg","flags/4x3/as.svg":"flags/4x3/as-29ac7248b1c428a68d0e2b1cfca4fade7b0fcb38151bf980d35c3b0be63d3d91.svg","flags/1x1/as.svg":"flags/1x1/as-f516550a6b6cf7e277a1877cad9afe10f694ac32c92df7709690913fd59ecf20.svg","flags/4x3/at.svg":"flags/4x3/at-e6517cfc6605c0ffa13da8db795d6e4cd353f72434f8fe38a2ebab7ba685081b.svg","flags/1x1/at.svg":"flags/1x1/at-b9f9e8349460db6d35662b445a8a5fff96fccd904fff3411b711d31b2d7b7f16.svg","flags/4x3/au.svg":"flags/4x3/au-c929c02559051c3f51c0d93dd9df0d886b6c1efa083c0f101d2b3fd39706726e.svg","flags/1x1/au.svg":"flags/1x1/au-96828c63a52eff55282096c045a3822cde99a00bf20528810d31f27b27208593.svg","flags/4x3/aw.svg":"flags/4x3/aw-44597b0ede9ff7df0e659c464a51fdbc1a7f5cc5cd621d281302843c23a905bf.svg","flags/1x1/aw.svg":"flags/1x1/aw-2bd4b1890e233baeae0bcaaf1841803de35dd9c422f486588e48bf3506d69ae0.svg","flags/4x3/ax.svg":"flags/4x3/ax-95093e740b0b492f7cd96fe370fa2478f0d0148b89b424cd8436807234ade9dd.svg","flags/1x1/ax.svg":"flags/1x1/ax-99af962543005067e7239903eb6bc23226d30ce14a7c6408693dc9641193ddc3.svg","flags/4x3/az.svg":"flags/4x3/az-c0959e214bf9a3e94993cfc03f4884b15f6d8c4dd20842a5052a29a8495fd431.svg","flags/1x1/az.svg":"flags/1x1/az-3db731c28289795dc3bda91b3bab129d994a09b8ee0959d34f21a1f840f894de.svg","flags/4x3/ba.svg":"flags/4x3/ba-388ea99507a04cc5d4768bd708d984714aeebbe4177a1cf8ffe0b8331dd856d9.svg","flags/1x1/ba.svg":"flags/1x1/ba-b7d7ab49229704dff0192935c9fb7fb4ea6ba989ce4fee832a738a5d78b39d71.svg","flags/4x3/bb.svg":"flags/4x3/bb-6df74e1044b7f42c2c3b1082d46eb0198aa65a180459fdd950838cd2e6c00ee1.svg","flags/1x1/bb.svg":"flags/1x1/bb-eb10f33cbde25ab6ccaa49cbe3976b4f5ece2fa1d3d485394caa158f10b8b8c9.svg","flags/4x3/bd.svg":"flags/4x3/bd-6cc222c4343f0027697ddd9e8d48f2cf93d3f677b6460b530eabefd2410cfef3.svg","flags/1x1/bd.svg":"flags/1x1/bd-2dc72311aca457668c8bce4f3a22c1b76320e00be50a58fb4001ea39caf6725c.svg","flags/4x3/be.svg":"flags/4x3/be-2b7e73068f4f120ed0ccc3a9fbb8566c9574b206afd8373ed9050e2a971c4f99.svg","flags/1x1/be.svg":"flags/1x1/be-c4c9351d83a4db1f8c7c73dd6476569f0dfd82290ffd20275b7372908c2f2a7e.svg","flags/4x3/bf.svg":"flags/4x3/bf-56669967fef6bb607ea2fd26d32d922cf78f176115287e37e9cf0b8bbec677f0.svg","flags/1x1/bf.svg":"flags/1x1/bf-ffc3651e87b9ccc9374d5bc95617aad474bcaa35871c83ae91fa71eb8b46bab3.svg","flags/4x3/bg.svg":"flags/4x3/bg-ad796782d048f6ddc6715f7ea915a2c86716753579735ec071a106a7f3fc13b6.svg","flags/1x1/bg.svg":"flags/1x1/bg-962bd196cc8e4b702757e17a9002e867843c16415a47a52ecd97459278e5fa1f.svg","flags/4x3/bh.svg":"flags/4x3/bh-aeff05c6dfa41e89db539312faedc41198ba2f2d9bf5ad9f22992a0a5a4151e8.svg","flags/1x1/bh.svg":"flags/1x1/bh-12da0d548841b860a7aedbbc858df1278a4f56105ae643f9379f5c2a3caa294a.svg","flags/4x3/bi.svg":"flags/4x3/bi-7f43c6407a6f007fd70e7b43f9b34e870cc757736a9e2399c46381c8434d238f.svg","flags/1x1/bi.svg":"flags/1x1/bi-454adb690bfce8243896377b9c314ef8f447ec4d85dc677860f521a6c30c896e.svg","flags/4x3/bj.svg":"flags/4x3/bj-85ecb891b5ebbe5802bd23d41fa44f1c1dbf047aceba991e6006e377c53fa263.svg","flags/1x1/bj.svg":"flags/1x1/bj-861b63ba692ecf3e1705296e51ef4f80da47a2eff5cfa29a787bcbc4fc989a53.svg","flags/4x3/bl.svg":"flags/4x3/bl-2c832da5dfab278f90dcfd6265c08211802e94d9b6a5634df6dacdb750723312.svg","flags/1x1/bl.svg":"flags/1x1/bl-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/bm.svg":"flags/4x3/bm-05e6a9d863d77266cc3e2a74fddea640757e09b54d3032711f0d1890b5b61d3d.svg","flags/1x1/bm.svg":"flags/1x1/bm-0a16d9ab856676f9511627004ba4ee08ebe041533a33046c3f732ffb2793cf8a.svg","flags/4x3/bn.svg":"flags/4x3/bn-1560949666220d88ee037b03ce1ac0b95c1b91667f05cf2b8b06a043efb01253.svg","flags/1x1/bn.svg":"flags/1x1/bn-387ebb4b9e1b3796c94edd61402851eafb8b185d7061671b832c1879db69d6eb.svg","flags/4x3/bo.svg":"flags/4x3/bo-96c7f8e64029f530108baee22d8a07cad2787f41eeed0b647f800bb533c39c63.svg","flags/1x1/bo.svg":"flags/1x1/bo-ef679f07e201a91bc3e2152310eb597f731f7133d58be7fc0b1bbb3d8538c666.svg","flags/4x3/bq.svg":"flags/4x3/bq-687781ca2bff027ee1c2bf587d45147cbe81af412d8a4c52e89673535bfa6a6c.svg","flags/1x1/bq.svg":"flags/1x1/bq-4c8a202ed7a99c1515fad01c0b79234163b42cfdc813aee71c0d277b49aadaa5.svg","flags/4x3/br.svg":"flags/4x3/br-8370504ef87598decf706a50bc8b5deecfa80f965b4c3642d2207c9e0804be3a.svg","flags/1x1/br.svg":"flags/1x1/br-cce00e29adbdf110d4155153c8f21e36c46c34847baffafc33b806e121e320d7.svg","flags/4x3/bs.svg":"flags/4x3/bs-80764fdde4884571c2ce5c348231dfe2c57c9e81d4d0d8722ae649ef37a9888c.svg","flags/1x1/bs.svg":"flags/1x1/bs-0a06f669be5ce81e27f5d9ace25e2254113cad9c2964208b5cd136e8b173b6e8.svg","flags/4x3/bt.svg":"flags/4x3/bt-9d00de93c399a0ed1118946c0d662d997847480445bfbbba259e42f80b170be6.svg","flags/1x1/bt.svg":"flags/1x1/bt-32fb8022976e00163073b1f3ff2f62dda6915dd4270d2e09ae51babe67d2ce32.svg","flags/4x3/bv.svg":"flags/4x3/bv-e0fd8f945e245badbcc8deedd6c139e2e19d26b3aea7bf1b9714595a2b08def1.svg","flags/1x1/bv.svg":"flags/1x1/bv-dceefec7161747877af75d9c4b5bd8c53bfeb5cbbe94b41de9a2201321673653.svg","flags/4x3/bw.svg":"flags/4x3/bw-b5231bca6e8f2dd2371e3b4f776cb33af3889d2ad41c3791feb7cba3afe12992.svg","flags/1x1/bw.svg":"flags/1x1/bw-35bd0c7c542ab29aa65df0322f37befe54917cde0ec29a6358a8cbfcd3eb78a2.svg","flags/4x3/by.svg":"flags/4x3/by-0111fe7946228bd49fa5ffc1d04e1dbea12bb0483cee4bf146e23fcb5d7bd829.svg","flags/1x1/by.svg":"flags/1x1/by-3a64902f39b8bac7c042cadcd2ace69975498cc6254f60f31829ebbfe31c2ef5.svg","flags/4x3/bz.svg":"flags/4x3/bz-f6761e8e1132b192c6c2dddcb1d0239ed14e801b8902a7ee8fb0cb869a517eab.svg","flags/1x1/bz.svg":"flags/1x1/bz-2d1e5ec107a277b8e97fede80f512c23ebbf9c225a2c5450dc51c5fb03c9571b.svg","flags/4x3/ca.svg":"flags/4x3/ca-cf63f34a0cef8ed56b4cf1ba24fecc20cea252a9eb9e2c16acccf4eb80b32f49.svg","flags/1x1/ca.svg":"flags/1x1/ca-5c78fbcd8924e8f76111f1cc50317decd6b7c1761e57f19ad33f0b295d002138.svg","flags/4x3/cc.svg":"flags/4x3/cc-f5d8e042b0f7ee2be5ed555b4ea6a0586e69eeb9230701967903364c19e49006.svg","flags/1x1/cc.svg":"flags/1x1/cc-7dc42986b5859331d9f6c96ae7a97b378ff38e4480072cbecceae78e338891a0.svg","flags/4x3/cd.svg":"flags/4x3/cd-9d7d8b11e63073792e3d5e0327cc673101c65ae7545d721b8b1504c31a0c0078.svg","flags/1x1/cd.svg":"flags/1x1/cd-f42723b2e3b7815b2a4b970c5d8a8abea987cf16ff26dbab0c1a78f3ffa3d1fd.svg","flags/4x3/cf.svg":"flags/4x3/cf-902b209a0eaeb8f41f529b5c98240d4fa94dffd58ac3bdc2b6c574125897bb8c.svg","flags/1x1/cf.svg":"flags/1x1/cf-f9b65e234b309ba4f3b2261dcb605b257bd941a308d208b1eaa89af874c779ec.svg","flags/4x3/cg.svg":"flags/4x3/cg-f62e43d08581b8665ab9a7e61ab62cc6b3dd8e6fd0722c7d45c6ddc3f46ec5ab.svg","flags/1x1/cg.svg":"flags/1x1/cg-f2fbf08b1f5fd7e097600a9399d467cb9af8d24fd103a3eeb99f5cf58e6fc0b6.svg","flags/4x3/ch.svg":"flags/4x3/ch-830fe6654b170d461a76a7932b39d352ec30895d512c009a5c193c5a28289158.svg","flags/1x1/ch.svg":"flags/1x1/ch-9f95a95e181489d64144d4502991c00823cf19fefc029cb639199cb100863a0a.svg","flags/4x3/ci.svg":"flags/4x3/ci-3e6b86d6fc1a24b5635c258bbde180f8638e114be354d7379406d5718e46b70b.svg","flags/1x1/ci.svg":"flags/1x1/ci-816edfc3bfc44353f99572310ba67643f979b1681c2643ecc34255df1dbee05e.svg","flags/4x3/ck.svg":"flags/4x3/ck-cadf8156d64ddcff3d60079d017b12bb4e25867e58fa2618f42defa4f7bc8587.svg","flags/1x1/ck.svg":"flags/1x1/ck-450d3b83c32f220510bdbab3ec0fca14edf895e53db9e26e4cd00a3edfb3e224.svg","flags/4x3/cl.svg":"flags/4x3/cl-28ce953691b1c4b0c6d562370913b3ad645e29e56296c16762992e3c30f2a4a8.svg","flags/1x1/cl.svg":"flags/1x1/cl-ed5421f0ff3ba05785268eed2abd3abf76125ec832e519bc10a30db278c23662.svg","flags/4x3/cm.svg":"flags/4x3/cm-d22cb6519bfbf9fbae46b283f6d882f8d46713f18ba59969ae45c542ba2bc621.svg","flags/1x1/cm.svg":"flags/1x1/cm-4619b0400d175f6c0f686526cfdbfcc6f7c2fc7587449e05ab0385cc7d4e8bd4.svg","flags/4x3/cn.svg":"flags/4x3/cn-7af9da3dd810174340b79e6fe636bec183c71d7ce314ac4a5a815bfd388dea54.svg","flags/1x1/cn.svg":"flags/1x1/cn-22e04d44d7f85e6f5800bddc6a497e5722de8db2ad74c6c525c392bd7b8c6e09.svg","flags/4x3/co.svg":"flags/4x3/co-ef2a3c7e495d85d7df1b9bda27023cd558abe89402cad0ff42428c2c5b877551.svg","flags/1x1/co.svg":"flags/1x1/co-42915db89e2fa2f9f97c09ecafc188eb2ec4e51efa87685a01c25d2f0afddf45.svg","flags/4x3/cr.svg":"flags/4x3/cr-7853ef9dbb5832a6d2738b44afdecfcdaa80c56cb66c448b8a8657e236854c8d.svg","flags/1x1/cr.svg":"flags/1x1/cr-b86f916cc80cc14db90b66c652a2919a26baf2864451685af9c34d6310c3f8c6.svg","flags/4x3/cu.svg":"flags/4x3/cu-e3a3afa4a5c661ad431dc45eb501d7e1280b4a397bafa3956a9fc5bab8735f45.svg","flags/1x1/cu.svg":"flags/1x1/cu-9563bc3aa0b1ac659dddaa2534c37d338e1da3dfd3726a717fc85ca8449c83da.svg","flags/4x3/cv.svg":"flags/4x3/cv-d39c3ae09026623cebad38bbe41231aea9b9afacf7eca1d0abf6666e91dd8bbc.svg","flags/1x1/cv.svg":"flags/1x1/cv-78857e96ac5b49478a49578f422abe217af9ed7d90fa2d08ae72a67de4f6999e.svg","flags/4x3/cw.svg":"flags/4x3/cw-c65dd455b3c113d9088e563033c5f1ed3945d6dd88c8f13317fe297fd2291776.svg","flags/1x1/cw.svg":"flags/1x1/cw-61f38f9076443eb7ca682abc21e6ea5f170bd855813d7297d85602b76ca36171.svg","flags/4x3/cx.svg":"flags/4x3/cx-aecc7a8b4b84b9f00a63154b027cb8ec78bebcec33e756b5e95151efb43420f7.svg","flags/1x1/cx.svg":"flags/1x1/cx-c052a0033a120d56c108dc0a919c3fccb9d01a4b78f1f778e3f2973e96197868.svg","flags/4x3/cy.svg":"flags/4x3/cy-b8e0d56b75e0954429cb2253aaf289a83e3c72abd52b4132bdd4016f2bbd43c9.svg","flags/1x1/cy.svg":"flags/1x1/cy-34aa50b77e1b86f5305beec283996cabc45fef1950582b868addc40fd9a8438f.svg","flags/4x3/cz.svg":"flags/4x3/cz-c2a15f3c50b7920c7d82fd9fb21f77c44fb3883f0e34dcf197a23d92d9212290.svg","flags/1x1/cz.svg":"flags/1x1/cz-487367824632a5097e16d7ed1ffc7fe8e233f9e1af45522571e1d4da10de92c7.svg","flags/4x3/de.svg":"flags/4x3/de-32f54fb46c7fcaf2dfcf9172273456ea57f975efb228860def92481efe51c506.svg","flags/1x1/de.svg":"flags/1x1/de-2c94f333afeb14810030d786620fc32e65ba79af53b1037192383823996bb77f.svg","flags/4x3/dj.svg":"flags/4x3/dj-d84d938856e7b6bdf8d38413c84a6968f94dc2adb218f2a9fab3d703341efc33.svg","flags/1x1/dj.svg":"flags/1x1/dj-6960cafac7e0d593152b60988fd12f5d1bb95068bf055c638cb999459f932692.svg","flags/4x3/dk.svg":"flags/4x3/dk-fdd09296ac803a8cf4066ff5488821458a9788985e3cc09356d4c4ef81959ecf.svg","flags/1x1/dk.svg":"flags/1x1/dk-87924239a5ff1605582e1736f5ef17c9bd9d580d796d94b05ff668e2a52a223e.svg","flags/4x3/dm.svg":"flags/4x3/dm-dc3b5c9634f0751ebfec181b12a7c530673ced1001b62a9126ed5ae39ba57203.svg","flags/1x1/dm.svg":"flags/1x1/dm-c8018ea775b0add069f676bbf4b446ed19886c192aa742bb6a61c3602ca63211.svg","flags/4x3/do.svg":"flags/4x3/do-5e2d6816118f78fa4a362ee6a276dac655a4c99d57a9e53a52198f1624ed186a.svg","flags/1x1/do.svg":"flags/1x1/do-f9862ff8016b35d30d5c37ac2c585cdddf235e56ac9a7ae31a90c96963865f57.svg","flags/4x3/dz.svg":"flags/4x3/dz-8a14ddcb20a69c3265924fe2af141ea78c0af47ea07a88707c392a2793092cd4.svg","flags/1x1/dz.svg":"flags/1x1/dz-0e2ada15ba7882343f7512929d3cf981a23a91817fdda0be1ed6a093161b649e.svg","flags/4x3/ec.svg":"flags/4x3/ec-a4c3c62b4272f5000e1c8f563c45ce8305ec71f4e4e49ac477d81b5cb692d7e6.svg","flags/1x1/ec.svg":"flags/1x1/ec-c42aa1de56f2933fc6703e7a59ebc8b424c66f190697ee66814a137b56fa6969.svg","flags/4x3/ee.svg":"flags/4x3/ee-6148aad79adb1c847fedb9da5a7e9c9d47e99ef4c8f4853bb9800e738bddb19d.svg","flags/1x1/ee.svg":"flags/1x1/ee-9a87370a85922c5d103d9d21fe3e778b801a62cf40e1f0efe8d708c5fe3b3ac4.svg","flags/4x3/eg.svg":"flags/4x3/eg-3b2f122e512f0fc470666b35af4f677404d4b811cd795d5cf4e44a72ffd01285.svg","flags/1x1/eg.svg":"flags/1x1/eg-a050fc5953113bfa5e12867313b321df472eb86ad1e3d5362ebb27ac2edbd28b.svg","flags/4x3/eh.svg":"flags/4x3/eh-fea043048f74c728961fe981d7e5d50e286fef39f3e68659b699c6c357c202dd.svg","flags/1x1/eh.svg":"flags/1x1/eh-8ea23a1b6813465e739d6f5e2ca6727331fae96cd32c86041a1ba48926a14cfd.svg","flags/4x3/er.svg":"flags/4x3/er-b24dc54f7e94d0934d05faa7944e6039a56de8a5e4779a399046f047dbd1b949.svg","flags/1x1/er.svg":"flags/1x1/er-6921f9776ece4a1b1ec594ec5665076462cef2d0b41eba83a7bc840ecf88287d.svg","flags/4x3/es.svg":"flags/4x3/es-e36093927dc1fa109e4ddcd4baa65d53d233c23bcdd32796b96409b52c5adbc0.svg","flags/1x1/es.svg":"flags/1x1/es-16a6c048523ee57edd91e60e87aae136a96893b48828d932a24436bb219c00b9.svg","flags/4x3/et.svg":"flags/4x3/et-a3ef36d217667b7e8ebe910469c2eeef563f03d3ea5628ec7fea0f72650db28e.svg","flags/1x1/et.svg":"flags/1x1/et-f66f415e5d5b8b697ed7bb85f4ae3408f9cefaeed7ff0136c4c03da5c3601340.svg","flags/4x3/fi.svg":"flags/4x3/fi-a94779c54a538d2f57a421e6beb619f07cc9c2bda40817d236b686deb8eb3b4c.svg","flags/1x1/fi.svg":"flags/1x1/fi-865b1ae3ed34a0cf0928c6289411569add2065c7ea4fa6897f971c322d955b16.svg","flags/4x3/fj.svg":"flags/4x3/fj-97dd8f9b0d9df1cd965c8a85ecb6feb538acc83b470596ccd199f71dc3d2eff9.svg","flags/1x1/fj.svg":"flags/1x1/fj-f772a5a860faef823adad1b0dc8e848349d094f4fa3b37e48c87382bd443c861.svg","flags/4x3/fk.svg":"flags/4x3/fk-788901bf125ceebc6c23fa03c801420c787bbc4ce6aa4511ccaaba301e379886.svg","flags/1x1/fk.svg":"flags/1x1/fk-5d8df0034167cc75863d02bfdb6147da3a694102f7eea0d92e717a048437fc0f.svg","flags/4x3/fm.svg":"flags/4x3/fm-7167ec387c426a817bccbfec86c8f815b82b36504e1d480f4f9fa04177bdcba0.svg","flags/1x1/fm.svg":"flags/1x1/fm-d08e5959b5e3866cdf814f8d6ab594cb3ca84f0887a3adad3bff824ea0aca70a.svg","flags/4x3/fo.svg":"flags/4x3/fo-af6148d661d02a6580e8714a6271776b4b8bf3b656bfd5fd88acdd1aa170366a.svg","flags/1x1/fo.svg":"flags/1x1/fo-26d5af2770c46935170988cbad16ef9aad9be34b38ea92847e6646a516878598.svg","flags/4x3/fr.svg":"flags/4x3/fr-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg","flags/1x1/fr.svg":"flags/1x1/fr-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/ga.svg":"flags/4x3/ga-80f90062ef9aa4d236c81ec6c6c6e08058750794014bb93d8dbdc8e1684ca4fa.svg","flags/1x1/ga.svg":"flags/1x1/ga-a66094862d24f29704c190fe42ff50820923f3940ff417f3e1623e9089b57eb9.svg","flags/4x3/gb.svg":"flags/4x3/gb-d85f0f149b4390bed6624bc30ca2cbfa37d394f14474fcf81d63363ad363e284.svg","flags/1x1/gb.svg":"flags/1x1/gb-2f0cc6ed1e8e9a7e56cafd3500585d685ae0c51abacddc52f750fb4d23f60b04.svg","flags/4x3/gd.svg":"flags/4x3/gd-51a8d53466df4426bec5fb202dd8f35239324b9c8b5256d38fe411c4b79945cb.svg","flags/1x1/gd.svg":"flags/1x1/gd-9156f824a83004691a7a354e925bc1680b5cffe663bbfa37aa4609ff28148218.svg","flags/4x3/ge.svg":"flags/4x3/ge-4ef2c8e6f371a711c61ac54d8d201a80aab53767cacc5322fb848cd3e38b00e7.svg","flags/1x1/ge.svg":"flags/1x1/ge-a3af8272a5fb63372705825519543e53269282c4800b70e6a93ba69674524eee.svg","flags/4x3/gf.svg":"flags/4x3/gf-c7d5ee882949b708641f99ec02edcc6b3b2362d393cc3869342442225be7cd3d.svg","flags/1x1/gf.svg":"flags/1x1/gf-b297e376fc00d3d7bfafd081766dafc4590f4ac4b71f53bc2bbdf2c028547920.svg","flags/4x3/gg.svg":"flags/4x3/gg-e99b36723ffe04d7be392d612c76ef44e82bc84823d71793eb38e338116f0ee0.svg","flags/1x1/gg.svg":"flags/1x1/gg-3f764a4568626d43f89b2b200dcbfe68de3093be418716549ab7c5c33f433d37.svg","flags/4x3/gh.svg":"flags/4x3/gh-817c2eb8b3f7190647510371b2d38ad8e28e1348cb657e34778f970af5ca3868.svg","flags/1x1/gh.svg":"flags/1x1/gh-87a6486910cb62e58439da330c4270d1e2a0fd8e1ace80987c295971d15f9af3.svg","flags/4x3/gi.svg":"flags/4x3/gi-52bfb6cd7cbebf1da96dfc6bf708d3b7239984d36400181ca4ac020081ae41b5.svg","flags/1x1/gi.svg":"flags/1x1/gi-f7ebd8d36a5cb260392a92f10d8bc8d7cf11433fdce9474e08cc52a07dcd5258.svg","flags/4x3/gl.svg":"flags/4x3/gl-e031a722ec76e8262439e50a0dbba62f7b7bea020361f2bf4a9a49d6b59954a5.svg","flags/1x1/gl.svg":"flags/1x1/gl-847b3362e50c1d74aeb01a5ea55cfa2950597cbbfa2377bd7cb70e273d4c57fb.svg","flags/4x3/gm.svg":"flags/4x3/gm-a13d89d1cd66c77706dbaa380370ce3d62c0cf3219c287008759e823fd42a27c.svg","flags/1x1/gm.svg":"flags/1x1/gm-4a4490e2aea203b32862d6e58bd02efc45d07a401684795ecae68ddb97756387.svg","flags/4x3/gn.svg":"flags/4x3/gn-cfa24192de905cc4a07dffb54ea252304bcffd387ce2d6dedae89b654486f286.svg","flags/1x1/gn.svg":"flags/1x1/gn-b50eaffe8a6fd16c9cf2c2d51adea53250b089f04ea701b8d5d812877de6d084.svg","flags/4x3/gp.svg":"flags/4x3/gp-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg","flags/1x1/gp.svg":"flags/1x1/gp-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/gq.svg":"flags/4x3/gq-548afdaa6c448c6bec87c1e2148831c41f9a2f4f83922cf32e5a3904679d889d.svg","flags/1x1/gq.svg":"flags/1x1/gq-28c6e2820b326370a489d4f9efaf258432fdabecb67e610ddd752ed0f0e8a8ce.svg","flags/4x3/gr.svg":"flags/4x3/gr-e2aa8c913feebbed26a8fa0de5ac4aeb51545a4c0dee9bfda4ec5d9673f96386.svg","flags/1x1/gr.svg":"flags/1x1/gr-64dc4363c7c3b827adaa7cd51bb8a0f30bd0a547e86772c473d433b1a6033e2f.svg","flags/4x3/gs.svg":"flags/4x3/gs-83141fac364fa2871379c6b1cb8da9935a185bf9b0e5dafc6b6458fa13359589.svg","flags/1x1/gs.svg":"flags/1x1/gs-31c9e0016c7bd2cfed68cc4e6c2ca73123ce9391e8a50804e5c74101b72e07cc.svg","flags/4x3/gt.svg":"flags/4x3/gt-b4ca8c4ed71131c43ba14f3631a0ee92dababef325bd698ee0bac0da84980c85.svg","flags/1x1/gt.svg":"flags/1x1/gt-a7ce73eaabe1b659b733691076f8455051951432a1fac682f5896f8c4af6ff69.svg","flags/4x3/gu.svg":"flags/4x3/gu-a71a2e02c06f22984e424d15a410d9261ec9ddeeb3df112d5f46b66a09f5bd9a.svg","flags/1x1/gu.svg":"flags/1x1/gu-2156b3d721b79189d40c7f5b5de9e219f83a40b69e0a3855514a097fcdc2f2d2.svg","flags/4x3/gw.svg":"flags/4x3/gw-9eba06bd7c024dbd764b1bc1360120ed8a280d59075f81a50994930534cc42f2.svg","flags/1x1/gw.svg":"flags/1x1/gw-6c4ca99e9871a9cde81966aaf02aac0106e2210f9c64e94bdb5168c7abbbc0e6.svg","flags/4x3/gy.svg":"flags/4x3/gy-b6f25e30b463f760ea01c81ff88a3932bf6812e6b626fd7fbe711a4cbac246c6.svg","flags/1x1/gy.svg":"flags/1x1/gy-d82b2a81ce6cca3e7c5854a5bc1198224b6455eab7adf06d69822a3cf433a1d2.svg","flags/4x3/hk.svg":"flags/4x3/hk-b69c165653e2d112296b963d3369a7d8f656e77432c6c1c5ac1485db077c80a0.svg","flags/1x1/hk.svg":"flags/1x1/hk-09c50dc6f3b0d5bffbc85a2998c5c86da531a939cf48c07ddb644061ab0b2222.svg","flags/4x3/hm.svg":"flags/4x3/hm-faf74b1cde15843a42becf5d05a373f9af8d867d68c824e80d2c41b48c23ea57.svg","flags/1x1/hm.svg":"flags/1x1/hm-6cc1243d9638246c1bac7e52287dcfc6f9b00d142105fcfc9e8b7b3405d4852f.svg","flags/4x3/hn.svg":"flags/4x3/hn-3ad02422915a4ac6a81c3249610cbd42638ebe27d412a2d490bc63e75e1028ea.svg","flags/1x1/hn.svg":"flags/1x1/hn-f0be4d00b892418864d0e4cd3000ee2dc519dbb96d424cb42f55707f8999d44a.svg","flags/4x3/hr.svg":"flags/4x3/hr-6671992f1644503121dce7774bf2f7e2ab65da14124251d80b024d78fb34f6f0.svg","flags/1x1/hr.svg":"flags/1x1/hr-f086b6932d53408f2b57db5e038dc7b508af60a49670e187eed42714f1115b49.svg","flags/4x3/ht.svg":"flags/4x3/ht-0c3452573c61366d1e9d647d61675d2e9a309312e63c649f98d73fe37d2aab4f.svg","flags/1x1/ht.svg":"flags/1x1/ht-80c212d49effab9e944de758c08cc296833bc2a04b3098e8ee58266657522fdc.svg","flags/4x3/hu.svg":"flags/4x3/hu-b48c8253bec6b4e08f8954a2955fdbc2311d254b51358770d3eaec5fe0875965.svg","flags/1x1/hu.svg":"flags/1x1/hu-af59966ca652f5ba1d081af0c1c2343acb479d1a06e03d248bde266cb29aa931.svg","flags/4x3/id.svg":"flags/4x3/id-e02525ae7152d4bd10dcad2ffdf0bf5d08c6c67d3142bc78a7cdbcaf1fcd4a4a.svg","flags/1x1/id.svg":"flags/1x1/id-5b846f6ce4715ea50d4068d9941290229c1be67d619a978096eab2c612e9b297.svg","flags/4x3/ie.svg":"flags/4x3/ie-0e75a4c4027484997f14bd4c2529384ef6c621591908473ccbeda20381c05c93.svg","flags/1x1/ie.svg":"flags/1x1/ie-6446113a9abff1feba085706937ff83d73ba310c78153e8da3ca2d6f0c529510.svg","flags/4x3/il.svg":"flags/4x3/il-98c3c0d9628008ac3a947d8f10fcb01d8e2545dfb265e94e6a29910e1ba57a2d.svg","flags/1x1/il.svg":"flags/1x1/il-0f95bc7892bcf9eb3b6af9bf930e803b5121c45fa7261874ab4d7a8542c20c45.svg","flags/4x3/im.svg":"flags/4x3/im-0c402e364a705500028c46ccbd78a29944e91103b490607b366ae1d4f221ffc0.svg","flags/1x1/im.svg":"flags/1x1/im-718f45e1c60fd42db2a814bfaaa3a9be828f4dd0e4a4aea49e021f066087dece.svg","flags/4x3/in.svg":"flags/4x3/in-a6c958c4b5cb12e2392d81b11dd0fed5fd5d0a66c7decb3ad3c8d27175854d3c.svg","flags/1x1/in.svg":"flags/1x1/in-b4163420567e8e04fa58b79688af8d7bacf32ddf0e2b63ae2f1c5f0aacaaa696.svg","flags/4x3/io.svg":"flags/4x3/io-b951cf1fa71ddae941ee31dd018d2593bb8621ff92508bb311c7362c537a474c.svg","flags/1x1/io.svg":"flags/1x1/io-d9dfc871f0bca35430b17de2e55394b0145334aa2080e07856e21d6d2e007d8d.svg","flags/4x3/iq.svg":"flags/4x3/iq-6a74e49d2c3d0ff072086fba1a2fc8b948ca34891a3aca960f9daacec107bcc6.svg","flags/1x1/iq.svg":"flags/1x1/iq-95f5be79b6ab86e6338abd39ef8499af1517dba8ec3b266ea8e3c954601f0bbb.svg","flags/4x3/ir.svg":"flags/4x3/ir-5f9fdfd2d4cad535338f6de7927cc8094d02eaf06dd5122d3cba9e859c9ec4df.svg","flags/1x1/ir.svg":"flags/1x1/ir-f5367274525b1f050dfae895943620a2e711f63a5726b273b488721a4501465d.svg","flags/4x3/is.svg":"flags/4x3/is-15409efb6cec16b490b4abbbc03db415ef3448cb8cb281dd7cd1b2ba496d534d.svg","flags/1x1/is.svg":"flags/1x1/is-500c3ef83fe917ab9cad59b7e8e6d693d9e78876febc1882c4bb06c8876b7357.svg","flags/4x3/it.svg":"flags/4x3/it-a285a0e341ba9492a2b7478e8a7a13f7c76d3c6a581aafb965ea26e1c554f0f3.svg","flags/1x1/it.svg":"flags/1x1/it-eeb47e346a5f6124b34f8428c97fc7dab2726f8d36d62dec08df3ec7171353cd.svg","flags/4x3/je.svg":"flags/4x3/je-b611f3e0fb7a94f85fa7d5f6f7a7db839381d054eb92abe0856dda8218c40687.svg","flags/1x1/je.svg":"flags/1x1/je-39c0c1482c1c533366153edc873f5eae266fdbf591e2022a7f82c17ce2d676ef.svg","flags/4x3/jm.svg":"flags/4x3/jm-62fcbb8ed5b923b6aafe3990a24ad571485b4ac8db1bd7ed7b200cfadeeb8d7f.svg","flags/1x1/jm.svg":"flags/1x1/jm-b57cb61fb8eb67f0887afb7c779d6033e1c4c10242662093df69496aa58cc464.svg","flags/4x3/jo.svg":"flags/4x3/jo-8e1174e66beeec19016b2754e8bdae987f420fa937ba78efecd61c177d9d40dc.svg","flags/1x1/jo.svg":"flags/1x1/jo-47d2fc18e8af9194bcb249161a10383f89c11a73148b6dc77f4ab47a90294ae1.svg","flags/4x3/jp.svg":"flags/4x3/jp-1785964f1f3a4346ab8e1cbdc211399c5ced34a566c4725f3d23e8105413d6f4.svg","flags/1x1/jp.svg":"flags/1x1/jp-a71cace9d237527635ee960b4df645f202d630c46458cf7e7a7ac09659e4404f.svg","flags/4x3/ke.svg":"flags/4x3/ke-680e981e37f7f0497e148043390987748a5bc78f4c3af09cf58c61d42b2a4a24.svg","flags/1x1/ke.svg":"flags/1x1/ke-60ff7f8bf6b5da9182867b8200475cb0a87f80cc960643ee15c99bcdcf200654.svg","flags/4x3/kg.svg":"flags/4x3/kg-3a93d17f0ed778664ae760032710fd7235bc43090de3543ec50fb8d2dfd9b595.svg","flags/1x1/kg.svg":"flags/1x1/kg-165c50f348fe0d4d8f0bc9cbf2666acde0f3a81dfed3398b8a7db5a51e3348aa.svg","flags/4x3/kh.svg":"flags/4x3/kh-6f3eb3cb44cd8124f4b7cb0d9230ddab4f782ad10746c2e1fa73f54ca2fe4446.svg","flags/1x1/kh.svg":"flags/1x1/kh-9541bd094c9e79e8ebb77a8ba94b22ed079b0502b2d70769b89ac9d19d16781b.svg","flags/4x3/ki.svg":"flags/4x3/ki-a1b39a59ce5be52e1c6ca618ccc97f47d2a7b0d652bc2e5814c30a13d03842b8.svg","flags/1x1/ki.svg":"flags/1x1/ki-e9e5127171d893619b247b605865507b61019dee9e6ea589c5cd0c0e7d513f22.svg","flags/4x3/km.svg":"flags/4x3/km-2ad8132e636de92218e06cad237154128fd1e84dbed82610e138ea148a53c01a.svg","flags/1x1/km.svg":"flags/1x1/km-d9d978cca1790b3165a0d18e159a536b4a2405f12b0200b03cf721042d326089.svg","flags/4x3/kn.svg":"flags/4x3/kn-08b7f26ac06f65c797de647f61bb738a4212cfc9ceb53ef11d8db093b58386d1.svg","flags/1x1/kn.svg":"flags/1x1/kn-e632854084c163a1752b53117eb4f773e57eef231917db846fc8009541cfe4b9.svg","flags/4x3/kp.svg":"flags/4x3/kp-f073e224e1faff5a0bbcb51cd05288d1b13cb607dda42fc7702afe8cfb01d0b3.svg","flags/1x1/kp.svg":"flags/1x1/kp-504fc83119f2a2c34ac75051d3ce15edee6f93555d729d759ef15f5f5caab3d3.svg","flags/4x3/kr.svg":"flags/4x3/kr-dbe4354aefeb100e561ee6f6ea6cc46551c1722d1b75fc164b60b0592d9dc30d.svg","flags/1x1/kr.svg":"flags/1x1/kr-3aefdef6c6b72177aea924981a673bcc58c24b8c98cb00960e23250c07766b63.svg","flags/4x3/kw.svg":"flags/4x3/kw-fc682de5f565e3a918a9cce44a87a0cd8a40b93a555be3dc7c381ced74853021.svg","flags/1x1/kw.svg":"flags/1x1/kw-63c2078d09713c30c0b917fdaac63a1fdb9161ec4b8cf1e91d4a9a8730a5cb65.svg","flags/4x3/ky.svg":"flags/4x3/ky-77da018be33fa8aec69147e6107ff363bfc467ba857e7d47bd383984305cebab.svg","flags/1x1/ky.svg":"flags/1x1/ky-4a6b098e38d727959969a977668aefbdf6b9adcaef4cd922aac232d64a8a9d75.svg","flags/4x3/kz.svg":"flags/4x3/kz-ce3998065f1b6242d0a1755ffb590f15b2ff477b594b26b9a497f7181304bbe3.svg","flags/1x1/kz.svg":"flags/1x1/kz-795fd9bf32b68805f9e80f120db569eacbd5727fc523d7ff89943bdf9ef5b1e9.svg","flags/4x3/la.svg":"flags/4x3/la-dd2ead7123a2c4d2fda71d8a462319d30c6ff8e83c72cfd888230f6a670fdff4.svg","flags/1x1/la.svg":"flags/1x1/la-7ebc9f64aad0049a8167272ce06a7c1512c7d14080ff93a88e6b28e4050f33d3.svg","flags/4x3/lb.svg":"flags/4x3/lb-7afb0e27b8cec77e2c65c3467b68ab24d49879a4739ab4780154a7db4358f6fc.svg","flags/1x1/lb.svg":"flags/1x1/lb-6f50829425260779f08ad80ac9430796e64901b0dd74d010bdf2336f541eb47d.svg","flags/4x3/lc.svg":"flags/4x3/lc-9efcb3c88f9ff13bedcbd0c7f48c7fab604d3842ee559be3a11c6bc64e31a53c.svg","flags/1x1/lc.svg":"flags/1x1/lc-31d72d1034bf031934561da9615fc3db916bb08a210f434a981e053a7edfa339.svg","flags/4x3/li.svg":"flags/4x3/li-9eed98d7d4e07cba0a2aae80e31add4bbe663e959df8cafd607cef17daf4351a.svg","flags/1x1/li.svg":"flags/1x1/li-f655bf461c1690078c846528eb6d3ebe8d594b2539e3cc37f89204a754424c81.svg","flags/4x3/lk.svg":"flags/4x3/lk-3471b0585fb1e0ee350d6fe87e55ef07eef01e99444263b86ff005156dea1b73.svg","flags/1x1/lk.svg":"flags/1x1/lk-d3bb56415e6e2095a470cf4e2ed455c57cde204aa79362786aca785db35ecff8.svg","flags/4x3/lr.svg":"flags/4x3/lr-a39f30a6169c4a3f3ff8e0eb04862e7f941c5d7c8e489ff5e7e4cd8cd436f5e2.svg","flags/1x1/lr.svg":"flags/1x1/lr-731191ad65bf784386cabac12693722d16aeb2e97d6456cc33488f805067aca8.svg","flags/4x3/ls.svg":"flags/4x3/ls-1e4f7ec2600e30b515cd12b509c376c3014d760731d89f87ae9a962fe249b3d4.svg","flags/1x1/ls.svg":"flags/1x1/ls-ba2a8327ab9b0e74f4f411ab989980cde309e86395736a1f77e17a0eefc85266.svg","flags/4x3/lt.svg":"flags/4x3/lt-d6a367644254244a8219c2eaa525b43d261f5da4fb074b0e08cedeb343f737a1.svg","flags/1x1/lt.svg":"flags/1x1/lt-933670ec7627a78f72b60cfe7f49cd09b4afa58fb341857f76a5b7b612c12c97.svg","flags/4x3/lu.svg":"flags/4x3/lu-949c9e81217b58fe622d4d4d00903499b3e2249aa3f688401b78bd3ad977c740.svg","flags/1x1/lu.svg":"flags/1x1/lu-ab39ab3ddef396fcd816d4170f3f73ed89465ed37a180685c68b3833aa3f01a9.svg","flags/4x3/lv.svg":"flags/4x3/lv-b672e3ee7e344abaaf9128111a6543ad7897aa92084b74c42a2877aa1b8cf7a8.svg","flags/1x1/lv.svg":"flags/1x1/lv-55fc46607d153eb1d40d1b478ab6448117b79cdc3d9d973ea2beb44ee4d77316.svg","flags/4x3/ly.svg":"flags/4x3/ly-6f996771734c3f63c65d925a3d991f7d238734cc10e56b3160841fac2939e21a.svg","flags/1x1/ly.svg":"flags/1x1/ly-4e0bf9ff6856dcbba708b4fb176abd44cd385274badbb6e609b596a660109191.svg","flags/4x3/ma.svg":"flags/4x3/ma-70b305040cec175c749a22e6d1e0c1c96bd2164768f208a34d6c8a7ed5caa0ae.svg","flags/1x1/ma.svg":"flags/1x1/ma-919d8fa71ed3a3cadabade682f5326334f11d659245d51b31b40880689cbe275.svg","flags/4x3/mc.svg":"flags/4x3/mc-f0bd30faa57995276026f00e97f6d4ffd3c151e6d2c3d440331ac739965f3bc9.svg","flags/1x1/mc.svg":"flags/1x1/mc-6fcd8ec0404ec1e02e8f38934202004b443c39ffa369be045872c4c89b0674b3.svg","flags/4x3/md.svg":"flags/4x3/md-4bb12bafd1cae33ea4d420dc80301e573d39247323d0eca7c343650a414931ad.svg","flags/1x1/md.svg":"flags/1x1/md-76e3c791e11574492239b07821b43d8f5308e8b7b9ed7d72a5b189f06bb0a81d.svg","flags/4x3/me.svg":"flags/4x3/me-096ce4c309762cde78cb1fec7f1d9ab7c38e6270ddb5aaaf9d29ec63a160e276.svg","flags/1x1/me.svg":"flags/1x1/me-9f8dc8f8e7b38bfc2edd5a35d13818544d304c7834a315ffbfcccecf7a9e6ba6.svg","flags/4x3/mf.svg":"flags/4x3/mf-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg","flags/1x1/mf.svg":"flags/1x1/mf-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/mg.svg":"flags/4x3/mg-f8afb0a551765b27b0c173a623e30af523e907e665858c401e8246b2fa5c2052.svg","flags/1x1/mg.svg":"flags/1x1/mg-d5527653deeb8cd3c7d24082dab7c9dcd8218dd9c9043c832cb1436f1d8090ae.svg","flags/4x3/mh.svg":"flags/4x3/mh-4edc79226b41a72a4f0a8ca6d4f7f8f73e92972ae6b30c96a9dab4274a046165.svg","flags/1x1/mh.svg":"flags/1x1/mh-1bd8a38684a5d55aea8319d106fdc1e62a91424e36a8fb5a27f215cfadb98707.svg","flags/4x3/mk.svg":"flags/4x3/mk-2098f24dab54b22fbc7aff34c15009b4ae7012a6848cede09d6db9ed5caaffec.svg","flags/1x1/mk.svg":"flags/1x1/mk-1b083e708a18b40383921595134b167e0fa84a6f233934668481b902b518f089.svg","flags/4x3/ml.svg":"flags/4x3/ml-5cb117165c5ebebb07725430dce0fbd0bce2ad618967354eda44d9229e16c676.svg","flags/1x1/ml.svg":"flags/1x1/ml-cf94ba5bc9f5b9f3b15c187243a5fc60dd80a43715da7ae005dc13321f0d411b.svg","flags/4x3/mm.svg":"flags/4x3/mm-987d96563a6517ba568b2ad3e8dbcd77c01c0a6114b8497b214cf3e967ce27d1.svg","flags/1x1/mm.svg":"flags/1x1/mm-a78cffaf229320ef1cc28570ec3e91e9e188d8cff8cc01f14423b9c5383e87d2.svg","flags/4x3/mn.svg":"flags/4x3/mn-a3dc85a21b868793f084dd954c31e13c0cf993eef59102a102406c95d99e243d.svg","flags/1x1/mn.svg":"flags/1x1/mn-141a15f289b3e49d8e0c1a21b9015f14ebb9e55660ebc23deefa55a3fa6fc9b5.svg","flags/4x3/mo.svg":"flags/4x3/mo-f58284a9e6021d88f7756d6cbe408f79789a30113084ef6bbd8541e15008d684.svg","flags/1x1/mo.svg":"flags/1x1/mo-b871b2e0087b09318060384476b25c28de16acac946f5ecbb4e162660e6486c1.svg","flags/4x3/mp.svg":"flags/4x3/mp-d9f8b726babd7cba9e128eb81ce7e7d9adb81945f056072aaa3b5540c8299f9d.svg","flags/1x1/mp.svg":"flags/1x1/mp-41d27c2d802f8487a3343a962c11711e9ebf682bda766cceb72ccac2b37dbda0.svg","flags/4x3/mq.svg":"flags/4x3/mq-21e70a8c243dc97f486dadf01f0b3300a8310c719d5a650fe4d7512e7ee8169d.svg","flags/1x1/mq.svg":"flags/1x1/mq-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/mr.svg":"flags/4x3/mr-76898913a879ac1eadb03f5950843ea63fd9a0a998d1b9113c386012cf1c80e6.svg","flags/1x1/mr.svg":"flags/1x1/mr-5288f91d4c12b6fdca7129a8564638991028f730a170bb72be9fee1ac8d8f206.svg","flags/4x3/ms.svg":"flags/4x3/ms-add4964ba7fa5a4440d40902dabd49345476d13ddf6e20e7b06834ab30721b79.svg","flags/1x1/ms.svg":"flags/1x1/ms-47f49520f4ba965587509e45980be0ef29792830738cdae717e52616a11bc00b.svg","flags/4x3/mt.svg":"flags/4x3/mt-55b5c69335d7e2691e50443b34fc5b708309c99326fea6233dd3575c3402043a.svg","flags/1x1/mt.svg":"flags/1x1/mt-bbdc4f8e3dc66dc066d8ad0a264d751090794c53eee6be34f8df84ab389988a0.svg","flags/4x3/mu.svg":"flags/4x3/mu-d0d2fd85209d5ca5b9f90da3947f3142b96ae688536ed796f2bc912aef84c333.svg","flags/1x1/mu.svg":"flags/1x1/mu-3e18fa9a066e02636f5a119d445b4f0439c8b75bae4e2999c17a6105bb95bd5a.svg","flags/4x3/mv.svg":"flags/4x3/mv-595fccd022d985bf319bfee09ded164593e8206c364adc1fa3abbc68450c516a.svg","flags/1x1/mv.svg":"flags/1x1/mv-ba59c37e1fcf099ca68e7fa68fc30d5e75c4171aad18be54126fd214a0b0b6b5.svg","flags/4x3/mw.svg":"flags/4x3/mw-67c2a39590afb916054063262e67293e303a264b9f9219767c13feb988f47212.svg","flags/1x1/mw.svg":"flags/1x1/mw-b82e28e3e51b467c8db86b1dd9cae837204255320928eb5e5f6b8536c7b1b28e.svg","flags/4x3/mx.svg":"flags/4x3/mx-416fe6de02b7d9dfc0e479454d06fa7701631bf848c888365bc56978ea524bc5.svg","flags/1x1/mx.svg":"flags/1x1/mx-b9461685b2714abb039fbd65510729f7ab324940045465b1c74666721d721f7d.svg","flags/4x3/my.svg":"flags/4x3/my-c0f21e9c6679e1ae455392ded0b9e5d8aad5f5ee79589634ac89d88f0c548060.svg","flags/1x1/my.svg":"flags/1x1/my-868a1feec94ccf789db1040a953f25d3982056514195dcd961ff2d6b51b04431.svg","flags/4x3/mz.svg":"flags/4x3/mz-0c06b80f82ab675854d23444740910298f4b8e82b929112dbec4e1927342120f.svg","flags/1x1/mz.svg":"flags/1x1/mz-09a8632f1d20d400401b944af3c4b13e5d64052466bf9a59f6d2927d188150da.svg","flags/4x3/na.svg":"flags/4x3/na-43a5f5934fc004e64eadcfb7675114ed1eab3b7f1e9153886edb0b69e7581ce2.svg","flags/1x1/na.svg":"flags/1x1/na-549c5971f5c2a771c83113a4f9b7a9b5e69546d855e92559b49d6772ff6d3e82.svg","flags/4x3/nc.svg":"flags/4x3/nc-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/nc.svg":"flags/1x1/nc-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/ne.svg":"flags/4x3/ne-3be65335a772b7ba2c8916d0d60f12ed4cc2aebc302151ea23ced9c9a3c38ed4.svg","flags/1x1/ne.svg":"flags/1x1/ne-783c25c63f68afe3c462b326b7faec7cc1493f6a4c140bc62fd524604de09d27.svg","flags/4x3/nf.svg":"flags/4x3/nf-6ff37be9a0581fec55eef9e9871aa0d76d61c44007445184712ec6df3a04208a.svg","flags/1x1/nf.svg":"flags/1x1/nf-2f25b6485f62ce38b25bc9f6428d3e0dc0043d71221eac1f4c3d71bca91c2ea6.svg","flags/4x3/ng.svg":"flags/4x3/ng-22aaf5a93f277f26cbfb21f7b141476fc8853298cf423fe5c849f87c2813d4e1.svg","flags/1x1/ng.svg":"flags/1x1/ng-8753476807ab9e0c201397dbe6a884155d97e8766667d10071650d64fe277fb0.svg","flags/4x3/ni.svg":"flags/4x3/ni-295d07e91f9417b2ca8c7c918481874a7da7f9ac25035edf3a8d1d79b1230e32.svg","flags/1x1/ni.svg":"flags/1x1/ni-6786ef719864e51745934adc319ed0ed95fca75687ee6050d580435ee3f2b236.svg","flags/4x3/nl.svg":"flags/4x3/nl-8f7bff63589346e93733c01f1f18c5a11e8c94911253bcf852f173a933cd928e.svg","flags/1x1/nl.svg":"flags/1x1/nl-f46400354e3d489228eca5944d9e181114fe1f748fa22ac0a70fd06c557bec92.svg","flags/4x3/no.svg":"flags/4x3/no-ecdb24f870c1e6777529ec85e3ea8d989a75b5874ecde94fead0218f7c1b5605.svg","flags/1x1/no.svg":"flags/1x1/no-47a12b11ae8b0aca7f7e3d9084e9d3a6c0ef1ad979d22ba9258e6f9ddc3ab16a.svg","flags/4x3/np.svg":"flags/4x3/np-b32c3bad572c4f27b5eee9c1ca97a5f2ca1c2a5b720b67fd636c91064e5fbdd9.svg","flags/1x1/np.svg":"flags/1x1/np-1279e1d699c05de413b30172b7ed97c13bfaa2069abe788ecf8b127210778354.svg","flags/4x3/nr.svg":"flags/4x3/nr-3818437e2251e1f7310734098d13e2eee69a6b9cc310918d3287b345618e6fef.svg","flags/1x1/nr.svg":"flags/1x1/nr-9b9edbaf4e09989f53511c969520cc2c10f3a693cdb80441b2aeabff30ebb381.svg","flags/4x3/nu.svg":"flags/4x3/nu-3b27eef18754c7fb8def8deadc730f074b090c8b6e9101d008d529c1d8784e5e.svg","flags/1x1/nu.svg":"flags/1x1/nu-9f6f9a41e36004711e3ad2e31e3d0425ca698bf242a62b9665b6f41eeb999ac7.svg","flags/4x3/nz.svg":"flags/4x3/nz-9690c3a7cdea4d5d6b88546ad69244a772fd0649e75f6334695fce89f5c4f076.svg","flags/1x1/nz.svg":"flags/1x1/nz-e848215aaf4f9d5738b886ded97ff13b69c752888a27d1ac430116f7133a1c0e.svg","flags/4x3/om.svg":"flags/4x3/om-7b9135ecdcf42a3bb69c5bf685930d32f9be7c6daaf58d5a8d154e22b6079347.svg","flags/1x1/om.svg":"flags/1x1/om-665da86c6b715f3d5f36bba0e01539e574d7871437b03ecbe29a92e5e703e09a.svg","flags/4x3/pa.svg":"flags/4x3/pa-a5b55e50a411899195a8f2bf8f37bddd94a4436582568c9ddfbddc2c99d1ae2d.svg","flags/1x1/pa.svg":"flags/1x1/pa-6c5566a7ace4125d958ec45ade8ce61e2fc065bb7fdd99cf1d6988a01b6fa73a.svg","flags/4x3/pe.svg":"flags/4x3/pe-12966232fe9a3dcc296389dea282cc8aa400327298d25f2f01c4963d1b900d13.svg","flags/1x1/pe.svg":"flags/1x1/pe-449b3363ff9efe701e1f662ae71c31bb4b5952710b73346e2ae090a90c79488d.svg","flags/4x3/pf.svg":"flags/4x3/pf-db568d96a25e93ea2d51edb9ccb8a0ba15bbe46e1241e1bb4376a856290de4e8.svg","flags/1x1/pf.svg":"flags/1x1/pf-d6aacd56a7243b922bbbd26c94696f19a3dd242df5e5ede999e0319930bf8d64.svg","flags/4x3/pg.svg":"flags/4x3/pg-def242bd4b12703b11ddc016962c0ab5ac2252e6afb53647281af0ddf72b08b2.svg","flags/1x1/pg.svg":"flags/1x1/pg-0f89210b4effa3e2f248e9d22710191ec8a5f8cc00e24e7a493fcf6013af6985.svg","flags/4x3/ph.svg":"flags/4x3/ph-76da2cb2822b71a1e7f182cfe2b8744af8704640feceb476aadf1753611c124c.svg","flags/1x1/ph.svg":"flags/1x1/ph-896fe211ebf65c4aec42a1f115ad43894870bc661eb9f32fd97962f0c6a8b666.svg","flags/4x3/pk.svg":"flags/4x3/pk-d0f9243f586c99692f7d7d18a648095badef0c11bd98645924771c71283f6a51.svg","flags/1x1/pk.svg":"flags/1x1/pk-c32541b10dabe01538a811d9e1b600b91b1724239fe99325bc1156c4183127d9.svg","flags/4x3/pl.svg":"flags/4x3/pl-0fc0d2ef9f5b48e43bd93818263cc504c825346f09a73d22c6f84dcde8d651af.svg","flags/1x1/pl.svg":"flags/1x1/pl-44281da3343d3308aaa29a9e7d060a24b8d5bb949d07197e3771aa30793f5ffe.svg","flags/4x3/pm.svg":"flags/4x3/pm-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/pm.svg":"flags/1x1/pm-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/pn.svg":"flags/4x3/pn-b9639507463a2e238b7d0f4cd976455ad4108594cc526882ed83807c321ca6b8.svg","flags/1x1/pn.svg":"flags/1x1/pn-23189e2aa8792ba5d7bbfba6f21467ec9516f9b366ddddce193a7f26ddc18030.svg","flags/4x3/pr.svg":"flags/4x3/pr-3194786def8e2510554b4d46d2ac49a10bfd1fb26f0d6803864b5982b36c12bb.svg","flags/1x1/pr.svg":"flags/1x1/pr-fb6e6e3064fc00cb41a3752358ba09e006375d6139ed63a13e6b81b4c8c53511.svg","flags/4x3/ps.svg":"flags/4x3/ps-e75b0d2d81c169c45624faf1f51ed1b9bf9b7945d71ceddac505c464f47c639a.svg","flags/1x1/ps.svg":"flags/1x1/ps-5e45e6b195fa5aa5b3c8bdff0824ef3fb354d4f1d5a1a5c4d92a9d67a568db3b.svg","flags/4x3/pt.svg":"flags/4x3/pt-7056421a09bf65c1e96a0891db8b1d37b9ece7b39a7a8ecdfcbc837d0f773cfa.svg","flags/1x1/pt.svg":"flags/1x1/pt-4f2b0e37162ed4d197eb28886933009600109e827ac83664f57f3683adc9617a.svg","flags/4x3/pw.svg":"flags/4x3/pw-8991b8ae2bef2f0e81e79442947f1c68f843be48f652a4c3a2af5dab84d73170.svg","flags/1x1/pw.svg":"flags/1x1/pw-4c45576b7f0be5b37d463d126410bfbca0f9dcdd1539fc6866f9fc116baa3437.svg","flags/4x3/py.svg":"flags/4x3/py-c416c19abcc7629572203f00253c9272876e59a88eafa893fa4a534ed8977776.svg","flags/1x1/py.svg":"flags/1x1/py-adb6cfc575e9626cd8284964929c88830d0d6f7e5b0c135649eceb8bd9de1368.svg","flags/4x3/qa.svg":"flags/4x3/qa-821f667f3f99992cf08b05498cc1a0769dee9c4e36d2a2561d6cf7827255af1b.svg","flags/1x1/qa.svg":"flags/1x1/qa-b05242965c0835a82add68dbcfb4523bc5e53e191803eab2c0c8c8762f2fce80.svg","flags/4x3/re.svg":"flags/4x3/re-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/re.svg":"flags/1x1/re-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/ro.svg":"flags/4x3/ro-63c55736a245e5fa5e0484b4693d43e171941143fcbdb34d3aa8d4cfd6160c9d.svg","flags/1x1/ro.svg":"flags/1x1/ro-f5c83b26832bb94b4320340ada4351a695bff66bb1410f6007c87e8395290380.svg","flags/4x3/rs.svg":"flags/4x3/rs-a1bff9944ac65bce131f42964a45cfce50e334c6d52eeeea65f5f6179f8acf4d.svg","flags/1x1/rs.svg":"flags/1x1/rs-6af7605aa8aee1da6e0a75c750964b21b404011cd00f2df43ae55a827952251a.svg","flags/4x3/ru.svg":"flags/4x3/ru-2ba8996aa53f5eca5d1b0ea1a67d6d469659ac2523d1b394e3d6e25913bbbc15.svg","flags/1x1/ru.svg":"flags/1x1/ru-c8ecec77af983cd6ca10baaf2fa8f3dd67a6fa84f80cabdee10858910fdcc233.svg","flags/4x3/rw.svg":"flags/4x3/rw-0fa2c78359e9603d1cf21e4bb9355414ac3eed3635a25ba8f653d0498d61bd16.svg","flags/1x1/rw.svg":"flags/1x1/rw-61cce3e871326334478d73a379b202fc8548581abc02e39a898bc4fd16b2e0eb.svg","flags/4x3/sa.svg":"flags/4x3/sa-5aec890788f78356a42e38fe6ea2c30c4c82c99a3f05f654faae5918aae804c4.svg","flags/1x1/sa.svg":"flags/1x1/sa-57bf549298c1c3cb533120975d49b6cdb9c839addf278497d133236e666239f4.svg","flags/4x3/sb.svg":"flags/4x3/sb-3433de16f2b3f2a8373de87f879dd3b31ec8369256e23193947318976b51a182.svg","flags/1x1/sb.svg":"flags/1x1/sb-e5352ddacf8edb727ef8f68dbb0951f00ae84b96e9b3b224cdf0c3ee2d33e8db.svg","flags/4x3/sc.svg":"flags/4x3/sc-9c1764a913e0577cadb24d11b883978389a818e94b39f6ac5cf4993dd041d501.svg","flags/1x1/sc.svg":"flags/1x1/sc-c1abe18095ce0b84c2b21aa2453b916e00d8c0fd72fd5161f212e6bcf9c8ccd8.svg","flags/4x3/sd.svg":"flags/4x3/sd-df15037b269e643062988e5273f3cd5a379b18d0ff496bdac97e840deb0793bc.svg","flags/1x1/sd.svg":"flags/1x1/sd-baedc80da37d70ce8fa4d5619d85b4823435180311f0c2995717116e681c20d3.svg","flags/4x3/se.svg":"flags/4x3/se-73964261d5ec45c856c9f7b57f1be90f60c5e748596e494aafa5facd817c7118.svg","flags/1x1/se.svg":"flags/1x1/se-ea6d6caac7db4cfc8d68548f70afbf6ddbf072993e655bdb0b0860f724202e2b.svg","flags/4x3/sg.svg":"flags/4x3/sg-2c8851a3c456051d7510b78da650054ee411ecdb01508ab3aa8ddac220de984a.svg","flags/1x1/sg.svg":"flags/1x1/sg-81517add5de364935b2173fd1ed3db2fefc22e07a072d03fd4f91e8543ffcb22.svg","flags/4x3/sh.svg":"flags/4x3/sh-cdfa61ab262caf8d6b13cc66f1d0e1e935dadb144d93ad28fcd850e9164c33d9.svg","flags/1x1/sh.svg":"flags/1x1/sh-763ae01f8c0189641321a0de1085f0d1ceeb962d94bb989c6255dae4616fd14f.svg","flags/4x3/si.svg":"flags/4x3/si-81f600f18fae95b3e2a6813cc012e94bdfd67965eb7ce1676780bc7d04f4f203.svg","flags/1x1/si.svg":"flags/1x1/si-6481bc748939a46efccac3df22ccc34341cc006d871a7ff521769c562a5325df.svg","flags/4x3/sj.svg":"flags/4x3/sj-8c78bb614796386f416c677e7ee2984c9997d0789306a9861e0d3f85edf62608.svg","flags/1x1/sj.svg":"flags/1x1/sj-15448521086e54b5dc1b51bce3e8424a3282aaa539514a8d63fae537d400bc08.svg","flags/4x3/sk.svg":"flags/4x3/sk-271dd9219a226c5e9768072c3d0512b9ab07d1af59a3a5642eba620e3f53ea2c.svg","flags/1x1/sk.svg":"flags/1x1/sk-4ee51ed995ad80a8f9a335b5f36b00a830da6e7065ecda1e84e427cf19dda736.svg","flags/4x3/sl.svg":"flags/4x3/sl-3fd8765025c44c215906c9d33be69326118f5025b35a93636df059926053c84c.svg","flags/1x1/sl.svg":"flags/1x1/sl-ffbed472a2b3677e9339adfd150ffc76bbae85071cbf1b14f75c67b03fff29d8.svg","flags/4x3/sm.svg":"flags/4x3/sm-72df25d7ba785caa3201dc9ea30349a5bd3891de99e6d818bff2f34914264654.svg","flags/1x1/sm.svg":"flags/1x1/sm-afa36059e43d3014dfc9088d30e86449b8463d282611b99f8d496aca155075c2.svg","flags/4x3/sn.svg":"flags/4x3/sn-3465e8417cd4bd6d948ab2311442757688af8516c6aa7c4f73c48a9447087b8c.svg","flags/1x1/sn.svg":"flags/1x1/sn-dfbe30abf15b2937f1b2de375b832ef3fe11e78f3536df35232b2f7265c00d9e.svg","flags/4x3/so.svg":"flags/4x3/so-16f7af15587913f17fd988f914c55de175ed1d4b2282ba2fa52b414c7359b440.svg","flags/1x1/so.svg":"flags/1x1/so-bbf08e60fbda4e45791d985450f6dbcd9ea779f93c818973271845dd01fc8df6.svg","flags/4x3/sr.svg":"flags/4x3/sr-7718ec6fbe85ea55c72189bf0dc94b10f20a7948ab913903e5b8050af20e4f6f.svg","flags/1x1/sr.svg":"flags/1x1/sr-692dfcca46c35b618f0358ef0cc9b2ee7c27c839f98b12134318804f6498ceee.svg","flags/4x3/ss.svg":"flags/4x3/ss-aebe3fc1b10d93add9906690e262b1baf5338529a832ff954e329c897e014e9c.svg","flags/1x1/ss.svg":"flags/1x1/ss-1d0ebcb31f2c0fe874bd046253de4eec410239c2e0f41eb1cea1f312b51bc8a8.svg","flags/4x3/st.svg":"flags/4x3/st-b24fa19cb51844a3187239e3cbacf828f02e7b8ddf4b01e9ec3366e75966c5d6.svg","flags/1x1/st.svg":"flags/1x1/st-d4d96bc9009e10cec6a00ce0d6fae3746ddefce867f63503595110b2fd539d17.svg","flags/4x3/sv.svg":"flags/4x3/sv-cd0c1acd571abd1756fc4e7eea2369c0466265b1d170a7a3618a66800ddbb4c2.svg","flags/1x1/sv.svg":"flags/1x1/sv-e86857616aaa7fc022b68dafd4a58d4be7ddfcc6d5b2c3d5dad67b457d1e75c9.svg","flags/4x3/sx.svg":"flags/4x3/sx-7ed9e6d8c02b265181248986ccd927f6540a7d55b4ec82b60baef06face66ee1.svg","flags/1x1/sx.svg":"flags/1x1/sx-09ab7415791d37231c9fb79b51fc52583407d7721e6f401cc98fc1ab12d2b62d.svg","flags/4x3/sy.svg":"flags/4x3/sy-49bb1803affb9e4ee070fb6e333a445f6df15ac11db6abe0a62f1aa922fe3c16.svg","flags/1x1/sy.svg":"flags/1x1/sy-b52b5ed6037c8e0e0a3ecd13006b79027d5fac2059fdd54109b591e5c5ada752.svg","flags/4x3/sz.svg":"flags/4x3/sz-a545e703e03ec7f9e108fa348d9e222aba1d7514bad2786f9ca8c6c3063a0e68.svg","flags/1x1/sz.svg":"flags/1x1/sz-784ee11c6629bc411d3e274eea68a3739ddfaa4c3bd18e46e62262518ae0b93e.svg","flags/4x3/tc.svg":"flags/4x3/tc-a20d2d87632b3c19e16a599dd45f3918a5f2db3025867c5f1b279050af68f637.svg","flags/1x1/tc.svg":"flags/1x1/tc-4c7c0e4227d06fb697b8c5ec5f95382b1549342013ea80211f2942f81d472d5a.svg","flags/4x3/td.svg":"flags/4x3/td-1b92327abb7d3ba9b54361f6a38018979e57d5083990af57adac25102146b939.svg","flags/1x1/td.svg":"flags/1x1/td-977813c5dfc3b6b640d1390c04c469cf92e84827ca06ed7f4984a58782a059c5.svg","flags/4x3/tf.svg":"flags/4x3/tf-f45e133cfa8a01239d65e1693492ca1de1949f3660de77d802b41c9a9fc662e8.svg","flags/1x1/tf.svg":"flags/1x1/tf-53581d6af7751cf4c126459a2226fd19cd10040d25e33d1653ece9e57a1a0e2b.svg","flags/4x3/tg.svg":"flags/4x3/tg-de9fe13020d702ce964ff7d712c6b6a3a57c3933f56fbd0c783fe0309f0dbae3.svg","flags/1x1/tg.svg":"flags/1x1/tg-92f575529494b0ba885e47302167a14343c1fd78fef5008ec3aacde7f840fd23.svg","flags/4x3/th.svg":"flags/4x3/th-6211c6caabbc4fdd4ff054cb689406bc9cc7816c01d482a6222e873b0e8fc9b0.svg","flags/1x1/th.svg":"flags/1x1/th-b8a0cf7c820f9010ce12333bfa7f8713358dee291bc955fa7e5333fcf5fc8a07.svg","flags/4x3/tj.svg":"flags/4x3/tj-4bf387aa434be996fc00be6dbb457282e311ff6c7538a484f5cb4d99e45b0747.svg","flags/1x1/tj.svg":"flags/1x1/tj-b371ab0647e7dfba73251169fe1e3180058d6556aa7293b7b573eaf43add617d.svg","flags/4x3/tk.svg":"flags/4x3/tk-cef6e368398b0cbaa4ee0b943d02155c51f9e8ab5ba27b9562ccd629f9a72183.svg","flags/1x1/tk.svg":"flags/1x1/tk-1544aef42090102ba2e154b48f8c059dfddd5789fc5f12aa859939c41673a661.svg","flags/4x3/tl.svg":"flags/4x3/tl-cd74f59871cf5453b4e9454a4820e683c06dc8c9c84dae4c47af9264bed7ab22.svg","flags/1x1/tl.svg":"flags/1x1/tl-a7cd9977244579380914f288bf358ec8b1b0abec6b8dc99e65cc35afe41bc405.svg","flags/4x3/tm.svg":"flags/4x3/tm-3db83810be6239a1c7e594a0b11a4847a7d300cc54e12e4cf4c8a9558520dd67.svg","flags/1x1/tm.svg":"flags/1x1/tm-ade1696d2299d73cc6fa06304144055f9a02c1800846516c4e21baba2a05d4cf.svg","flags/4x3/tn.svg":"flags/4x3/tn-17e7bc4e9dad2da8f12c95c56de46b21890b9d1c725ba400fa7d8df17d59fd4d.svg","flags/1x1/tn.svg":"flags/1x1/tn-55604ef719cd538ba0e2541667d4c52b08f18efe91bb52ad0954802d38ea12f7.svg","flags/4x3/to.svg":"flags/4x3/to-db07012009b9d6ac0c8eca209a68c310d9371771cca8c6c4c2022b3db1ba39d9.svg","flags/1x1/to.svg":"flags/1x1/to-1ed20c5d05424776b5d3cc17487ed8311998cb69db89109a380d59722d4bc2bc.svg","flags/4x3/tr.svg":"flags/4x3/tr-b8b3b6850c4c0ffa840db30c814dce6cb86e00e78138bafe8c2c58d263fb4503.svg","flags/1x1/tr.svg":"flags/1x1/tr-be0c612d78c2662c4e9c0dc836b63c8a7a5cfff48afc533f81c2ba2423542f5e.svg","flags/4x3/tt.svg":"flags/4x3/tt-05d9799b6519267990dccbc997c620c6478e00a96a79841494707cc3d036a381.svg","flags/1x1/tt.svg":"flags/1x1/tt-4ab2fff1efee93f41060975098c5c11e043dc0853456c8c0c70cacd4ba92e8ed.svg","flags/4x3/tv.svg":"flags/4x3/tv-14be4bb5a1fe44a8d3d58bde3dca6c63ed2974554c2008b4a2441a096c9f1fea.svg","flags/1x1/tv.svg":"flags/1x1/tv-71e98b9502d12d655a169e8c89de6d5b2fcc957d67d0b7e93dd2be8ff9e6f2a8.svg","flags/4x3/tw.svg":"flags/4x3/tw-3b699e4e60f9765601c0f84bbf3f16f953f5a454a0cf62487a0eef358f456e66.svg","flags/1x1/tw.svg":"flags/1x1/tw-62cd36c5fc2aff70bbd11312601821ca09729e9e246e32d895e0f4a2017ac0b6.svg","flags/4x3/tz.svg":"flags/4x3/tz-f219bcd0e3536ea3653178e0281620ebfe4c5b3b461c2c79fdf2b2a852de372e.svg","flags/1x1/tz.svg":"flags/1x1/tz-2829d5fc4fcdf2e6a149f63ea6b5a5f1af7b6b08fec523ec217ab5a6d9fb7e77.svg","flags/4x3/ua.svg":"flags/4x3/ua-07199c03990a6b4f285e421d928ab4dba2dfdfdb3e40dd9bfa207c86bc0f3c9d.svg","flags/1x1/ua.svg":"flags/1x1/ua-7c939efc452c13b0f8f489f3dfd37d3eba97c0f577c97f0b6673968af62a3207.svg","flags/4x3/ug.svg":"flags/4x3/ug-48c6cbeae1a865915dd5a06f56bdd576e9ed9ce5085b627ef31f3757c0937a5d.svg","flags/1x1/ug.svg":"flags/1x1/ug-da6257aa7e40121a6e8e574bf201701910bbd838cbc8d76030397c0f34ae906b.svg","flags/4x3/um.svg":"flags/4x3/um-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg","flags/1x1/um.svg":"flags/1x1/um-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg","flags/4x3/us.svg":"flags/4x3/us-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg","flags/1x1/us.svg":"flags/1x1/us-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg","flags/4x3/uy.svg":"flags/4x3/uy-3fc569672f687b4f08581179bea609b616d4b5c7d9524df918134fbcdfce6f9f.svg","flags/1x1/uy.svg":"flags/1x1/uy-90def9dd4890c96d1b6355d0bbcebe2a6f25e2bb3bbdc29c4fbba8a5fc601254.svg","flags/4x3/uz.svg":"flags/4x3/uz-e3f628aff038df64725d75a863bc636ae9da4a16f58850ad86470cc012e3a40f.svg","flags/1x1/uz.svg":"flags/1x1/uz-db8cba32635e9c36565f28fbd6b17e1e5afe26ce0af8560eeda3f9d815ecc749.svg","flags/4x3/va.svg":"flags/4x3/va-c8b81b061cbe7a9b0b5f376e10f1a863b4609c742dbb5663ef923b80d43984a2.svg","flags/1x1/va.svg":"flags/1x1/va-d267dbb1213d75780a8d41a34f9eba098a66973c1c2e7d974257f24b4be9df1c.svg","flags/4x3/vc.svg":"flags/4x3/vc-a578edb2904169d050107b4c02051531e4164120c4ac0ad19faabd41fccdd821.svg","flags/1x1/vc.svg":"flags/1x1/vc-85bbaa2c82ed6a9e077e73501bbf071956c761a897d1c4e1bbe061ad5ca9c0ed.svg","flags/4x3/ve.svg":"flags/4x3/ve-77718854ace7f0a8d8a087e331112e4b20f76e9ca7eeb9af41bacccef09bc9b4.svg","flags/1x1/ve.svg":"flags/1x1/ve-27cf5f75e9b842c417f62e3c3c502acafb67db674d5a1eba8709371c186f0fe9.svg","flags/4x3/vg.svg":"flags/4x3/vg-cefdd08a49ab6cf0ce32bf42cb7a72513dfd0a1619bac86ebedee3a86fa35c80.svg","flags/1x1/vg.svg":"flags/1x1/vg-45357a28f1dc16c13df5cfc44454ff28f082b90a4747898d27575650bc93cb1e.svg","flags/4x3/vi.svg":"flags/4x3/vi-a83bcb200832191afa4091bf2c275289aa37f664027dfce6db6b0f7109fe3b6a.svg","flags/1x1/vi.svg":"flags/1x1/vi-cf017aea4123b31f1cf60087c4742b6d57a4213bece5b3f760e16a84a811a74c.svg","flags/4x3/vn.svg":"flags/4x3/vn-16730ca8238b081b7376fc3829eaac4ddd61a5b423c24c9f07c9a02848c4827f.svg","flags/1x1/vn.svg":"flags/1x1/vn-fa15ba0b7d997046ffb7f2469f1254f7119503f2e95b35467151a947ff9b45d6.svg","flags/4x3/vu.svg":"flags/4x3/vu-4e084d69e403d0af11dfc47f622fb2ba88649b17b2038f6ebf533ce3c9907404.svg","flags/1x1/vu.svg":"flags/1x1/vu-3c93d045c0ec3c08c0e9af785016995cbd7a28ddf08ec9abfce0e39c4e842058.svg","flags/4x3/wf.svg":"flags/4x3/wf-039b39c2ab1d92470427e12e2310b2ad9d8a97a36a064b197858a083f5d7fd23.svg","flags/1x1/wf.svg":"flags/1x1/wf-94672c2e6f10547f0023b9f0fff3adfda4d60f91340f287767f1ce68e5a57a12.svg","flags/4x3/ws.svg":"flags/4x3/ws-f91aa288555a505b3e965c781de8207e2cb6e1d165603c80c54cfb111d277874.svg","flags/1x1/ws.svg":"flags/1x1/ws-e6b2a35c9702941a1fe9d84ab2bf8b28b4931b6fce24efb4ce63d3a8fb8c3b90.svg","flags/4x3/ye.svg":"flags/4x3/ye-f3c80f7f99e1f12a079fe0d96830005657aff1687da92391c0acb882b014ff8c.svg","flags/1x1/ye.svg":"flags/1x1/ye-a9b9b54ec295aed99c5439093242110193626524d336cc3115864e5ec0b787da.svg","flags/4x3/yt.svg":"flags/4x3/yt-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/yt.svg":"flags/1x1/yt-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/za.svg":"flags/4x3/za-57f1167ce07b3f345798c69ca8f159cb159f5dccb3c101616cc007ef1f2663d6.svg","flags/1x1/za.svg":"flags/1x1/za-79fe7bd792f8b520caaa2c3db12ab5138cf24867d344a38167580ab6243322b1.svg","flags/4x3/zm.svg":"flags/4x3/zm-9a1622c4151a7379ecc32434948be48ba5af564e136232d1eb6e2a4dfec3baa9.svg","flags/1x1/zm.svg":"flags/1x1/zm-7bc0c09a0b3fd9f0dd01481080be99465d71218ac0679fbb077086f24835433e.svg","flags/4x3/zw.svg":"flags/4x3/zw-2576570465c39038f092c242d89e300a0943c50c090c922bc3bd9c8af9161478.svg","flags/1x1/zw.svg":"flags/1x1/zw-4ee873fa4e174f8d150c672917c8f506b530edcca86288e4b7942c7c74a63caf.svg","flags/4x3/eu.svg":"flags/4x3/eu-ca89dc2597154e6887930fd8bdf47636f82dc13c02d9610a3da2d156f09265d0.svg","flags/1x1/eu.svg":"flags/1x1/eu-73d6f1f646500e1dc04ca798c0d192f9174268e3480a8b1d742004919b7463f9.svg","flags/4x3/gb-eng.svg":"flags/4x3/gb-eng-ec744a15618e0a99abee9e53b70985e4cbf2fc2b7051cf239d6dd19b302e4ae9.svg","flags/1x1/gb-eng.svg":"flags/1x1/gb-eng-b1650bba14f5fa14df73f964c3b3dfeca8e1d48c19f1f9b3fded729cc96cf39d.svg","flags/4x3/gb-nir.svg":"flags/4x3/gb-nir-0a09e794313d063a01d817f3ae931054dc9baddd38cfb9a0e4b3c9fa5852bc41.svg","flags/1x1/gb-nir.svg":"flags/1x1/gb-nir-c54214991841f1e32a4aaee502c6a7bde3ec3b43c0e74886d9bc7112f652035a.svg","flags/4x3/gb-sct.svg":"flags/4x3/gb-sct-c78f4e58aa162732c0a401eebe714a632ed03c5171a13bb98eb67365b338a0ab.svg","flags/1x1/gb-sct.svg":"flags/1x1/gb-sct-4983d57dfd37f55b40b22dddfeefef38d2113818914755ee830c61b97549aaf3.svg","flags/4x3/gb-wls.svg":"flags/4x3/gb-wls-963f0b8dfe114a50032ae1db25542a12d2032a30d88bbfd4698e30f50e752e31.svg","flags/1x1/gb-wls.svg":"flags/1x1/gb-wls-7d5a4120e3e0f7618bde0d4270b0c097f18472e6b1a285918d11538fb001cb60.svg","flags/4x3/un.svg":"flags/4x3/un-c75bef804cdbe6617032bfb0332f009c144b1317cb073e71deb5619fbedefcdb.svg","flags/1x1/un.svg":"flags/1x1/un-ccaaa4bfae7e430b8bd72ddfa6fb07f167c1001490fd247a37898f4632803b1e.svg","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","markers-soft.png":"markers-soft-e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739.png","markers-shadow.png":"markers-shadow-8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20.png","markers-soft@2x.png":"markers-soft@2x-c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf.png","markers-shadow@2x.png":"markers-shadow@2x-b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a.png","leaflet/dist/images/layers.png":"leaflet/dist/images/layers-1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6.png","leaflet/dist/images/layers-2x.png":"leaflet/dist/images/layers-2x-066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf.png","leaflet/dist/images/marker-icon.png":"leaflet/dist/images/marker-icon-574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437.png","regions/CA-QC.png":"regions/CA-QC-776d563b6a4ac4312cae9f0bfe630c20711346e8dbddd41040998eba79f4b588.png","modernizr.js":"modernizr-654222debe8018b12f1993ceddff30dc163a7d5008d79869c399d6d167321f97.js","agendadescommuns.png":"agendadescommuns-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png","alert.png":"alert-762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906.png","baby_gnu_adl.png":"baby_gnu_adl-232caf355c30740d5d9b30491887cd546b8849b33ca9bdb6cc71f8a47ea61815.png","baby_gnu_adl.svg":"baby_gnu_adl-97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e.svg","communs.png":"communs-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png","lef-small.png":"lef-small-160cf5b883add60c9c0f4361bd8425c75f6fb23b0e551a0b941fa0491c70e0c9.png","lef.png":"lef-9fcdd7ddd4d40de29c3809b59688c668b85f5628e219d4cd8a8810b72a64533b.png","priorite-logiciel-libre-je-soutiens-april_2_m.png":"priorite-logiciel-libre-je-soutiens-april_2_m-6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc.png","team.png":"team-cb04c7a311f7160c4eb6a281eae68be84f26991dde5d415bb4e205e6726ae275.png","application.js":"application-a3e14c617593fb4bc194d8021b38514c9b130e782e45cf92a07e546d36602c13.js","markers-matte.png":"markers-matte-497826545a90e09a240504d14530eba45823b19fd44175e09e27c47cd822ddb9.png","markers-matte@2x.png":"markers-matte@2x-948fc8c4426f04f60964ed20394247f45b0b60e575d02398b9b6810e7a29a823.png","markers-plain.png":"markers-plain-cf233423aa44e75ac0031e77b8ba571cd3331010517e1197e63fb7b06856c1ff.png","leaflet/dist/images/marker-icon-2x.png":"leaflet/dist/images/marker-icon-2x-2d77a2e4c2f08bbac41808324ef946b9a2fe61b6150480d011b72b379c3b238d.png","leaflet/dist/images/marker-shadow.png":"leaflet/dist/images/marker-shadow-264f5c640339f042dd729062cfc04c17f8ea0f29882b538e3848ed8f10edb4da.png","jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-ae65a7ae22c4c23115948fdeb5c05c9137dbd13ca2d426b3c4c3c4183451e410.png","tinymce/langs/ar.js":"tinymce/langs/ar-e47a394dbc461d20aa547fa0c2027a9dad45fe55e18adb0da309045be6ed4109.js","tinymce/langs/ar_SA.js":"tinymce/langs/ar_SA-24b62c76e99e114ae44480a67edbacf74f9fed0ff7afbeacce4966f1bc80333b.js","tinymce/langs/az.js":"tinymce/langs/az-d40cecd6eb423f910f528ae98dcdaba4c2449802621759437174cf8c8c0d5b25.js","tinymce/langs/be.js":"tinymce/langs/be-42e2884c0f2394afa1a17e31e702660eeea0d84618bbd18155cb0313c6eb5f69.js","tinymce/langs/bg_BG.js":"tinymce/langs/bg_BG-2fac9d785519d2791d42881fcc08c6a82e841575785690259d7f64e1b88d7db3.js","tinymce/langs/bn_BD.js":"tinymce/langs/bn_BD-ef48a9094445dfa624af0c35902f60b7949b30585b5e9bc760a225fe2c07cbd3.js","tinymce/langs/bs.js":"tinymce/langs/bs-eb66c6d6910a30b950d7a0e784027ed288e6e5a2c6db7741da3359f2067e2e0e.js","tinymce/langs/ca.js":"tinymce/langs/ca-77ab49d6420318ed7f5fd51b6856bc396c393095bd78ea91dad83e38e5859637.js","tinymce/langs/cs.js":"tinymce/langs/cs-3d7ecd619895e3e4c7e1db06f6526682ef88f22f6e8b50d7b45ed0ae7c206714.js","tinymce/langs/cs_CZ.js":"tinymce/langs/cs_CZ-4b0778d233e200dea350f8361129da2844e23d1c0f2d524aeffa6d34e581368d.js","tinymce/langs/cy.js":"tinymce/langs/cy-a847ff54657ccf76eec362cc14fbc63adb4c67f9b1de023b29d817aba4fec062.js","tinymce/langs/da.js":"tinymce/langs/da-a87f3ae1c442c3bb26b81569687e98072d038269360361ec9728f00d6b17c282.js","tinymce/langs/de.js":"tinymce/langs/de-a10c8f6f1e53da776e7026dffd54ea8ba527492b767e5b54ae5c3974f6953311.js","tinymce/langs/de_AT.js":"tinymce/langs/de_AT-a32eec12ce12b06fc2c8919d2372242e9596712c96dc9bcfff1fc8b7dc458627.js","tinymce/langs/dv.js":"tinymce/langs/dv-182756bf33409a8b76bc684d0a2ab86881718c360d1f1fb3fbc609ce3f5e3f49.js","tinymce/langs/el.js":"tinymce/langs/el-6bbdbf3ccb2b2f22f961eb6749b43fe401c84fd6d89cd3f76a538dc2d06bb071.js","tinymce/langs/en_CA.js":"tinymce/langs/en_CA-1a9457da814b0a1f15687a00f3ae4b38da0301445b52c29a423a38c943d9a431.js","tinymce/langs/en_GB.js":"tinymce/langs/en_GB-a0f7752ff9ddf3ed3d2cd24fee04fe585bca0babc4ce655560c923ad386c0c07.js","tinymce/langs/eo.js":"tinymce/langs/eo-cbac4d7ebcb0679845b852d9354e74586e78cf13eef82de1400cf6b465e203cd.js","tinymce/langs/es.js":"tinymce/langs/es-133cb5bd627c2a299544586bf365859b5a1c96c57d18c90e7853048434a809b6.js","tinymce/langs/es_MX.js":"tinymce/langs/es_MX-352fcdff567919ff09a2e19c56d8059d339bffdbd999bcc82aa6d8340c19bbb9.js","tinymce/langs/et.js":"tinymce/langs/et-2cfc3da0ff39a37f0bd3c896d49604028f231ff0e7d8ebbc30dbfd4b87125f06.js","tinymce/langs/eu.js":"tinymce/langs/eu-8698ae4de236fcd490d0f45d485dbd33d8e9de6eb3db51191e1b4f8ea96a4d06.js","tinymce/langs/fa.js":"tinymce/langs/fa-7eff96595e93d4b0df484dd90c14b7b412966157ed8293f54429e9418882bdb2.js","tinymce/langs/fa_IR.js":"tinymce/langs/fa_IR-2f9d33f16718ae9c1f3642905b58434ed2662fb66448c4d115b8491aa68e7904.js","tinymce/langs/fi.js":"tinymce/langs/fi-6ca2a93d045067a86e8ea973d0b89368054b15eb9b9625bf1ca871608a5cb77c.js","tinymce/langs/fo.js":"tinymce/langs/fo-340609cecd5571e4eacb8fe7bd1343c8553d96d12610fb77d9a812dc6d3635fd.js","tinymce/langs/fr_CH.js":"tinymce/langs/fr_CH-e0f43c0f20727368ff0767f3bf099bc23eed9fe3e81f8bbe514381e786526928.js","tinymce/langs/fr_FR.js":"tinymce/langs/fr_FR-2702de7be93bd1e0d7120ae3c9e637061565186c66886f155ffca0663df25b4c.js","tinymce/langs/ga.js":"tinymce/langs/ga-d2a3de6f28723d75b03f7f42fd3aedfd045d473425ee38f02350b56035383af1.js","tinymce/langs/gd.js":"tinymce/langs/gd-0453e8b97bf3b6cca4065712ec59f20343ad6131735b38547e865177a1c1c490.js","tinymce/langs/gl.js":"tinymce/langs/gl-1ff612222934f558870111f10934110c5656df3bb293c917e4eeceeb6605fcc5.js","tinymce/langs/he_IL.js":"tinymce/langs/he_IL-981f5250a4b8d404b37040ca5a35c30498cbeeb36e298d81bf1592b43fff7656.js","tinymce/langs/hi_IN.js":"tinymce/langs/hi_IN-695e0cdc22974fe45e0f35289f0249ddab87245165c9df765ec1b885ec55f0be.js","tinymce/langs/hr.js":"tinymce/langs/hr-f77f1da2736d13f9a9a86ebf596f592fcc748f2975a0b9904b512d630f2c1a17.js","tinymce/langs/hu_HU.js":"tinymce/langs/hu_HU-1e22021a4f9c61919aa024041af555eac277bfc08ccb8c07fd329b87090a15e5.js","tinymce/langs/hy.js":"tinymce/langs/hy-0d384f3f82cd76793d3e7428a2140ea97f40a943f25ef99a2e3709a3e02b0930.js","tinymce/langs/id.js":"tinymce/langs/id-e9fd018be745b5f14f4af47887420f98c590c607e01d57aca77ef5affe188523.js","tinymce/langs/is_IS.js":"tinymce/langs/is_IS-c6e8c3e7b0e6b447faec3d8d258928f97c84558b29882c056513fb71cf237bfa.js","tinymce/langs/it.js":"tinymce/langs/it-25b5546d48c80ad666b600e5be3a05718b80645721b191785c1fafe1853f4a46.js","tinymce/langs/ja.js":"tinymce/langs/ja-80f0e7414030c32617ff651da1affa0bc85ee514fc9bc81f46edfd8ce0053ac0.js","tinymce/langs/ka_GE.js":"tinymce/langs/ka_GE-3c6b82346a7070a8b6a15ae6e8faeecc5bfe63ad7e616b7de2e8ab8a75ec39c2.js","tinymce/langs/kab.js":"tinymce/langs/kab-3651d08aacd5bda15a04698f202bf616efbf13d3789aadd9ce4f93e430818c13.js","tinymce/langs/kk.js":"tinymce/langs/kk-0c1ba792ed9445c6512f310228f64d1cde7b5a98e0b212cca749dcb2d728fe86.js","tinymce/langs/km_KH.js":"tinymce/langs/km_KH-8bec84e4078db8c2a680260c073dfb486c85b61df62e14ca330d66d2ca2a85b5.js","tinymce/langs/ko.js":"tinymce/langs/ko-ca535bfa388701fb020d24bdfb3f1e3aab127005b54e943cb1bd60b723c8194d.js","tinymce/langs/ko_KR.js":"tinymce/langs/ko_KR-daa3ae950d70260bb0901a5349034952247905523bbc2bcbe527701b6aad8e28.js","tinymce/langs/ku.js":"tinymce/langs/ku-95e2ffe4f0112df658f10327c26f2cdddedc2e2ed769767366ae22a465c14725.js","tinymce/langs/ku_IQ.js":"tinymce/langs/ku_IQ-a212e8d41695989e56834facf72474e1934ef166c3fcaf7e255ef573a3c6e76c.js","tinymce/langs/lb.js":"tinymce/langs/lb-94992279091f1a0be927d5d858d3724037d8d81ee6b63cc9ddde84af6124cc04.js","tinymce/langs/lt.js":"tinymce/langs/lt-ae7cefbe2cb5420770b31eabf92605728135ab5d6a2d2cfca2d19809be67e6a8.js","tinymce/langs/lv.js":"tinymce/langs/lv-e468ed0c78466d1fff9f4957645606d8aa683cb5dc35931e047df97b8e4f5433.js","tinymce/langs/mk_MK.js":"tinymce/langs/mk_MK-55aadb5d7c82c940cfcf42f24423ef0471294c9b02994a6b22e1b4173baa7ec6.js","tinymce/langs/ml.js":"tinymce/langs/ml-685de0808683c02274dcbe9f8de023a4d72a49b040e7526a99e3d5c786ff71ae.js","tinymce/langs/ml_IN.js":"tinymce/langs/ml_IN-1ab433621d6257c7632718048bacc5ed98a302d33cf0438bbbb4200914e01aac.js","tinymce/langs/mn_MN.js":"tinymce/langs/mn_MN-b89f88cb9b0dd7c879e27532b2979c421c1e69648f65a4108a56060f1e1cb009.js","tinymce/langs/nb_NO.js":"tinymce/langs/nb_NO-602ee249e98a26ae24c1ee1311090c68a782050086a835f1e7bd46ebfe7879ef.js","tinymce/langs/nl.js":"tinymce/langs/nl-9c77e9404a27fd7e4bd162ad44538b72d2725b7fee7be7ca3ff801cf217c4968.js","tinymce/langs/pl.js":"tinymce/langs/pl-5cdd1586ec8fa67293f2175cd92edbd0392c4c77b24ed64cfdceccba8d99f152.js","tinymce/langs/pt_BR.js":"tinymce/langs/pt_BR-e3955318582d58bd241a62c3a81afe74e0ae7f31bdc92a562b75243701f114df.js","tinymce/langs/pt_PT.js":"tinymce/langs/pt_PT-1101d080ecd5da091c7ef70b23200adbd5136c5c32f0c79dae665a443d76c35d.js","tinymce/langs/ro.js":"tinymce/langs/ro-484799d182031efab087d749b024014fd06ed06c1e7712b8bf87f3a4a965c2e4.js","tinymce/langs/ru.js":"tinymce/langs/ru-bdd59cb662a7b4d61e770b07014d1791051312c87513ecc1891e80beba617171.js","tinymce/langs/ru_RU.js":"tinymce/langs/ru_RU-9f18ef14f3493cc586cc0b4827fd9e1c2ed3d5790ce536d94f87e2d6aac2a688.js","tinymce/langs/si_LK.js":"tinymce/langs/si_LK-5bfefe9b2fe82574d8ed839df18fd8ff65f1e1cd458b0a843cf1aadd1be704ea.js","tinymce/langs/sk.js":"tinymce/langs/sk-412fa7f982ad2733341203daa035c8ba10035262ca8f5f65e0a41507512209bd.js","tinymce/langs/sl_SI.js":"tinymce/langs/sl_SI-2bea4f3854a992ea840808019dc99467dc173b12454ea6016135234a741671d8.js","tinymce/langs/sr.js":"tinymce/langs/sr-e0b97453a0c1000b19f7ce37fcf86bcacbf9125d81076f60a77686820c7925c6.js","tinymce/langs/sv_SE.js":"tinymce/langs/sv_SE-fa561a7e49fdb42d5913337176fed6bc8a9997eb3ca8f20ecd9520d5391e17be.js","tinymce/langs/ta.js":"tinymce/langs/ta-0fd0e62250fc1a3626ac2111c5adb4194a6a898888bb224414f6dc8adf53d385.js","tinymce/langs/ta_IN.js":"tinymce/langs/ta_IN-32303f65d2378e8202b17b0920b79277a2580872e3a6bd9409aeceef90867dd0.js","tinymce/langs/tg.js":"tinymce/langs/tg-1618248bf0aeda614a37ced9fd28b6623ae24f8453368bfb8c483ce820a3cb34.js","tinymce/langs/th_TH.js":"tinymce/langs/th_TH-5279a379afc886c2a31e22aba9d7ee7a8e3edf4c0785f39aaa20ccd03d46b19a.js","tinymce/langs/tr.js":"tinymce/langs/tr-3765d4a8923ef22864747d9c825c3e0af401e1356e75a5458bed837d486b7673.js","tinymce/langs/tr_TR.js":"tinymce/langs/tr_TR-5c93f80b89e5dd2eb6972f37bf50b76d7705c61f28120b836704a91fa5c14399.js","tinymce/langs/tt.js":"tinymce/langs/tt-22e302672df0a77de14688f58dbedf82de7a26e9089c9535a2a3cd1c0ccd7903.js","tinymce/langs/ug.js":"tinymce/langs/ug-50232038bf7262c90be4f2919c74ff93792cdb82e6064d0f5c86f885b93271c5.js","tinymce/langs/uk.js":"tinymce/langs/uk-f6d7911714c422b178c0249df323cf7ec415a83195d751c7e4024590b1738c42.js","tinymce/langs/uk_UA.js":"tinymce/langs/uk_UA-bd8cd7ca66228d85f8a4cadb651c49981f26e007fa2a952856c8c3d3c1baa66a.js","tinymce/langs/vi.js":"tinymce/langs/vi-6aa451047e4df911c92e10178e6a70147534e438c64df7a88eee37b4a440726e.js","tinymce/langs/vi_VN.js":"tinymce/langs/vi_VN-aea52c2e9397f8a657d54d50a42b3c5be0ca79480555a4fa1e0f5d785c5f6561.js","tinymce/langs/zh_CN.js":"tinymce/langs/zh_CN-8622ec46e2980b6f5baf3b745c6b0187dd2a54ddecbbf69a21f0b3e72f84f6dc.js","tinymce/langs/zh_TW.js":"tinymce/langs/zh_TW-90723da3b889f2a4477d4aaf00ca3e75439998269b36b359ea4caa37e1defb4a.js","tinymce/preinit.js":"tinymce/preinit-4eb7f4ac58f2f450d20185cf83ca1d8550d2a1419141bfe70eb5a2c4afe67349.js","tinymce/tinymce.js":"tinymce/tinymce-ea002509455c2d4e12e195ec050ff03ce90bbe0bdf22bb0d4180bba730c2bcc6.js","tinymce/jquery.tinymce.js":"tinymce/jquery.tinymce-c4e34b289f498e7a8e4ff16c48b895310113eae7c296ac5f17680704bc3a0032.js","tinymce/langs/readme.md":"tinymce/langs/readme-5a8b6a04d57b5c88e3fb7f2a870b8e2d3a48ec03ce6474206c41df78c155b2de.md","tinymce/license.txt":"tinymce/license-47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66.txt","tinymce/plugins/advlist/plugin.js":"tinymce/plugins/advlist/plugin-8298c4226e435f9350b2bfedab63fec1a9a153277a48930406bd9446ca3d9206.js","tinymce/plugins/anchor/plugin.js":"tinymce/plugins/anchor/plugin-910353b28da9ffa1075fd37b1c95f1f05f0d6809e41a5e4250b33e1a3a7a86c8.js","tinymce/plugins/autolink/plugin.js":"tinymce/plugins/autolink/plugin-ee2bb5e9c684882fb0db4d350f0c7feab2643841f2b8729db0f9111043c70d39.js","tinymce/plugins/autoresize/plugin.js":"tinymce/plugins/autoresize/plugin-2e0a2856650e8fa09fba9a00fd18a9078e5ee436c6c47ead6ba6689fee74cafa.js","tinymce/plugins/autosave/plugin.js":"tinymce/plugins/autosave/plugin-54b4451f49d642d08cbec840341ac6edb501b69d2383115c62bc7070eb0a57f4.js","tinymce/plugins/bbcode/plugin.js":"tinymce/plugins/bbcode/plugin-3e2fdc6fa5b587ce568ca570974d0e910b6684e392a9ecaba02b5c6c15269080.js","tinymce/plugins/charmap/plugin.js":"tinymce/plugins/charmap/plugin-49d7ef5688ed83d2a102b0c9702dc3aac70a33c22a7ef4885d6528a61b8210e2.js","tinymce/plugins/code/plugin.js":"tinymce/plugins/code/plugin-2c12bcd21813fa52b23a65c3080cc6f4ecb33be04ee058b6c460719724511372.js","tinymce/plugins/codesample/css/prism.css":"tinymce/plugins/codesample/css/prism-1988b66704b4d23e78c6c20c38a6856cbc1f0be96d6d60a3a0b12f4408f1057e.css","tinymce/plugins/codesample/plugin.js":"tinymce/plugins/codesample/plugin-a3591d2c33d0499eed106bbdc9d0aa698115456632cb806e8f44bdf270d8d6b8.js","tinymce/plugins/colorpicker/plugin.js":"tinymce/plugins/colorpicker/plugin-f4ea1ac5bfaaef5adef0789427a1ef1e3c07814ff9a7623953bfb1a79f9f502d.js","tinymce/plugins/contextmenu/plugin.js":"tinymce/plugins/contextmenu/plugin-36bf2806ad2d3ead1a04e45b840bd6cea455f38ca02d88f973302219e05734ab.js","tinymce/plugins/directionality/plugin.js":"tinymce/plugins/directionality/plugin-8b9d9e0d97d8cf5c20b4f74509a94cbd84c59b330d7badaad66ff2d0553479fd.js","tinymce/plugins/emoticons/img/smiley-cool.gif":"tinymce/plugins/emoticons/img/smiley-cool-bb0e93a050a32df7913e4026b3c88a176998e0e3e073ba06e9b73f6c24227c9c.gif","tinymce/plugins/emoticons/img/smiley-cry.gif":"tinymce/plugins/emoticons/img/smiley-cry-a0c5f3e7a682449c973c9d9f7c46342081c46920686d2353f57aff91ab907f68.gif","tinymce/plugins/emoticons/img/smiley-embarassed.gif":"tinymce/plugins/emoticons/img/smiley-embarassed-d3cafcb50b335672cb5e9f4600ea9ea261dac7828dd28844d4927c393a25618f.gif","tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif":"tinymce/plugins/emoticons/img/smiley-foot-in-mouth-03fe04d3ed533423ac81f05146584b0c451be3d4a30e76687ceef283ed07071f.gif","tinymce/plugins/emoticons/img/smiley-frown.gif":"tinymce/plugins/emoticons/img/smiley-frown-1b984bf98931dd1debb54461eb9d83e985f2b2999fe14bcb556d6c0921bc83b0.gif","tinymce/plugins/emoticons/img/smiley-innocent.gif":"tinymce/plugins/emoticons/img/smiley-innocent-8db353ef102196f2c6ddf5c4666446de955d7b14fc0957c806c9dbfb48fb0c29.gif","tinymce/plugins/emoticons/img/smiley-kiss.gif":"tinymce/plugins/emoticons/img/smiley-kiss-3154c3665356c13ab10fefdbac1fe187fff978a0052037c99cdc4a97103413f2.gif","tinymce/plugins/emoticons/img/smiley-laughing.gif":"tinymce/plugins/emoticons/img/smiley-laughing-8f6adedcd091975ffead171867a6304d908bb6541a6ccb4919286ec6b7d4551e.gif","tinymce/plugins/emoticons/img/smiley-money-mouth.gif":"tinymce/plugins/emoticons/img/smiley-money-mouth-f0b9f4f22e237f5dbc851f900fed8d7eca4c954ae6fbc606c0cd8be431d0ac80.gif","tinymce/plugins/emoticons/img/smiley-sealed.gif":"tinymce/plugins/emoticons/img/smiley-sealed-9933b442636b6e537df7b564e2c3f7a2873526eea6b022a98eb1e468e5204c32.gif","tinymce/plugins/emoticons/img/smiley-smile.gif":"tinymce/plugins/emoticons/img/smiley-smile-fd89cd460ffcacb7e725e00c0275ef5b3924ce468248e5ff4fb43545571cfa65.gif","tinymce/plugins/emoticons/img/smiley-surprised.gif":"tinymce/plugins/emoticons/img/smiley-surprised-3871f356cb41976d7ae8a5f005e8739e4d014352a8adef9b33f773d81b6e6c01.gif","tinymce/plugins/emoticons/img/smiley-tongue-out.gif":"tinymce/plugins/emoticons/img/smiley-tongue-out-5843c85667a8226dc43be83749fd9fbbc5d20b1577de2b763915d99815d37d47.gif","tinymce/plugins/emoticons/img/smiley-undecided.gif":"tinymce/plugins/emoticons/img/smiley-undecided-d8b9bcbb433951ff3c4ca8dd959ac3844239b98e6d52218833e1485a91f67347.gif","tinymce/plugins/emoticons/img/smiley-wink.gif":"tinymce/plugins/emoticons/img/smiley-wink-2af75ad7b1c08488505513503e34b15f40005e04a2a9568f698f0945d2d8ba1f.gif","tinymce/plugins/emoticons/img/smiley-yell.gif":"tinymce/plugins/emoticons/img/smiley-yell-bba903fbcb46fce8c68b9e01863fd095b3b1d0e6aa72161f3a88d762a5f90a79.gif","tinymce/plugins/emoticons/plugin.js":"tinymce/plugins/emoticons/plugin-4e4ed709e1a04969c1d82745d84b01eb7fdd36a19a3529452c81cc2ed4e6b58d.js","tinymce/plugins/fullpage/plugin.js":"tinymce/plugins/fullpage/plugin-2184bd5db93788e2ead614801f7f96ed7aea38a25dd6f5f94a836807da12f4b7.js","tinymce/plugins/fullscreen/plugin.js":"tinymce/plugins/fullscreen/plugin-58355e469e27d887f7c5cedc4ab9c33268605171d0a6ef7539d7889bd6c22e95.js","tinymce/plugins/help/img/logo.png":"tinymce/plugins/help/img/logo-8b03dc4f83c4fea0b62c4f9866898c98e81057c55b3e3b8c1da3f5fdbf0086e9.png","tinymce/plugins/help/plugin.js":"tinymce/plugins/help/plugin-fe41ec41705f0ab8974189c7a262bd6abfca631da91bec80cca08557d933400e.js","tinymce/plugins/hr/plugin.js":"tinymce/plugins/hr/plugin-7e54a59e7cc42e5dbcb208c5e1e171bfa1e07a12a4f2bc29eb924e3b56b2137e.js","tinymce/plugins/image/plugin.js":"tinymce/plugins/image/plugin-9c58ff73baa30b22932a2940f6499720916ff0667664c0fd1879facb30c7e15e.js","tinymce/plugins/imagetools/plugin.js":"tinymce/plugins/imagetools/plugin-cde4e862daaa1072a4a548d462ecd155e4c5798ea673bdab3ba4bf6193123257.js","tinymce/plugins/importcss/plugin.js":"tinymce/plugins/importcss/plugin-c9f390348b03c3c6311b5babcb935a60ba6fb23cf30013749dd3cda157b784b9.js","tinymce/plugins/insertdatetime/plugin.js":"tinymce/plugins/insertdatetime/plugin-918c81e56c28ac5ecf1a7cf1441532a94637da84ae8119d69f5628a42dc1a70a.js","tinymce/plugins/legacyoutput/plugin.js":"tinymce/plugins/legacyoutput/plugin-367fc211a27027020d9cab6dec42bf1a86f428a507bb47530386439a9d581bd7.js","tinymce/plugins/link/plugin.js":"tinymce/plugins/link/plugin-188203a47fcc2b8092733c0999105e52aa76af1fc7fa86d82791feee615105e5.js","tinymce/plugins/lists/plugin.js":"tinymce/plugins/lists/plugin-570f4ed934292f815ba8a8ab0309e44abd776120f629c35a9e6d19d8fb2f7890.js","tinymce/plugins/media/plugin.js":"tinymce/plugins/media/plugin-5b4758de69f15a33a07cc4cddd1a896c9de832cdd120b901a7188e57f31cb570.js","tinymce/plugins/nonbreaking/plugin.js":"tinymce/plugins/nonbreaking/plugin-911e6f2517df4ca758f67e28dadebaf921d1b7bb120b23ee2779dce0cf7bb842.js","tinymce/plugins/noneditable/plugin.js":"tinymce/plugins/noneditable/plugin-99b4ff9b08ba148764914357b4c626cf07ce5dae739ec678d43fd6f6c6461bc0.js","tinymce/plugins/pagebreak/plugin.js":"tinymce/plugins/pagebreak/plugin-ba3703ad8ce5ff341f209e6fa1ab0afdb66d66365dde2f322338d9382f8cabcb.js","tinymce/plugins/paste/plugin.js":"tinymce/plugins/paste/plugin-e32879a5ac81dedf097e5a06653c4740fc4fab4766589bab761312d0b2d560c9.js","tinymce/plugins/preview/plugin.js":"tinymce/plugins/preview/plugin-326a8321cd75624f9b746e4efcd8e6f1d5e4d0b2d96155e3b8c8345ec70a95aa.js","tinymce/plugins/print/plugin.js":"tinymce/plugins/print/plugin-360588108f9b3c4d49e62b084a288f7b789d4555ff53eaedd793b7880d5b0799.js","tinymce/plugins/save/plugin.js":"tinymce/plugins/save/plugin-18a4bdbbb2894ce2f3badb7a901ce2b21f18c9cbe54c1c346245ea3092f1d230.js","tinymce/plugins/searchreplace/plugin.js":"tinymce/plugins/searchreplace/plugin-cf1237ef21f140faadb3977c326cca488796cae1bafc26f201ab78dd6a498752.js","tinymce/plugins/spellchecker/plugin.js":"tinymce/plugins/spellchecker/plugin-c4b0e6c01647313b0beda3037aff99d35fd3c10e74afd56329210239cee26a53.js","tinymce/plugins/tabfocus/plugin.js":"tinymce/plugins/tabfocus/plugin-c004f18acdee65bc533bf582e05017cb72a1c78e235e6a6301d7f8cb218f059e.js","tinymce/plugins/table/plugin.js":"tinymce/plugins/table/plugin-dbea734fa37f0c2143ea225ff48c358261941b6cf347292de89f6d503a16cd27.js","tinymce/plugins/template/plugin.js":"tinymce/plugins/template/plugin-9d2e073f0fa6d0e2c9433260db997138945ea2c73402420a8b12dbba432c5726.js","tinymce/plugins/textcolor/plugin.js":"tinymce/plugins/textcolor/plugin-7f993a50c7d5ca5af4a2117aecbafa820fc5c669bae6916509bc392b21ec10d7.js","tinymce/plugins/textpattern/plugin.js":"tinymce/plugins/textpattern/plugin-3abf3b59885a2b30139e25377c6ebf369e77178752ded63a8ae3a04bba7dabeb.js","tinymce/plugins/toc/plugin.js":"tinymce/plugins/toc/plugin-24e4d24233ae96b5d80a1add45fed792c0be45c2ffb266957112465cd45ed0b7.js","tinymce/plugins/visualblocks/css/visualblocks.css":"tinymce/plugins/visualblocks/css/visualblocks-859e261c1d940c90994673ce593b60946710cc4f71371164db4ea695035ea593.css","tinymce/plugins/visualblocks/plugin.js":"tinymce/plugins/visualblocks/plugin-d65e950bb619d5c52a4fb236da31bb0ecc492e7477e7b0841a2ac06b6faeea26.js","tinymce/plugins/visualchars/plugin.js":"tinymce/plugins/visualchars/plugin-d56ff99b2792abbb690ebafe6d70e6c4487a7f5cf2788cb1f3fa4ea62d8b70a2.js","tinymce/plugins/wordcount/plugin.js":"tinymce/plugins/wordcount/plugin-15f7440d901e81ffa69553b6cb42b1c9ed94c8d9a2417bbe47802539d152bdbc.js","tinymce/skins/lightgray/content.inline.min.css":"tinymce/skins/lightgray/content.inline.min-244f66927d819115fc6403d3562ac16d18884dcd2ca4766e464a03ec6f223adf.css","tinymce/skins/lightgray/content.min.css":"tinymce/skins/lightgray/content.min-c59b96ac316de5e14c27896f4ffdfb27da41502112b8a9c5ea0851a25a742e4e.css","tinymce/skins/lightgray/fonts/tinymce-small.eot":"tinymce/skins/lightgray/fonts/tinymce-small-a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9.eot","tinymce/skins/lightgray/fonts/tinymce-small.svg":"tinymce/skins/lightgray/fonts/tinymce-small-e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee.svg","tinymce/skins/lightgray/fonts/tinymce-small.ttf":"tinymce/skins/lightgray/fonts/tinymce-small-2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09.ttf","tinymce/skins/lightgray/fonts/tinymce-small.woff":"tinymce/skins/lightgray/fonts/tinymce-small-d3efbb678ca6de5632902bd93772746ba2f8e4e2322b953936e12694a183aa31.woff","tinymce/skins/lightgray/fonts/tinymce.eot":"tinymce/skins/lightgray/fonts/tinymce-2e9c4a68fde992476e0db9e44128cb1f2e898f0de0b80f552a8acb52bb7ca0db.eot","tinymce/skins/lightgray/fonts/tinymce.svg":"tinymce/skins/lightgray/fonts/tinymce-2094ddadc265c7f33570475fc78ef7adcdcb814e49060d17f5b4c4f8d1cb7ec6.svg","tinymce/skins/lightgray/fonts/tinymce.ttf":"tinymce/skins/lightgray/fonts/tinymce-477ea2d46c1a975dd492af4c10235fabfd09069595779cce00ea0381ca9b4a20.ttf","tinymce/skins/lightgray/fonts/tinymce.woff":"tinymce/skins/lightgray/fonts/tinymce-1ebc636bb24cbea637946ba8c22cbf4f35d8343ba9763045d2aee59e3714ae78.woff","tinymce/skins/lightgray/img/anchor.gif":"tinymce/skins/lightgray/img/anchor-2861666fd107d278d4449970615136d06d7f746be9bb19072cf9c8f30e565e1e.gif","tinymce/skins/lightgray/img/loader.gif":"tinymce/skins/lightgray/img/loader-eb7cfd3d959b2e09c170f532e29f8b825f9bc770b2279fde58e595617753e244.gif","tinymce/skins/lightgray/img/object.gif":"tinymce/skins/lightgray/img/object-e6a15e52bc4a17b085073ba8debd4708ead6ae3d4cbeb3880c65cb7afc489777.gif","tinymce/skins/lightgray/img/trans.gif":"tinymce/skins/lightgray/img/trans-9cf020d7c3bba7f5ab10cda54aabef934f906d4f9a3acf99e9e7dc6c98579635.gif","tinymce/skins/lightgray/skin.min.css":"tinymce/skins/lightgray/skin.min-b12163641969e8e7775e00e73f8691e2892c35bf53d399deb4399832950c8acf.css","tinymce/themes/inlite/theme.js":"tinymce/themes/inlite/theme-705c8874883e10384f2f0f31576331734af05e4871ea70c8b54c09acf68b562a.js","tinymce/themes/modern/theme.js":"tinymce/themes/modern/theme-acb8d1f30de151cc3b7f6b5131ed0e7e45abfd745256260b2d57b3594c97c685.js"}}
\ No newline at end of file
+{"files":{"active_admin-d4f38d29ff0b2b9b05ed4ecbcebd736e750ad4b29369bc58d35194f7e107eaae.css":{"logical_path":"active_admin.css","mtime":"2017-12-25T19:51:44+01:00","size":80636,"digest":"d4f38d29ff0b2b9b05ed4ecbcebd736e750ad4b29369bc58d35194f7e107eaae","integrity":"sha256-1PONKf8LK5sF7U7Lzr1zbnUK1LKTabxY01GU9+EH6q4="},"active_admin/nested_menu_arrow-15084d93c65c1964d7077700ea748bd2d70cfa2d4c19707c58a9c64e232dd442.gif":{"logical_path":"active_admin/nested_menu_arrow.gif","mtime":"2017-12-25T19:51:44+01:00","size":70,"digest":"15084d93c65c1964d7077700ea748bd2d70cfa2d4c19707c58a9c64e232dd442","integrity":"sha256-FQhNk8ZcGWTXB3cA6nSL0tcM+i1MGXB8WKnGTiMt1EI="},"active_admin/nested_menu_arrow_dark-7c43b8e0a5f8823875f49a093c9d7a6b374f885b6f9cc248ae9cd7e6e9b29034.gif":{"logical_path":"active_admin/nested_menu_arrow_dark.gif","mtime":"2017-12-25T19:51:44+01:00","size":70,"digest":"7c43b8e0a5f8823875f49a093c9d7a6b374f885b6f9cc248ae9cd7e6e9b29034","integrity":"sha256-fEO44KX4gjh19JoJPJ16azdPiFtvnMJIrpzX5umykDQ="},"active_admin/orderable-29374dbb55b0012d78a37c614d573bb3474f0779849b478a147d0f1845ca6617.png":{"logical_path":"active_admin/orderable.png","mtime":"2017-12-25T19:51:44+01:00","size":220,"digest":"29374dbb55b0012d78a37c614d573bb3474f0779849b478a147d0f1845ca6617","integrity":"sha256-KTdNu1WwAS14o3xhTVc7s0dPB3mEm0eKFH0PGEXKZhc="},"active_admin/print-cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6.css":{"logical_path":"active_admin/print.css","mtime":"2017-12-25T19:51:44+01:00","size":7086,"digest":"cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6","integrity":"sha256-z5nL8n+5IGWp6s0o5vrUj6csra9uCRh5Do01sR2PmfY="},"active_admin-115a9ff718613239e12adb1f3bf498a1ccba1735051b69a5d1fbee5e495ff489.js":{"logical_path":"active_admin.js","mtime":"2017-12-30T15:54:26+01:00","size":961412,"digest":"115a9ff718613239e12adb1f3bf498a1ccba1735051b69a5d1fbee5e495ff489","integrity":"sha256-EVqf9xhhMjnhKtsfO/SYocy6FzUFG2ml0fvuXklf9Ik="},"tinymce-d01e33fd7bee04ec85526d769634c548ffc9d13584e1e3ecb754f48c8a3a0662.js":{"logical_path":"tinymce.js","mtime":"2017-10-07T18:51:24+02:00","size":1055,"digest":"d01e33fd7bee04ec85526d769634c548ffc9d13584e1e3ecb754f48c8a3a0662","integrity":"sha256-0B4z/XvuBOyFUm12ljTFSP/J0TWE4ePst1T0jIo6BmI="},"application-ba1c3eda80784b6eec3860ce601adf04370c8c8b17855bd3438a42dc8a69cfa2.css":{"logical_path":"application.css","mtime":"2017-10-07T18:51:24+02:00","size":229915,"digest":"ba1c3eda80784b6eec3860ce601adf04370c8c8b17855bd3438a42dc8a69cfa2","integrity":"sha256-uhw+2oB4S27sOGDOYBrfBDcMjIsXhVvTQ4pC3Ippz6I="},"jquery-ui/ui-icons_444444_256x240-31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d.png":{"logical_path":"jquery-ui/ui-icons_444444_256x240.png","mtime":"2017-10-08T14:45:44+02:00","size":3756,"digest":"31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d","integrity":"sha256-MdmIdltOb1ZVPClYjFADgdw+bwqimAyCEiAuVkSu/V0="},"jquery-ui/ui-icons_555555_256x240-32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5.png":{"logical_path":"jquery-ui/ui-icons_555555_256x240.png","mtime":"2017-10-08T14:45:44+02:00","size":3756,"digest":"32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5","integrity":"sha256-MhdSYdrudsgrsO3w7qFqVkIYZvvDHpTzwdVwqhFFAvU="},"jquery-ui/ui-icons_ffffff_256x240-350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a.png":{"logical_path":"jquery-ui/ui-icons_ffffff_256x240.png","mtime":"2017-10-08T14:45:44+02:00","size":3756,"digest":"350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a","integrity":"sha256-NQ3xtxMQN94g6DxcDzpBp3DSrEi1di6ncrP0qKe51Ho="},"jquery-ui/ui-icons_777620_256x240-0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b.png":{"logical_path":"jquery-ui/ui-icons_777620_256x240.png","mtime":"2017-10-08T14:45:44+02:00","size":3756,"digest":"0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b","integrity":"sha256-CwIPxuaW2I0pbnux9h8esq2CeEjixzgqTD4JmecC3Zs="},"jquery-ui/ui-icons_cc0000_256x240-40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69.png":{"logical_path":"jquery-ui/ui-icons_cc0000_256x240.png","mtime":"2017-10-08T14:45:44+02:00","size":3756,"digest":"40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69","integrity":"sha256-QJhaZLTV3SE/uif82GKhvRszepdnT2/wuewgq87kvGk="},"jquery-ui/ui-icons_777777_256x240-faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f.png":{"logical_path":"jquery-ui/ui-icons_777777_256x240.png","mtime":"2017-10-08T14:45:44+02:00","size":3756,"digest":"faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f","integrity":"sha256-+vMgB64SDDAiE1V2JuZg3RDnEcXdTxET018m3AW3jS8="},"flags/4x3/ad-3fc30cc000942b4f3369bdf6ccb85b16f59f4e78f9c53d73252ab529da35ba0a.svg":{"logical_path":"flags/4x3/ad.svg","mtime":"2017-10-08T14:45:34+02:00","size":56452,"digest":"3fc30cc000942b4f3369bdf6ccb85b16f59f4e78f9c53d73252ab529da35ba0a","integrity":"sha256-P8MMwACUK08zab32zLhbFvWfTnj5xT1zJSq1Kdo1ugo="},"flags/1x1/ad-db2c38d603b8eecc9085d6ac1261bbefd3bcd852d44bec476e5e115914bcb2fd.svg":{"logical_path":"flags/1x1/ad.svg","mtime":"2017-10-08T14:45:34+02:00","size":55630,"digest":"db2c38d603b8eecc9085d6ac1261bbefd3bcd852d44bec476e5e115914bcb2fd","integrity":"sha256-2yw41gO47syQhdasEmG779O82FLUS+xHbl4RWRS8sv0="},"flags/4x3/ae-7f41692ef179841ca6e9cae42c704113274707228ff3d2b1ee5169916db15b1e.svg":{"logical_path":"flags/4x3/ae.svg","mtime":"2017-10-08T14:45:34+02:00","size":257,"digest":"7f41692ef179841ca6e9cae42c704113274707228ff3d2b1ee5169916db15b1e","integrity":"sha256-f0FpLvF5hBym6crkLHBBEydHByKP89Kx7lFpkW2xWx4="},"flags/1x1/ae-8c9b9b1f108511722e1f1b0f9a029edf808ff285406545f24e327052e0efa780.svg":{"logical_path":"flags/1x1/ae.svg","mtime":"2017-10-08T14:45:34+02:00","size":273,"digest":"8c9b9b1f108511722e1f1b0f9a029edf808ff285406545f24e327052e0efa780","integrity":"sha256-jJubHxCFEXIuHxsPmgKe34CP8oVAZUXyTjJwUuDvp4A="},"flags/4x3/af-e271fd8f2fcdd0adda22a0e699173ff4e4cc65adfe7f05652cb77375eea99a93.svg":{"logical_path":"flags/4x3/af.svg","mtime":"2017-10-08T14:45:34+02:00","size":97407,"digest":"e271fd8f2fcdd0adda22a0e699173ff4e4cc65adfe7f05652cb77375eea99a93","integrity":"sha256-4nH9jy/N0K3aIqDmmRc/9OTMZa3+fwVlLLdzde6pmpM="},"flags/1x1/af-2629bc2e10edd54c384650f9aab1c6dfaf7101fda43ba3af627f0ec226db5892.svg":{"logical_path":"flags/1x1/af.svg","mtime":"2017-10-08T14:45:34+02:00","size":90925,"digest":"2629bc2e10edd54c384650f9aab1c6dfaf7101fda43ba3af627f0ec226db5892","integrity":"sha256-Jim8LhDt1Uw4RlD5qrHG369xAf2kO6OvYn8OwibbWJI="},"flags/4x3/ag-91fee45d7e1bab658f840a721364dd6eff0b67f9135dc8445a1b3554c347c2e9.svg":{"logical_path":"flags/4x3/ag.svg","mtime":"2017-10-08T14:45:34+02:00","size":902,"digest":"91fee45d7e1bab658f840a721364dd6eff0b67f9135dc8445a1b3554c347c2e9","integrity":"sha256-kf7kXX4bq2WPhApyE2Tdbv8LZ/kTXchEWhs1VMNHwuk="},"flags/1x1/ag-476bf833d4e0789f71d7b0d24164734ed97627f36edd09cc75991bcfbb2aa7af.svg":{"logical_path":"flags/1x1/ag.svg","mtime":"2017-10-08T14:45:34+02:00","size":862,"digest":"476bf833d4e0789f71d7b0d24164734ed97627f36edd09cc75991bcfbb2aa7af","integrity":"sha256-R2v4M9TgeJ9x17DSQWRzTtl2J/Nu3QnMdZkbz7sqp68="},"flags/4x3/ai-0106851bba5120a0f2bca5e6187ea65c9846e696f5ca57631aa89371cdf98871.svg":{"logical_path":"flags/4x3/ai.svg","mtime":"2017-10-08T14:45:34+02:00","size":55336,"digest":"0106851bba5120a0f2bca5e6187ea65c9846e696f5ca57631aa89371cdf98871","integrity":"sha256-AQaFG7pRIKDyvKXmGH6mXJhG5pb1yldjGqiTcc35iHE="},"flags/1x1/ai-50a3279d492c2932919c02880b69da7bb7948ce96988d8ccc9b16357f006165c.svg":{"logical_path":"flags/1x1/ai.svg","mtime":"2017-10-08T14:45:34+02:00","size":58220,"digest":"50a3279d492c2932919c02880b69da7bb7948ce96988d8ccc9b16357f006165c","integrity":"sha256-UKMnnUksKTKRnAKIC2nae7eUjOlpiNjMybFjV/AGFlw="},"flags/4x3/al-f8bc9837446a4880d29088f18bfc014b4cde95d8edda1241be22b5724a74ea8d.svg":{"logical_path":"flags/4x3/al.svg","mtime":"2017-10-08T14:45:34+02:00","size":4647,"digest":"f8bc9837446a4880d29088f18bfc014b4cde95d8edda1241be22b5724a74ea8d","integrity":"sha256-+LyYN0RqSIDSkIjxi/wBS0zeldjt2hJBviK1ckp06o0="},"flags/1x1/al-fb2c4d723ddbfb2c659ee2b3052d33347c130fb1024e2cb0ddd17f25b082542c.svg":{"logical_path":"flags/1x1/al.svg","mtime":"2017-10-08T14:45:34+02:00","size":4908,"digest":"fb2c4d723ddbfb2c659ee2b3052d33347c130fb1024e2cb0ddd17f25b082542c","integrity":"sha256-+yxNcj3b+yxlnuKzBS0zNHwTD7ECTiyw3dF/JbCCVCw="},"flags/4x3/am-aeabb81fbe6ac768ba7b95bb22e5a1791eb35ff83d0b5d6785c88ddc6835444e.svg":{"logical_path":"flags/4x3/am.svg","mtime":"2017-10-08T14:45:34+02:00","size":226,"digest":"aeabb81fbe6ac768ba7b95bb22e5a1791eb35ff83d0b5d6785c88ddc6835444e","integrity":"sha256-rqu4H75qx2i6e5W7IuWheR6zX/g9C11nhciN3Gg1RE4="},"flags/1x1/am-6fc2c9fb24a6a079960d619cc1fdaeee31cdb52d27c75bb9b065d9664d853c11.svg":{"logical_path":"flags/1x1/am.svg","mtime":"2017-10-08T14:45:34+02:00","size":242,"digest":"6fc2c9fb24a6a079960d619cc1fdaeee31cdb52d27c75bb9b065d9664d853c11","integrity":"sha256-b8LJ+ySmoHmWDWGcwf2u7jHNtS0nx1u5sGXZZk2FPBE="},"flags/4x3/ao-34ea70b51c9069ef1a859935f07a64cfffab4e08438a9c746898da56b495d127.svg":{"logical_path":"flags/4x3/ao.svg","mtime":"2017-10-08T14:45:34+02:00","size":2245,"digest":"34ea70b51c9069ef1a859935f07a64cfffab4e08438a9c746898da56b495d127","integrity":"sha256-NOpwtRyQae8ahZk18Hpkz/+rTghDipx0aJjaVrSV0Sc="},"flags/1x1/ao-1240d65f5dd9d8945701ed46611bd97f53f2cecf15b435cc54604eb79f4b97a8.svg":{"logical_path":"flags/1x1/ao.svg","mtime":"2017-10-08T14:45:34+02:00","size":2251,"digest":"1240d65f5dd9d8945701ed46611bd97f53f2cecf15b435cc54604eb79f4b97a8","integrity":"sha256-EkDWX13Z2JRXAe1GYRvZf1Pyzs8VtDXMVGBOt59Ll6g="},"flags/4x3/aq-6e2cee0eae620cd3f1fe6be665fd216f9a54a2afe215441005904dfeca24c169.svg":{"logical_path":"flags/4x3/aq.svg","mtime":"2017-10-08T14:45:34+02:00","size":4488,"digest":"6e2cee0eae620cd3f1fe6be665fd216f9a54a2afe215441005904dfeca24c169","integrity":"sha256-bizuDq5iDNPx/mvmZf0hb5pUoq/iFUQQBZBN/sokwWk="},"flags/1x1/aq-73c87173b09f476af2367895c76cf65d159c0a0b2ec292c1f1f5b08b2e78f829.svg":{"logical_path":"flags/1x1/aq.svg","mtime":"2017-10-08T14:45:34+02:00","size":4611,"digest":"73c87173b09f476af2367895c76cf65d159c0a0b2ec292c1f1f5b08b2e78f829","integrity":"sha256-c8hxc7CfR2ryNniVx2z2XRWcCgsuwpLB8fWwiy54+Ck="},"flags/4x3/ar-71eca3c44a303392f2c8db443add184c4c79d9fa8a3e729be2528c8db53790b6.svg":{"logical_path":"flags/4x3/ar.svg","mtime":"2017-10-08T14:45:34+02:00","size":34347,"digest":"71eca3c44a303392f2c8db443add184c4c79d9fa8a3e729be2528c8db53790b6","integrity":"sha256-ceyjxEowM5LyyNtEOt0YTEx52fqKPnKb4lKMjbU3kLY="},"flags/1x1/ar-0f75960e9ea2b2533e9112d4fc02154182f72460720c5a7d4dc21ef47758c369.svg":{"logical_path":"flags/1x1/ar.svg","mtime":"2017-10-08T14:45:34+02:00","size":34266,"digest":"0f75960e9ea2b2533e9112d4fc02154182f72460720c5a7d4dc21ef47758c369","integrity":"sha256-D3WWDp6islM+kRLU/AIVQYL3JGByDFp9TcIe9HdYw2k="},"flags/4x3/as-29ac7248b1c428a68d0e2b1cfca4fade7b0fcb38151bf980d35c3b0be63d3d91.svg":{"logical_path":"flags/4x3/as.svg","mtime":"2017-10-08T14:45:34+02:00","size":11465,"digest":"29ac7248b1c428a68d0e2b1cfca4fade7b0fcb38151bf980d35c3b0be63d3d91","integrity":"sha256-KaxySLHEKKaNDisc/KT63nsPyzgVG/mA01w7C+Y9PZE="},"flags/1x1/as-f516550a6b6cf7e277a1877cad9afe10f694ac32c92df7709690913fd59ecf20.svg":{"logical_path":"flags/1x1/as.svg","mtime":"2017-10-08T14:45:34+02:00","size":11530,"digest":"f516550a6b6cf7e277a1877cad9afe10f694ac32c92df7709690913fd59ecf20","integrity":"sha256-9RZVCmts9+J3oYd8rZr+EPaUrDLJLfdwlpCRP9WezyA="},"flags/4x3/at-e6517cfc6605c0ffa13da8db795d6e4cd353f72434f8fe38a2ebab7ba685081b.svg":{"logical_path":"flags/4x3/at.svg","mtime":"2017-10-08T14:45:34+02:00","size":263,"digest":"e6517cfc6605c0ffa13da8db795d6e4cd353f72434f8fe38a2ebab7ba685081b","integrity":"sha256-5lF8/GYFwP+hPajbeV1uTNNT9yQ0+P44ouure6aFCBs="},"flags/1x1/at-b9f9e8349460db6d35662b445a8a5fff96fccd904fff3411b711d31b2d7b7f16.svg":{"logical_path":"flags/1x1/at.svg","mtime":"2017-10-08T14:45:34+02:00","size":259,"digest":"b9f9e8349460db6d35662b445a8a5fff96fccd904fff3411b711d31b2d7b7f16","integrity":"sha256-ufnoNJRg2201ZitEWopf/5b8zZBP/zQRtxHTGy17fxY="},"flags/4x3/au-c929c02559051c3f51c0d93dd9df0d886b6c1efa083c0f101d2b3fd39706726e.svg":{"logical_path":"flags/4x3/au.svg","mtime":"2017-10-08T14:45:34+02:00","size":1773,"digest":"c929c02559051c3f51c0d93dd9df0d886b6c1efa083c0f101d2b3fd39706726e","integrity":"sha256-ySnAJVkFHD9RwNk92d8NiGtsHvoIPA8QHSs/05cGcm4="},"flags/1x1/au-96828c63a52eff55282096c045a3822cde99a00bf20528810d31f27b27208593.svg":{"logical_path":"flags/1x1/au.svg","mtime":"2017-10-08T14:45:34+02:00","size":1746,"digest":"96828c63a52eff55282096c045a3822cde99a00bf20528810d31f27b27208593","integrity":"sha256-loKMY6Uu/1UoIJbARaOCLN6ZoAvyBSiBDTHyeycghZM="},"flags/4x3/aw-44597b0ede9ff7df0e659c464a51fdbc1a7f5cc5cd621d281302843c23a905bf.svg":{"logical_path":"flags/4x3/aw.svg","mtime":"2017-10-08T14:45:34+02:00","size":14674,"digest":"44597b0ede9ff7df0e659c464a51fdbc1a7f5cc5cd621d281302843c23a905bf","integrity":"sha256-RFl7Dt6f998OZZxGSlH9vBp/XMXNYh0oEwKEPCOpBb8="},"flags/1x1/aw-2bd4b1890e233baeae0bcaaf1841803de35dd9c422f486588e48bf3506d69ae0.svg":{"logical_path":"flags/1x1/aw.svg","mtime":"2017-10-08T14:45:34+02:00","size":14194,"digest":"2bd4b1890e233baeae0bcaaf1841803de35dd9c422f486588e48bf3506d69ae0","integrity":"sha256-K9SxiQ4jO66uC8qvGEGAPeNd2cQi9IZYjki/NQbWmuA="},"flags/4x3/ax-95093e740b0b492f7cd96fe370fa2478f0d0148b89b424cd8436807234ade9dd.svg":{"logical_path":"flags/4x3/ax.svg","mtime":"2017-10-08T14:45:34+02:00","size":563,"digest":"95093e740b0b492f7cd96fe370fa2478f0d0148b89b424cd8436807234ade9dd","integrity":"sha256-lQk+dAsLSS982W/jcPokePDQFIuJtCTNhDaAcjSt6d0="},"flags/1x1/ax-99af962543005067e7239903eb6bc23226d30ce14a7c6408693dc9641193ddc3.svg":{"logical_path":"flags/1x1/ax.svg","mtime":"2017-10-08T14:45:34+02:00","size":549,"digest":"99af962543005067e7239903eb6bc23226d30ce14a7c6408693dc9641193ddc3","integrity":"sha256-ma+WJUMAUGfnI5kD62vCMibTDOFKfGQIaT3JZBGT3cM="},"flags/4x3/az-c0959e214bf9a3e94993cfc03f4884b15f6d8c4dd20842a5052a29a8495fd431.svg":{"logical_path":"flags/4x3/az.svg","mtime":"2017-10-08T14:45:34+02:00","size":567,"digest":"c0959e214bf9a3e94993cfc03f4884b15f6d8c4dd20842a5052a29a8495fd431","integrity":"sha256-wJWeIUv5o+lJk8/AP0iEsV9tjE3SCEKlBSopqElf1DE="},"flags/1x1/az-3db731c28289795dc3bda91b3bab129d994a09b8ee0959d34f21a1f840f894de.svg":{"logical_path":"flags/1x1/az.svg","mtime":"2017-10-08T14:45:34+02:00","size":611,"digest":"3db731c28289795dc3bda91b3bab129d994a09b8ee0959d34f21a1f840f894de","integrity":"sha256-PbcxwoKJeV3DvakbO6sSnZlKCbjuCVnTTyGh+ED4lN4="},"flags/4x3/ba-388ea99507a04cc5d4768bd708d984714aeebbe4177a1cf8ffe0b8331dd856d9.svg":{"logical_path":"flags/4x3/ba.svg","mtime":"2017-10-08T14:45:34+02:00","size":1512,"digest":"388ea99507a04cc5d4768bd708d984714aeebbe4177a1cf8ffe0b8331dd856d9","integrity":"sha256-OI6plQegTMXUdovXCNmEcUruu+QXehz4/+C4Mx3YVtk="},"flags/1x1/ba-b7d7ab49229704dff0192935c9fb7fb4ea6ba989ce4fee832a738a5d78b39d71.svg":{"logical_path":"flags/1x1/ba.svg","mtime":"2017-10-08T14:45:34+02:00","size":1482,"digest":"b7d7ab49229704dff0192935c9fb7fb4ea6ba989ce4fee832a738a5d78b39d71","integrity":"sha256-t9erSSKXBN/wGSk1yft/tOprqYnOT+6DKnOKXXiznXE="},"flags/4x3/bb-6df74e1044b7f42c2c3b1082d46eb0198aa65a180459fdd950838cd2e6c00ee1.svg":{"logical_path":"flags/4x3/bb.svg","mtime":"2017-10-08T14:45:34+02:00","size":767,"digest":"6df74e1044b7f42c2c3b1082d46eb0198aa65a180459fdd950838cd2e6c00ee1","integrity":"sha256-bfdOEES39CwsOxCC1G6wGYqmWhgEWf3ZUIOM0ubADuE="},"flags/1x1/bb-eb10f33cbde25ab6ccaa49cbe3976b4f5ece2fa1d3d485394caa158f10b8b8c9.svg":{"logical_path":"flags/1x1/bb.svg","mtime":"2017-10-08T14:45:34+02:00","size":763,"digest":"eb10f33cbde25ab6ccaa49cbe3976b4f5ece2fa1d3d485394caa158f10b8b8c9","integrity":"sha256-6xDzPL3iWrbMqknL45drT17OL6HT1IU5TKoVjxC4uMk="},"flags/4x3/bd-6cc222c4343f0027697ddd9e8d48f2cf93d3f677b6460b530eabefd2410cfef3.svg":{"logical_path":"flags/4x3/bd.svg","mtime":"2017-10-08T14:45:34+02:00","size":205,"digest":"6cc222c4343f0027697ddd9e8d48f2cf93d3f677b6460b530eabefd2410cfef3","integrity":"sha256-bMIixDQ/ACdpfd2ejUjyz5PT9ne2RgtTDqvv0kEM/vM="},"flags/1x1/bd-2dc72311aca457668c8bce4f3a22c1b76320e00be50a58fb4001ea39caf6725c.svg":{"logical_path":"flags/1x1/bd.svg","mtime":"2017-10-08T14:45:34+02:00","size":209,"digest":"2dc72311aca457668c8bce4f3a22c1b76320e00be50a58fb4001ea39caf6725c","integrity":"sha256-LccjEaykV2aMi85POiLBt2Mg4AvlClj7QAHqOcr2clw="},"flags/4x3/be-2b7e73068f4f120ed0ccc3a9fbb8566c9574b206afd8373ed9050e2a971c4f99.svg":{"logical_path":"flags/4x3/be.svg","mtime":"2017-10-08T14:45:34+02:00","size":318,"digest":"2b7e73068f4f120ed0ccc3a9fbb8566c9574b206afd8373ed9050e2a971c4f99","integrity":"sha256-K35zBo9PEg7QzMOp+7hWbJV0sgav2Dc+2QUOKpccT5k="},"flags/1x1/be-c4c9351d83a4db1f8c7c73dd6476569f0dfd82290ffd20275b7372908c2f2a7e.svg":{"logical_path":"flags/1x1/be.svg","mtime":"2017-10-08T14:45:34+02:00","size":318,"digest":"c4c9351d83a4db1f8c7c73dd6476569f0dfd82290ffd20275b7372908c2f2a7e","integrity":"sha256-xMk1HYOk2x+MfHPdZHZWnw39gikP/SAnW3NykIwvKn4="},"flags/4x3/bf-56669967fef6bb607ea2fd26d32d922cf78f176115287e37e9cf0b8bbec677f0.svg":{"logical_path":"flags/4x3/bf.svg","mtime":"2017-10-08T14:45:34+02:00","size":447,"digest":"56669967fef6bb607ea2fd26d32d922cf78f176115287e37e9cf0b8bbec677f0","integrity":"sha256-VmaZZ/72u2B+ov0m0y2SLPePF2EVKH436c8Li77Gd/A="},"flags/1x1/bf-ffc3651e87b9ccc9374d5bc95617aad474bcaa35871c83ae91fa71eb8b46bab3.svg":{"logical_path":"flags/1x1/bf.svg","mtime":"2017-10-08T14:45:34+02:00","size":459,"digest":"ffc3651e87b9ccc9374d5bc95617aad474bcaa35871c83ae91fa71eb8b46bab3","integrity":"sha256-/8NlHoe5zMk3TVvJVheq1HS8qjWHHIOukfpx64tGurM="},"flags/4x3/bg-ad796782d048f6ddc6715f7ea915a2c86716753579735ec071a106a7f3fc13b6.svg":{"logical_path":"flags/4x3/bg.svg","mtime":"2017-10-08T14:45:34+02:00","size":305,"digest":"ad796782d048f6ddc6715f7ea915a2c86716753579735ec071a106a7f3fc13b6","integrity":"sha256-rXlngtBI9t3GcV9+qRWiyGcWdTV5c17AcaEGp/P8E7Y="},"flags/1x1/bg-962bd196cc8e4b702757e17a9002e867843c16415a47a52ecd97459278e5fa1f.svg":{"logical_path":"flags/1x1/bg.svg","mtime":"2017-10-08T14:45:34+02:00","size":309,"digest":"962bd196cc8e4b702757e17a9002e867843c16415a47a52ecd97459278e5fa1f","integrity":"sha256-livRlsyOS3AnV+F6kALoZ4Q8FkFaR6UuzZdFknjl+h8="},"flags/4x3/bh-aeff05c6dfa41e89db539312faedc41198ba2f2d9bf5ad9f22992a0a5a4151e8.svg":{"logical_path":"flags/4x3/bh.svg","mtime":"2017-10-08T14:45:34+02:00","size":622,"digest":"aeff05c6dfa41e89db539312faedc41198ba2f2d9bf5ad9f22992a0a5a4151e8","integrity":"sha256-rv8Fxt+kHonbU5MS+u3EEZi6Ly2b9a2fIpkqClpBUeg="},"flags/1x1/bh-12da0d548841b860a7aedbbc858df1278a4f56105ae643f9379f5c2a3caa294a.svg":{"logical_path":"flags/1x1/bh.svg","mtime":"2017-10-08T14:45:34+02:00","size":689,"digest":"12da0d548841b860a7aedbbc858df1278a4f56105ae643f9379f5c2a3caa294a","integrity":"sha256-EtoNVIhBuGCnrtu8hY3xJ4pPVhBa5kP5N59cKjyqKUo="},"flags/4x3/bi-7f43c6407a6f007fd70e7b43f9b34e870cc757736a9e2399c46381c8434d238f.svg":{"logical_path":"flags/4x3/bi.svg","mtime":"2017-10-08T14:45:34+02:00","size":1317,"digest":"7f43c6407a6f007fd70e7b43f9b34e870cc757736a9e2399c46381c8434d238f","integrity":"sha256-f0PGQHpvAH/XDntD+bNOhwzHV3NqniOZxGOByENNI48="},"flags/1x1/bi-454adb690bfce8243896377b9c314ef8f447ec4d85dc677860f521a6c30c896e.svg":{"logical_path":"flags/1x1/bi.svg","mtime":"2017-10-08T14:45:34+02:00","size":1248,"digest":"454adb690bfce8243896377b9c314ef8f447ec4d85dc677860f521a6c30c896e","integrity":"sha256-RUrbaQv86CQ4ljd7nDFO+PRH7E2F3Gd4YPUhpsMMiW4="},"flags/4x3/bj-85ecb891b5ebbe5802bd23d41fa44f1c1dbf047aceba991e6006e377c53fa263.svg":{"logical_path":"flags/4x3/bj.svg","mtime":"2017-10-08T14:45:34+02:00","size":503,"digest":"85ecb891b5ebbe5802bd23d41fa44f1c1dbf047aceba991e6006e377c53fa263","integrity":"sha256-hey4kbXrvlgCvSPUH6RPHB2/BHrOupkeYAbjd8U/omM="},"flags/1x1/bj-861b63ba692ecf3e1705296e51ef4f80da47a2eff5cfa29a787bcbc4fc989a53.svg":{"logical_path":"flags/1x1/bj.svg","mtime":"2017-10-08T14:45:34+02:00","size":504,"digest":"861b63ba692ecf3e1705296e51ef4f80da47a2eff5cfa29a787bcbc4fc989a53","integrity":"sha256-hhtjumkuzz4XBSluUe9PgNpHou/1z6KaeHvLxPyYmlM="},"flags/4x3/bl-2c832da5dfab278f90dcfd6265c08211802e94d9b6a5634df6dacdb750723312.svg":{"logical_path":"flags/4x3/bl.svg","mtime":"2017-10-08T14:45:34+02:00","size":327,"digest":"2c832da5dfab278f90dcfd6265c08211802e94d9b6a5634df6dacdb750723312","integrity":"sha256-LIMtpd+rJ4+Q3P1iZcCCEYAulNm2pWNN9trNt1ByMxI="},"flags/1x1/bl-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/bl.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/bm-05e6a9d863d77266cc3e2a74fddea640757e09b54d3032711f0d1890b5b61d3d.svg":{"logical_path":"flags/4x3/bm.svg","mtime":"2017-10-08T14:45:34+02:00","size":32127,"digest":"05e6a9d863d77266cc3e2a74fddea640757e09b54d3032711f0d1890b5b61d3d","integrity":"sha256-Beap2GPXcmbMPip0/d6mQHV+CbVNMDJxHw0YkLW2HT0="},"flags/1x1/bm-0a16d9ab856676f9511627004ba4ee08ebe041533a33046c3f732ffb2793cf8a.svg":{"logical_path":"flags/1x1/bm.svg","mtime":"2017-10-08T14:45:34+02:00","size":31633,"digest":"0a16d9ab856676f9511627004ba4ee08ebe041533a33046c3f732ffb2793cf8a","integrity":"sha256-ChbZq4VmdvlRFicAS6TuCOvgQVM6MwRsP3Mv+yeTz4o="},"flags/4x3/bn-1560949666220d88ee037b03ce1ac0b95c1b91667f05cf2b8b06a043efb01253.svg":{"logical_path":"flags/4x3/bn.svg","mtime":"2017-10-08T14:45:34+02:00","size":21816,"digest":"1560949666220d88ee037b03ce1ac0b95c1b91667f05cf2b8b06a043efb01253","integrity":"sha256-FWCUlmYiDYjuA3sDzhrAuVwbkWZ/Bc8riwagQ++wElM="},"flags/1x1/bn-387ebb4b9e1b3796c94edd61402851eafb8b185d7061671b832c1879db69d6eb.svg":{"logical_path":"flags/1x1/bn.svg","mtime":"2017-10-08T14:45:34+02:00","size":22121,"digest":"387ebb4b9e1b3796c94edd61402851eafb8b185d7061671b832c1879db69d6eb","integrity":"sha256-OH67S54bN5bJTt1hQChR6vuLGF1wYWcbgywYedtp1us="},"flags/4x3/bo-96c7f8e64029f530108baee22d8a07cad2787f41eeed0b647f800bb533c39c63.svg":{"logical_path":"flags/4x3/bo.svg","mtime":"2017-10-08T14:45:34+02:00","size":212103,"digest":"96c7f8e64029f530108baee22d8a07cad2787f41eeed0b647f800bb533c39c63","integrity":"sha256-lsf45kAp9TAQi67iLYoHytJ4f0Hu7Qtkf4ALtTPDnGM="},"flags/1x1/bo-ef679f07e201a91bc3e2152310eb597f731f7133d58be7fc0b1bbb3d8538c666.svg":{"logical_path":"flags/1x1/bo.svg","mtime":"2017-10-08T14:45:34+02:00","size":210767,"digest":"ef679f07e201a91bc3e2152310eb597f731f7133d58be7fc0b1bbb3d8538c666","integrity":"sha256-72efB+IBqRvD4hUjEOtZf3MfcTPVi+f8Cxu7PYU4xmY="},"flags/4x3/bq-687781ca2bff027ee1c2bf587d45147cbe81af412d8a4c52e89673535bfa6a6c.svg":{"logical_path":"flags/4x3/bq.svg","mtime":"2017-10-08T14:45:34+02:00","size":227,"digest":"687781ca2bff027ee1c2bf587d45147cbe81af412d8a4c52e89673535bfa6a6c","integrity":"sha256-aHeByiv/An7hwr9YfUUUfL6Br0EtikxS6JZzU1v6amw="},"flags/1x1/bq-4c8a202ed7a99c1515fad01c0b79234163b42cfdc813aee71c0d277b49aadaa5.svg":{"logical_path":"flags/1x1/bq.svg","mtime":"2017-10-08T14:45:34+02:00","size":231,"digest":"4c8a202ed7a99c1515fad01c0b79234163b42cfdc813aee71c0d277b49aadaa5","integrity":"sha256-TIogLtepnBUV+tAcC3kjQWO0LP3IE67nHA0ne0mq2qU="},"flags/4x3/br-8370504ef87598decf706a50bc8b5deecfa80f965b4c3642d2207c9e0804be3a.svg":{"logical_path":"flags/4x3/br.svg","mtime":"2017-10-08T14:45:34+02:00","size":12470,"digest":"8370504ef87598decf706a50bc8b5deecfa80f965b4c3642d2207c9e0804be3a","integrity":"sha256-g3BQTvh1mN7PcGpQvItd7s+oD5ZbTDZC0iB8nggEvjo="},"flags/1x1/br-cce00e29adbdf110d4155153c8f21e36c46c34847baffafc33b806e121e320d7.svg":{"logical_path":"flags/1x1/br.svg","mtime":"2017-10-08T14:45:34+02:00","size":12219,"digest":"cce00e29adbdf110d4155153c8f21e36c46c34847baffafc33b806e121e320d7","integrity":"sha256-zOAOKa298RDUFVFTyPIeNsRsNIR7r/r8M7gG4SHjINc="},"flags/4x3/bs-80764fdde4884571c2ce5c348231dfe2c57c9e81d4d0d8722ae649ef37a9888c.svg":{"logical_path":"flags/4x3/bs.svg","mtime":"2017-10-08T14:45:34+02:00","size":608,"digest":"80764fdde4884571c2ce5c348231dfe2c57c9e81d4d0d8722ae649ef37a9888c","integrity":"sha256-gHZP3eSIRXHCzlw0gjHf4sV8noHU0NhyKuZJ7zepiIw="},"flags/1x1/bs-0a06f669be5ce81e27f5d9ace25e2254113cad9c2964208b5cd136e8b173b6e8.svg":{"logical_path":"flags/1x1/bs.svg","mtime":"2017-10-08T14:45:34+02:00","size":658,"digest":"0a06f669be5ce81e27f5d9ace25e2254113cad9c2964208b5cd136e8b173b6e8","integrity":"sha256-Cgb2ab5c6B4n9dms4l4iVBE8rZwpZCCLXNE26LFztug="},"flags/4x3/bt-9d00de93c399a0ed1118946c0d662d997847480445bfbbba259e42f80b170be6.svg":{"logical_path":"flags/4x3/bt.svg","mtime":"2017-10-08T14:45:34+02:00","size":41510,"digest":"9d00de93c399a0ed1118946c0d662d997847480445bfbbba259e42f80b170be6","integrity":"sha256-nQDek8OZoO0RGJRsDWYtmXhHSARFv7u6JZ5C+AsXC+Y="},"flags/1x1/bt-32fb8022976e00163073b1f3ff2f62dda6915dd4270d2e09ae51babe67d2ce32.svg":{"logical_path":"flags/1x1/bt.svg","mtime":"2017-10-08T14:45:34+02:00","size":40896,"digest":"32fb8022976e00163073b1f3ff2f62dda6915dd4270d2e09ae51babe67d2ce32","integrity":"sha256-MvuAIpduABYwc7Hz/y9i3aaRXdQnDS4JrlG6vmfSzjI="},"flags/4x3/bv-e0fd8f945e245badbcc8deedd6c139e2e19d26b3aea7bf1b9714595a2b08def1.svg":{"logical_path":"flags/4x3/bv.svg","mtime":"2017-10-08T14:45:34+02:00","size":647,"digest":"e0fd8f945e245badbcc8deedd6c139e2e19d26b3aea7bf1b9714595a2b08def1","integrity":"sha256-4P2PlF4kW628yN7t1sE54uGdJrOup78blxRZWisI3vE="},"flags/1x1/bv-dceefec7161747877af75d9c4b5bd8c53bfeb5cbbe94b41de9a2201321673653.svg":{"logical_path":"flags/1x1/bv.svg","mtime":"2017-10-08T14:45:34+02:00","size":647,"digest":"dceefec7161747877af75d9c4b5bd8c53bfeb5cbbe94b41de9a2201321673653","integrity":"sha256-3O7+xxYXR4d6912cS1vYxTv+tcu+lLQd6aIgEyFnNlM="},"flags/4x3/bw-b5231bca6e8f2dd2371e3b4f776cb33af3889d2ad41c3791feb7cba3afe12992.svg":{"logical_path":"flags/4x3/bw.svg","mtime":"2017-10-08T14:45:34+02:00","size":327,"digest":"b5231bca6e8f2dd2371e3b4f776cb33af3889d2ad41c3791feb7cba3afe12992","integrity":"sha256-tSMbym6PLdI3HjtPd2yzOvOInSrUHDeR/rfLo6/hKZI="},"flags/1x1/bw-35bd0c7c542ab29aa65df0322f37befe54917cde0ec29a6358a8cbfcd3eb78a2.svg":{"logical_path":"flags/1x1/bw.svg","mtime":"2017-10-08T14:45:34+02:00","size":285,"digest":"35bd0c7c542ab29aa65df0322f37befe54917cde0ec29a6358a8cbfcd3eb78a2","integrity":"sha256-Nb0MfFQqspqmXfAyLze+/lSRfN4OwppjWKjL/NPreKI="},"flags/4x3/by-0111fe7946228bd49fa5ffc1d04e1dbea12bb0483cee4bf146e23fcb5d7bd829.svg":{"logical_path":"flags/4x3/by.svg","mtime":"2017-10-08T14:45:34+02:00","size":9067,"digest":"0111fe7946228bd49fa5ffc1d04e1dbea12bb0483cee4bf146e23fcb5d7bd829","integrity":"sha256-ARH+eUYii9Sfpf/B0E4dvqErsEg87kvxRuI/y1172Ck="},"flags/1x1/by-3a64902f39b8bac7c042cadcd2ace69975498cc6254f60f31829ebbfe31c2ef5.svg":{"logical_path":"flags/1x1/by.svg","mtime":"2017-10-08T14:45:34+02:00","size":8989,"digest":"3a64902f39b8bac7c042cadcd2ace69975498cc6254f60f31829ebbfe31c2ef5","integrity":"sha256-OmSQLzm4usfAQsrc0qzmmXVJjMYlT2DzGCnrv+McLvU="},"flags/4x3/bz-f6761e8e1132b192c6c2dddcb1d0239ed14e801b8902a7ee8fb0cb869a517eab.svg":{"logical_path":"flags/4x3/bz.svg","mtime":"2017-10-08T14:45:34+02:00","size":77834,"digest":"f6761e8e1132b192c6c2dddcb1d0239ed14e801b8902a7ee8fb0cb869a517eab","integrity":"sha256-9nYejhEysZLGwt3csdAjntFOgBuJAqfuj7DLhppRfqs="},"flags/1x1/bz-2d1e5ec107a277b8e97fede80f512c23ebbf9c225a2c5450dc51c5fb03c9571b.svg":{"logical_path":"flags/1x1/bz.svg","mtime":"2017-10-08T14:45:34+02:00","size":78036,"digest":"2d1e5ec107a277b8e97fede80f512c23ebbf9c225a2c5450dc51c5fb03c9571b","integrity":"sha256-LR5ewQeid7jpf+3oD1EsI+u/nCJaLFRQ3FHF+wPJVxs="},"flags/4x3/ca-cf63f34a0cef8ed56b4cf1ba24fecc20cea252a9eb9e2c16acccf4eb80b32f49.svg":{"logical_path":"flags/4x3/ca.svg","mtime":"2017-10-08T14:45:34+02:00","size":1143,"digest":"cf63f34a0cef8ed56b4cf1ba24fecc20cea252a9eb9e2c16acccf4eb80b32f49","integrity":"sha256-z2PzSgzvjtVrTPG6JP7MIM6iUqnrniwWrMz064CzL0k="},"flags/1x1/ca-5c78fbcd8924e8f76111f1cc50317decd6b7c1761e57f19ad33f0b295d002138.svg":{"logical_path":"flags/1x1/ca.svg","mtime":"2017-10-08T14:45:34+02:00","size":1081,"digest":"5c78fbcd8924e8f76111f1cc50317decd6b7c1761e57f19ad33f0b295d002138","integrity":"sha256-XHj7zYkk6PdhEfHMUDF97Na3wXYeV/Ga0z8LKV0AITg="},"flags/4x3/cc-f5d8e042b0f7ee2be5ed555b4ea6a0586e69eeb9230701967903364c19e49006.svg":{"logical_path":"flags/4x3/cc.svg","mtime":"2017-10-08T14:45:34+02:00","size":4337,"digest":"f5d8e042b0f7ee2be5ed555b4ea6a0586e69eeb9230701967903364c19e49006","integrity":"sha256-9djgQrD37ivl7VVbTqagWG5p7rkjBwGWeQM2TBnkkAY="},"flags/1x1/cc-7dc42986b5859331d9f6c96ae7a97b378ff38e4480072cbecceae78e338891a0.svg":{"logical_path":"flags/1x1/cc.svg","mtime":"2017-10-08T14:45:34+02:00","size":4318,"digest":"7dc42986b5859331d9f6c96ae7a97b378ff38e4480072cbecceae78e338891a0","integrity":"sha256-fcQphrWFkzHZ9slq56l7N4/zjkSAByy+zOrnjjOIkaA="},"flags/4x3/cd-9d7d8b11e63073792e3d5e0327cc673101c65ae7545d721b8b1504c31a0c0078.svg":{"logical_path":"flags/4x3/cd.svg","mtime":"2017-10-08T14:45:34+02:00","size":352,"digest":"9d7d8b11e63073792e3d5e0327cc673101c65ae7545d721b8b1504c31a0c0078","integrity":"sha256-nX2LEeYwc3kuPV4DJ8xnMQHGWudUXXIbixUEwxoMAHg="},"flags/1x1/cd-f42723b2e3b7815b2a4b970c5d8a8abea987cf16ff26dbab0c1a78f3ffa3d1fd.svg":{"logical_path":"flags/1x1/cd.svg","mtime":"2017-10-08T14:45:34+02:00","size":512,"digest":"f42723b2e3b7815b2a4b970c5d8a8abea987cf16ff26dbab0c1a78f3ffa3d1fd","integrity":"sha256-9CcjsuO3gVsqS5cMXYqKvqmHzxb/JturDBp48/+j0f0="},"flags/4x3/cf-902b209a0eaeb8f41f529b5c98240d4fa94dffd58ac3bdc2b6c574125897bb8c.svg":{"logical_path":"flags/4x3/cf.svg","mtime":"2017-10-08T14:45:34+02:00","size":757,"digest":"902b209a0eaeb8f41f529b5c98240d4fa94dffd58ac3bdc2b6c574125897bb8c","integrity":"sha256-kCsgmg6uuPQfUptcmCQNT6lN/9WKw73CtsV0EliXu4w="},"flags/1x1/cf-f9b65e234b309ba4f3b2261dcb605b257bd941a308d208b1eaa89af874c779ec.svg":{"logical_path":"flags/1x1/cf.svg","mtime":"2017-10-08T14:45:34+02:00","size":679,"digest":"f9b65e234b309ba4f3b2261dcb605b257bd941a308d208b1eaa89af874c779ec","integrity":"sha256-+bZeI0swm6TzsiYdy2BbJXvZQaMI0gix6qia+HTHeew="},"flags/4x3/cg-f62e43d08581b8665ab9a7e61ab62cc6b3dd8e6fd0722c7d45c6ddc3f46ec5ab.svg":{"logical_path":"flags/4x3/cg.svg","mtime":"2017-10-08T14:45:34+02:00","size":492,"digest":"f62e43d08581b8665ab9a7e61ab62cc6b3dd8e6fd0722c7d45c6ddc3f46ec5ab","integrity":"sha256-9i5D0IWBuGZauafmGrYsxrPdjm/Qcix9Rcbdw/Ruxas="},"flags/1x1/cg-f2fbf08b1f5fd7e097600a9399d467cb9af8d24fd103a3eeb99f5cf58e6fc0b6.svg":{"logical_path":"flags/1x1/cg.svg","mtime":"2017-10-08T14:45:34+02:00","size":507,"digest":"f2fbf08b1f5fd7e097600a9399d467cb9af8d24fd103a3eeb99f5cf58e6fc0b6","integrity":"sha256-8vvwix9f1+CXYAqTmdRny5r40k/RA6PuuZ9c9Y5vwLY="},"flags/4x3/ch-830fe6654b170d461a76a7932b39d352ec30895d512c009a5c193c5a28289158.svg":{"logical_path":"flags/4x3/ch.svg","mtime":"2017-10-08T14:45:34+02:00","size":336,"digest":"830fe6654b170d461a76a7932b39d352ec30895d512c009a5c193c5a28289158","integrity":"sha256-gw/mZUsXDUYadqeTKznTUuwwiV1RLACaXBk8WigokVg="},"flags/1x1/ch-9f95a95e181489d64144d4502991c00823cf19fefc029cb639199cb100863a0a.svg":{"logical_path":"flags/1x1/ch.svg","mtime":"2017-10-08T14:45:34+02:00","size":354,"digest":"9f95a95e181489d64144d4502991c00823cf19fefc029cb639199cb100863a0a","integrity":"sha256-n5WpXhgUidZBRNRQKZHACCPPGf78Apy2ORmcsQCGOgo="},"flags/4x3/ci-3e6b86d6fc1a24b5635c258bbde180f8638e114be354d7379406d5718e46b70b.svg":{"logical_path":"flags/4x3/ci.svg","mtime":"2017-10-08T14:45:34+02:00","size":346,"digest":"3e6b86d6fc1a24b5635c258bbde180f8638e114be354d7379406d5718e46b70b","integrity":"sha256-PmuG1vwaJLVjXCWLveGA+GOOEUvjVNc3lAbVcY5Gtws="},"flags/1x1/ci-816edfc3bfc44353f99572310ba67643f979b1681c2643ecc34255df1dbee05e.svg":{"logical_path":"flags/1x1/ci.svg","mtime":"2017-10-08T14:45:34+02:00","size":305,"digest":"816edfc3bfc44353f99572310ba67643f979b1681c2643ecc34255df1dbee05e","integrity":"sha256-gW7fw7/EQ1P5lXIxC6Z2Q/l5sWgcJkPsw0JV3x2+4F4="},"flags/4x3/ck-cadf8156d64ddcff3d60079d017b12bb4e25867e58fa2618f42defa4f7bc8587.svg":{"logical_path":"flags/4x3/ck.svg","mtime":"2017-10-08T14:45:34+02:00","size":2639,"digest":"cadf8156d64ddcff3d60079d017b12bb4e25867e58fa2618f42defa4f7bc8587","integrity":"sha256-yt+BVtZN3P89YAedAXsSu04lhn5Y+iYY9C3vpPe8hYc="},"flags/1x1/ck-450d3b83c32f220510bdbab3ec0fca14edf895e53db9e26e4cd00a3edfb3e224.svg":{"logical_path":"flags/1x1/ck.svg","mtime":"2017-10-08T14:45:34+02:00","size":2526,"digest":"450d3b83c32f220510bdbab3ec0fca14edf895e53db9e26e4cd00a3edfb3e224","integrity":"sha256-RQ07g8MvIgUQvbqz7A/KFO34leU9ueJuTNAKPt+z4iQ="},"flags/4x3/cl-28ce953691b1c4b0c6d562370913b3ad645e29e56296c16762992e3c30f2a4a8.svg":{"logical_path":"flags/4x3/cl.svg","mtime":"2017-10-08T14:45:34+02:00","size":635,"digest":"28ce953691b1c4b0c6d562370913b3ad645e29e56296c16762992e3c30f2a4a8","integrity":"sha256-KM6VNpGxxLDG1WI3CROzrWReKeVilsFnYpkuPDDypKg="},"flags/1x1/cl-ed5421f0ff3ba05785268eed2abd3abf76125ec832e519bc10a30db278c23662.svg":{"logical_path":"flags/1x1/cl.svg","mtime":"2017-10-08T14:45:34+02:00","size":665,"digest":"ed5421f0ff3ba05785268eed2abd3abf76125ec832e519bc10a30db278c23662","integrity":"sha256-7VQh8P87oFeFJo7tKr06v3YSXsgy5Rm8EKMNsnjCNmI="},"flags/4x3/cm-d22cb6519bfbf9fbae46b283f6d882f8d46713f18ba59969ae45c542ba2bc621.svg":{"logical_path":"flags/4x3/cm.svg","mtime":"2017-10-08T14:45:34+02:00","size":847,"digest":"d22cb6519bfbf9fbae46b283f6d882f8d46713f18ba59969ae45c542ba2bc621","integrity":"sha256-0iy2UZv7+fuuRrKD9tiC+NRnE/GLpZlprkXFQrorxiE="},"flags/1x1/cm-4619b0400d175f6c0f686526cfdbfcc6f7c2fc7587449e05ab0385cc7d4e8bd4.svg":{"logical_path":"flags/1x1/cm.svg","mtime":"2017-10-08T14:45:34+02:00","size":847,"digest":"4619b0400d175f6c0f686526cfdbfcc6f7c2fc7587449e05ab0385cc7d4e8bd4","integrity":"sha256-RhmwQA0XX2wPaGUmz9v8xvfC/HWHRJ4FqwOFzH1Oi9Q="},"flags/4x3/cn-7af9da3dd810174340b79e6fe636bec183c71d7ce314ac4a5a815bfd388dea54.svg":{"logical_path":"flags/4x3/cn.svg","mtime":"2017-10-08T14:45:34+02:00","size":848,"digest":"7af9da3dd810174340b79e6fe636bec183c71d7ce314ac4a5a815bfd388dea54","integrity":"sha256-evnaPdgQF0NAt55v5ja+wYPHHXzjFKxKWoFb/TiN6lQ="},"flags/1x1/cn-22e04d44d7f85e6f5800bddc6a497e5722de8db2ad74c6c525c392bd7b8c6e09.svg":{"logical_path":"flags/1x1/cn.svg","mtime":"2017-10-08T14:45:34+02:00","size":792,"digest":"22e04d44d7f85e6f5800bddc6a497e5722de8db2ad74c6c525c392bd7b8c6e09","integrity":"sha256-IuBNRNf4Xm9YAL3cakl+VyLejbKtdMbFJcOSvXuMbgk="},"flags/4x3/co-ef2a3c7e495d85d7df1b9bda27023cd558abe89402cad0ff42428c2c5b877551.svg":{"logical_path":"flags/4x3/co.svg","mtime":"2017-10-08T14:45:34+02:00","size":304,"digest":"ef2a3c7e495d85d7df1b9bda27023cd558abe89402cad0ff42428c2c5b877551","integrity":"sha256-7yo8fkldhdffG5vaJwI81Vir6JQCytD/QkKMLFuHdVE="},"flags/1x1/co-42915db89e2fa2f9f97c09ecafc188eb2ec4e51efa87685a01c25d2f0afddf45.svg":{"logical_path":"flags/1x1/co.svg","mtime":"2017-10-08T14:45:34+02:00","size":320,"digest":"42915db89e2fa2f9f97c09ecafc188eb2ec4e51efa87685a01c25d2f0afddf45","integrity":"sha256-QpFduJ4vovn5fAnsr8GI6y7E5R76h2haAcJdLwr930U="},"flags/4x3/cr-7853ef9dbb5832a6d2738b44afdecfcdaa80c56cb66c448b8a8657e236854c8d.svg":{"logical_path":"flags/4x3/cr.svg","mtime":"2017-10-08T14:45:34+02:00","size":303,"digest":"7853ef9dbb5832a6d2738b44afdecfcdaa80c56cb66c448b8a8657e236854c8d","integrity":"sha256-eFPvnbtYMqbSc4tEr97PzaqAxWy2bESLioZX4jaFTI0="},"flags/1x1/cr-b86f916cc80cc14db90b66c652a2919a26baf2864451685af9c34d6310c3f8c6.svg":{"logical_path":"flags/1x1/cr.svg","mtime":"2017-10-08T14:45:34+02:00","size":320,"digest":"b86f916cc80cc14db90b66c652a2919a26baf2864451685af9c34d6310c3f8c6","integrity":"sha256-uG+RbMgMwU25C2bGUqKRmia68oZEUWha+cNNYxDD+MY="},"flags/4x3/cu-e3a3afa4a5c661ad431dc45eb501d7e1280b4a397bafa3956a9fc5bab8735f45.svg":{"logical_path":"flags/4x3/cu.svg","mtime":"2017-10-08T14:45:34+02:00","size":682,"digest":"e3a3afa4a5c661ad431dc45eb501d7e1280b4a397bafa3956a9fc5bab8735f45","integrity":"sha256-46OvpKXGYa1DHcRetQHX4SgLSjl7r6OVap/FurhzX0U="},"flags/1x1/cu-9563bc3aa0b1ac659dddaa2534c37d338e1da3dfd3726a717fc85ca8449c83da.svg":{"logical_path":"flags/1x1/cu.svg","mtime":"2017-10-08T14:45:34+02:00","size":638,"digest":"9563bc3aa0b1ac659dddaa2534c37d338e1da3dfd3726a717fc85ca8449c83da","integrity":"sha256-lWO8OqCxrGWd3aolNMN9M44do9/Tcmpxf8hcqEScg9o="},"flags/4x3/cv-d39c3ae09026623cebad38bbe41231aea9b9afacf7eca1d0abf6666e91dd8bbc.svg":{"logical_path":"flags/4x3/cv.svg","mtime":"2017-10-08T14:45:34+02:00","size":1790,"digest":"d39c3ae09026623cebad38bbe41231aea9b9afacf7eca1d0abf6666e91dd8bbc","integrity":"sha256-05w64JAmYjzrrTi75BIxrqm5r6z37KHQq/ZmbpHdi7w="},"flags/1x1/cv-78857e96ac5b49478a49578f422abe217af9ed7d90fa2d08ae72a67de4f6999e.svg":{"logical_path":"flags/1x1/cv.svg","mtime":"2017-10-08T14:45:34+02:00","size":1734,"digest":"78857e96ac5b49478a49578f422abe217af9ed7d90fa2d08ae72a67de4f6999e","integrity":"sha256-eIV+lqxbSUeKSVePQiq+IXr57X2Q+i0IrnKmfeT2mZ4="},"flags/4x3/cw-c65dd455b3c113d9088e563033c5f1ed3945d6dd88c8f13317fe297fd2291776.svg":{"logical_path":"flags/4x3/cw.svg","mtime":"2017-10-08T14:45:34+02:00","size":705,"digest":"c65dd455b3c113d9088e563033c5f1ed3945d6dd88c8f13317fe297fd2291776","integrity":"sha256-xl3UVbPBE9kIjlYwM8Xx7TlF1t2IyPEzF/4pf9IpF3Y="},"flags/1x1/cw-61f38f9076443eb7ca682abc21e6ea5f170bd855813d7297d85602b76ca36171.svg":{"logical_path":"flags/1x1/cw.svg","mtime":"2017-10-08T14:45:34+02:00","size":711,"digest":"61f38f9076443eb7ca682abc21e6ea5f170bd855813d7297d85602b76ca36171","integrity":"sha256-YfOPkHZEPrfKaCq8IebqXxcL2FWBPXKX2FYCt2yjYXE="},"flags/4x3/cx-aecc7a8b4b84b9f00a63154b027cb8ec78bebcec33e756b5e95151efb43420f7.svg":{"logical_path":"flags/4x3/cx.svg","mtime":"2017-10-08T14:45:34+02:00","size":3488,"digest":"aecc7a8b4b84b9f00a63154b027cb8ec78bebcec33e756b5e95151efb43420f7","integrity":"sha256-rsx6i0uEufAKYxVLAny47Hi+vOwz51a16VFR77Q0IPc="},"flags/1x1/cx-c052a0033a120d56c108dc0a919c3fccb9d01a4b78f1f778e3f2973e96197868.svg":{"logical_path":"flags/1x1/cx.svg","mtime":"2017-10-08T14:45:34+02:00","size":3504,"digest":"c052a0033a120d56c108dc0a919c3fccb9d01a4b78f1f778e3f2973e96197868","integrity":"sha256-wFKgAzoSDVbBCNwKkZw/zLnQGkt48fd44/KXPpYZeGg="},"flags/4x3/cy-b8e0d56b75e0954429cb2253aaf289a83e3c72abd52b4132bdd4016f2bbd43c9.svg":{"logical_path":"flags/4x3/cy.svg","mtime":"2017-10-08T14:45:34+02:00","size":10069,"digest":"b8e0d56b75e0954429cb2253aaf289a83e3c72abd52b4132bdd4016f2bbd43c9","integrity":"sha256-uODVa3XglUQpyyJTqvKJqD48cqvVK0EyvdQBbyu9Q8k="},"flags/1x1/cy-34aa50b77e1b86f5305beec283996cabc45fef1950582b868addc40fd9a8438f.svg":{"logical_path":"flags/1x1/cy.svg","mtime":"2017-10-08T14:45:34+02:00","size":10141,"digest":"34aa50b77e1b86f5305beec283996cabc45fef1950582b868addc40fd9a8438f","integrity":"sha256-NKpQt34bhvUwW+7Cg5lsq8Rf7xlQWCuGit3ED9moQ48="},"flags/4x3/cz-c2a15f3c50b7920c7d82fd9fb21f77c44fb3883f0e34dcf197a23d92d9212290.svg":{"logical_path":"flags/4x3/cz.svg","mtime":"2017-10-08T14:45:34+02:00","size":501,"digest":"c2a15f3c50b7920c7d82fd9fb21f77c44fb3883f0e34dcf197a23d92d9212290","integrity":"sha256-wqFfPFC3kgx9gv2fsh93xE+ziD8ONNzxl6I9ktkhIpA="},"flags/1x1/cz-487367824632a5097e16d7ed1ffc7fe8e233f9e1af45522571e1d4da10de92c7.svg":{"logical_path":"flags/1x1/cz.svg","mtime":"2017-10-08T14:45:34+02:00","size":505,"digest":"487367824632a5097e16d7ed1ffc7fe8e233f9e1af45522571e1d4da10de92c7","integrity":"sha256-SHNngkYypQl+FtftH/x/6OIz+eGvRVIlceHU2hDeksc="},"flags/4x3/de-32f54fb46c7fcaf2dfcf9172273456ea57f975efb228860def92481efe51c506.svg":{"logical_path":"flags/4x3/de.svg","mtime":"2017-10-08T14:45:34+02:00","size":290,"digest":"32f54fb46c7fcaf2dfcf9172273456ea57f975efb228860def92481efe51c506","integrity":"sha256-MvVPtGx/yvLfz5FyJzRW6lf5de+yKIYN75JIHv5RxQY="},"flags/1x1/de-2c94f333afeb14810030d786620fc32e65ba79af53b1037192383823996bb77f.svg":{"logical_path":"flags/1x1/de.svg","mtime":"2017-10-08T14:45:34+02:00","size":315,"digest":"2c94f333afeb14810030d786620fc32e65ba79af53b1037192383823996bb77f","integrity":"sha256-LJTzM6/rFIEAMNeGYg/DLmW6ea9TsQNxkjg4I5lrt38="},"flags/4x3/dj-d84d938856e7b6bdf8d38413c84a6968f94dc2adb218f2a9fab3d703341efc33.svg":{"logical_path":"flags/4x3/dj.svg","mtime":"2017-10-08T14:45:34+02:00","size":641,"digest":"d84d938856e7b6bdf8d38413c84a6968f94dc2adb218f2a9fab3d703341efc33","integrity":"sha256-2E2TiFbntr3404QTyEppaPlNwq2yGPKp+rPXAzQe/DM="},"flags/1x1/dj-6960cafac7e0d593152b60988fd12f5d1bb95068bf055c638cb999459f932692.svg":{"logical_path":"flags/1x1/dj.svg","mtime":"2017-10-08T14:45:34+02:00","size":657,"digest":"6960cafac7e0d593152b60988fd12f5d1bb95068bf055c638cb999459f932692","integrity":"sha256-aWDK+sfg1ZMVK2CYj9EvXRu5UGi/BVxjjLmZRZ+TJpI="},"flags/4x3/dk-fdd09296ac803a8cf4066ff5488821458a9788985e3cc09356d4c4ef81959ecf.svg":{"logical_path":"flags/4x3/dk.svg","mtime":"2017-10-08T14:45:34+02:00","size":249,"digest":"fdd09296ac803a8cf4066ff5488821458a9788985e3cc09356d4c4ef81959ecf","integrity":"sha256-/dCSlqyAOoz0Bm/1SIghRYqXiJhePMCTVtTE74GVns8="},"flags/1x1/dk-87924239a5ff1605582e1736f5ef17c9bd9d580d796d94b05ff668e2a52a223e.svg":{"logical_path":"flags/1x1/dk.svg","mtime":"2017-10-08T14:45:34+02:00","size":243,"digest":"87924239a5ff1605582e1736f5ef17c9bd9d580d796d94b05ff668e2a52a223e","integrity":"sha256-h5JCOaX/FgVYLhc29e8Xyb2dWA15bZSwX/Zo4qUqIj4="},"flags/4x3/dm-dc3b5c9634f0751ebfec181b12a7c530673ced1001b62a9126ed5ae39ba57203.svg":{"logical_path":"flags/4x3/dm.svg","mtime":"2017-10-08T14:45:34+02:00","size":20452,"digest":"dc3b5c9634f0751ebfec181b12a7c530673ced1001b62a9126ed5ae39ba57203","integrity":"sha256-3DtcljTwdR6/7BgbEqfFMGc87RABtiqRJu1a45ulcgM="},"flags/1x1/dm-c8018ea775b0add069f676bbf4b446ed19886c192aa742bb6a61c3602ca63211.svg":{"logical_path":"flags/1x1/dm.svg","mtime":"2017-10-08T14:45:34+02:00","size":20955,"digest":"c8018ea775b0add069f676bbf4b446ed19886c192aa742bb6a61c3602ca63211","integrity":"sha256-yAGOp3WwrdBp9na79LRG7RmIbBkqp0K7amHDYCymMhE="},"flags/4x3/do-5e2d6816118f78fa4a362ee6a276dac655a4c99d57a9e53a52198f1624ed186a.svg":{"logical_path":"flags/4x3/do.svg","mtime":"2017-10-08T14:45:34+02:00","size":466771,"digest":"5e2d6816118f78fa4a362ee6a276dac655a4c99d57a9e53a52198f1624ed186a","integrity":"sha256-Xi1oFhGPePpKNi7monbaxlWkyZ1XqeU6UhmPFiTtGGo="},"flags/1x1/do-f9862ff8016b35d30d5c37ac2c585cdddf235e56ac9a7ae31a90c96963865f57.svg":{"logical_path":"flags/1x1/do.svg","mtime":"2017-10-08T14:45:34+02:00","size":453664,"digest":"f9862ff8016b35d30d5c37ac2c585cdddf235e56ac9a7ae31a90c96963865f57","integrity":"sha256-+YYv+AFrNdMNXDesLFhc3d8jXlasmnrjGpDJaWOGX1c="},"flags/4x3/dz-8a14ddcb20a69c3265924fe2af141ea78c0af47ea07a88707c392a2793092cd4.svg":{"logical_path":"flags/4x3/dz.svg","mtime":"2017-10-08T14:45:34+02:00","size":313,"digest":"8a14ddcb20a69c3265924fe2af141ea78c0af47ea07a88707c392a2793092cd4","integrity":"sha256-ihTdyyCmnDJlkk/irxQep4wK9H6geohwfDkqJ5MJLNQ="},"flags/1x1/dz-0e2ada15ba7882343f7512929d3cf981a23a91817fdda0be1ed6a093161b649e.svg":{"logical_path":"flags/1x1/dz.svg","mtime":"2017-10-08T14:45:34+02:00","size":339,"digest":"0e2ada15ba7882343f7512929d3cf981a23a91817fdda0be1ed6a093161b649e","integrity":"sha256-DiraFbp4gjQ/dRKSnTz5gaI6kYF/3aC+HtagkxYbZJ4="},"flags/4x3/ec-a4c3c62b4272f5000e1c8f563c45ce8305ec71f4e4e49ac477d81b5cb692d7e6.svg":{"logical_path":"flags/4x3/ec.svg","mtime":"2017-10-08T14:45:34+02:00","size":38481,"digest":"a4c3c62b4272f5000e1c8f563c45ce8305ec71f4e4e49ac477d81b5cb692d7e6","integrity":"sha256-pMPGK0Jy9QAOHI9WPEXOgwXscfTk5JrEd9gbXLaS1+Y="},"flags/1x1/ec-c42aa1de56f2933fc6703e7a59ebc8b424c66f190697ee66814a137b56fa6969.svg":{"logical_path":"flags/1x1/ec.svg","mtime":"2017-10-08T14:45:34+02:00","size":39118,"digest":"c42aa1de56f2933fc6703e7a59ebc8b424c66f190697ee66814a137b56fa6969","integrity":"sha256-xCqh3lbykz/GcD56WevItCTGbxkGl+5mgUoTe1b6aWk="},"flags/4x3/ee-6148aad79adb1c847fedb9da5a7e9c9d47e99ef4c8f4853bb9800e738bddb19d.svg":{"logical_path":"flags/4x3/ee.svg","mtime":"2017-10-08T14:45:34+02:00","size":336,"digest":"6148aad79adb1c847fedb9da5a7e9c9d47e99ef4c8f4853bb9800e738bddb19d","integrity":"sha256-YUiq15rbHIR/7bnaWn6cnUfpnvTI9IU7uYAOc4vdsZ0="},"flags/1x1/ee-9a87370a85922c5d103d9d21fe3e778b801a62cf40e1f0efe8d708c5fe3b3ac4.svg":{"logical_path":"flags/1x1/ee.svg","mtime":"2017-10-08T14:45:34+02:00","size":371,"digest":"9a87370a85922c5d103d9d21fe3e778b801a62cf40e1f0efe8d708c5fe3b3ac4","integrity":"sha256-moc3CoWSLF0QPZ0h/j53i4AaYs9A4fDv6NcIxf47OsQ="},"flags/4x3/eg-3b2f122e512f0fc470666b35af4f677404d4b811cd795d5cf4e44a72ffd01285.svg":{"logical_path":"flags/4x3/eg.svg","mtime":"2017-10-08T14:45:34+02:00","size":16086,"digest":"3b2f122e512f0fc470666b35af4f677404d4b811cd795d5cf4e44a72ffd01285","integrity":"sha256-Oy8SLlEvD8RwZms1r09ndATUuBHNeV1c9ORKcv/QEoU="},"flags/1x1/eg-a050fc5953113bfa5e12867313b321df472eb86ad1e3d5362ebb27ac2edbd28b.svg":{"logical_path":"flags/1x1/eg.svg","mtime":"2017-10-08T14:45:34+02:00","size":16110,"digest":"a050fc5953113bfa5e12867313b321df472eb86ad1e3d5362ebb27ac2edbd28b","integrity":"sha256-oFD8WVMRO/peEoZzE7Mh30cuuGrR49U2LrsnrC7b0os="},"flags/4x3/eh-fea043048f74c728961fe981d7e5d50e286fef39f3e68659b699c6c357c202dd.svg":{"logical_path":"flags/4x3/eh.svg","mtime":"2017-10-08T14:45:34+02:00","size":1081,"digest":"fea043048f74c728961fe981d7e5d50e286fef39f3e68659b699c6c357c202dd","integrity":"sha256-/qBDBI90xyiWH+mB1+XVDihv7znz5oZZtpnGw1fCAt0="},"flags/1x1/eh-8ea23a1b6813465e739d6f5e2ca6727331fae96cd32c86041a1ba48926a14cfd.svg":{"logical_path":"flags/1x1/eh.svg","mtime":"2017-10-08T14:45:34+02:00","size":1028,"digest":"8ea23a1b6813465e739d6f5e2ca6727331fae96cd32c86041a1ba48926a14cfd","integrity":"sha256-jqI6G2gTRl5znW9eLKZyczH66WzTLIYEGhukiSahTP0="},"flags/4x3/er-b24dc54f7e94d0934d05faa7944e6039a56de8a5e4779a399046f047dbd1b949.svg":{"logical_path":"flags/4x3/er.svg","mtime":"2017-10-08T14:45:34+02:00","size":4800,"digest":"b24dc54f7e94d0934d05faa7944e6039a56de8a5e4779a399046f047dbd1b949","integrity":"sha256-sk3FT36U0JNNBfqnlE5gOaVt6KXkd5o5kEbwR9vRuUk="},"flags/1x1/er-6921f9776ece4a1b1ec594ec5665076462cef2d0b41eba83a7bc840ecf88287d.svg":{"logical_path":"flags/1x1/er.svg","mtime":"2017-10-08T14:45:34+02:00","size":4848,"digest":"6921f9776ece4a1b1ec594ec5665076462cef2d0b41eba83a7bc840ecf88287d","integrity":"sha256-aSH5d27OShsexZTsVmUHZGLO8tC0HrqDp7yEDs+IKH0="},"flags/4x3/es-e36093927dc1fa109e4ddcd4baa65d53d233c23bcdd32796b96409b52c5adbc0.svg":{"logical_path":"flags/4x3/es.svg","mtime":"2017-10-08T14:45:34+02:00","size":145208,"digest":"e36093927dc1fa109e4ddcd4baa65d53d233c23bcdd32796b96409b52c5adbc0","integrity":"sha256-42CTkn3B+hCeTdzUuqZdU9IzwjvN0yeWuWQJtSxa28A="},"flags/1x1/es-16a6c048523ee57edd91e60e87aae136a96893b48828d932a24436bb219c00b9.svg":{"logical_path":"flags/1x1/es.svg","mtime":"2017-10-08T14:45:34+02:00","size":147129,"digest":"16a6c048523ee57edd91e60e87aae136a96893b48828d932a24436bb219c00b9","integrity":"sha256-FqbASFI+5X7dkeYOh6rhNqlok7SIKNkyokQ2uyGcALk="},"flags/4x3/et-a3ef36d217667b7e8ebe910469c2eeef563f03d3ea5628ec7fea0f72650db28e.svg":{"logical_path":"flags/4x3/et.svg","mtime":"2017-10-08T14:45:34+02:00","size":1574,"digest":"a3ef36d217667b7e8ebe910469c2eeef563f03d3ea5628ec7fea0f72650db28e","integrity":"sha256-o+820hdme36OvpEEacLu71Y/A9PqVijsf+oPcmUNso4="},"flags/1x1/et-f66f415e5d5b8b697ed7bb85f4ae3408f9cefaeed7ff0136c4c03da5c3601340.svg":{"logical_path":"flags/1x1/et.svg","mtime":"2017-10-08T14:45:34+02:00","size":1595,"digest":"f66f415e5d5b8b697ed7bb85f4ae3408f9cefaeed7ff0136c4c03da5c3601340","integrity":"sha256-9m9BXl1bi2l+17uF9K40CPnO+u7X/wE2xMA9pcNgE0A="},"flags/4x3/fi-a94779c54a538d2f57a421e6beb619f07cc9c2bda40817d236b686deb8eb3b4c.svg":{"logical_path":"flags/4x3/fi.svg","mtime":"2017-10-08T14:45:34+02:00","size":265,"digest":"a94779c54a538d2f57a421e6beb619f07cc9c2bda40817d236b686deb8eb3b4c","integrity":"sha256-qUd5xUpTjS9XpCHmvrYZ8HzJwr2kCBfSNraG3rjrO0w="},"flags/1x1/fi-865b1ae3ed34a0cf0928c6289411569add2065c7ea4fa6897f971c322d955b16.svg":{"logical_path":"flags/1x1/fi.svg","mtime":"2017-10-08T14:45:34+02:00","size":265,"digest":"865b1ae3ed34a0cf0928c6289411569add2065c7ea4fa6897f971c322d955b16","integrity":"sha256-hlsa4+00oM8JKMYolBFWmt0gZcfqT6aJf5ccMi2VWxY="},"flags/4x3/fj-97dd8f9b0d9df1cd965c8a85ecb6feb538acc83b470596ccd199f71dc3d2eff9.svg":{"logical_path":"flags/4x3/fj.svg","mtime":"2017-10-08T14:45:34+02:00","size":44908,"digest":"97dd8f9b0d9df1cd965c8a85ecb6feb538acc83b470596ccd199f71dc3d2eff9","integrity":"sha256-l92Pmw2d8c2WXIqF7Lb+tTisyDtHBZbM0Zn3HcPS7/k="},"flags/1x1/fj-f772a5a860faef823adad1b0dc8e848349d094f4fa3b37e48c87382bd443c861.svg":{"logical_path":"flags/1x1/fj.svg","mtime":"2017-10-08T14:45:34+02:00","size":45010,"digest":"f772a5a860faef823adad1b0dc8e848349d094f4fa3b37e48c87382bd443c861","integrity":"sha256-93KlqGD674I62tGw3I6Eg0nQlPT6OzfkjIc4K9RDyGE="},"flags/4x3/fk-788901bf125ceebc6c23fa03c801420c787bbc4ce6aa4511ccaaba301e379886.svg":{"logical_path":"flags/4x3/fk.svg","mtime":"2017-10-08T14:45:34+02:00","size":44422,"digest":"788901bf125ceebc6c23fa03c801420c787bbc4ce6aa4511ccaaba301e379886","integrity":"sha256-eIkBvxJc7rxsI/oDyAFCDHh7vEzmqkURzKq6MB43mIY="},"flags/1x1/fk-5d8df0034167cc75863d02bfdb6147da3a694102f7eea0d92e717a048437fc0f.svg":{"logical_path":"flags/1x1/fk.svg","mtime":"2017-10-08T14:45:34+02:00","size":44641,"digest":"5d8df0034167cc75863d02bfdb6147da3a694102f7eea0d92e717a048437fc0f","integrity":"sha256-XY3wA0FnzHWGPQK/22FH2jppQQL37qDZLnF6BIQ3/A8="},"flags/4x3/fm-7167ec387c426a817bccbfec86c8f815b82b36504e1d480f4f9fa04177bdcba0.svg":{"logical_path":"flags/4x3/fm.svg","mtime":"2017-10-08T14:45:34+02:00","size":936,"digest":"7167ec387c426a817bccbfec86c8f815b82b36504e1d480f4f9fa04177bdcba0","integrity":"sha256-cWfsOHxCaoF7zL/shsj4FbgrNlBOHUgPT5+gQXe9y6A="},"flags/1x1/fm-d08e5959b5e3866cdf814f8d6ab594cb3ca84f0887a3adad3bff824ea0aca70a.svg":{"logical_path":"flags/1x1/fm.svg","mtime":"2017-10-08T14:45:34+02:00","size":941,"digest":"d08e5959b5e3866cdf814f8d6ab594cb3ca84f0887a3adad3bff824ea0aca70a","integrity":"sha256-0I5ZWbXjhmzfgU+NarWUyzyoTwiHo62tO/+CTqCspwo="},"flags/4x3/fo-af6148d661d02a6580e8714a6271776b4b8bf3b656bfd5fd88acdd1aa170366a.svg":{"logical_path":"flags/4x3/fo.svg","mtime":"2017-10-08T14:45:34+02:00","size":650,"digest":"af6148d661d02a6580e8714a6271776b4b8bf3b656bfd5fd88acdd1aa170366a","integrity":"sha256-r2FI1mHQKmWA6HFKYnF3a0uL87ZWv9X9iKzdGqFwNmo="},"flags/1x1/fo-26d5af2770c46935170988cbad16ef9aad9be34b38ea92847e6646a516878598.svg":{"logical_path":"flags/1x1/fo.svg","mtime":"2017-10-08T14:45:34+02:00","size":589,"digest":"26d5af2770c46935170988cbad16ef9aad9be34b38ea92847e6646a516878598","integrity":"sha256-JtWvJ3DEaTUXCYjLrRbvmq2b40s46pKEfmZGpRaHhZg="},"flags/4x3/fr-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg":{"logical_path":"flags/4x3/fr.svg","mtime":"2017-10-08T14:45:34+02:00","size":313,"digest":"4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702","integrity":"sha256-ToxEbgMlcqLnTR/czsmjrpPWbcJJUu0vH+W9q2/vVwI="},"flags/1x1/fr-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/fr.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/ga-80f90062ef9aa4d236c81ec6c6c6e08058750794014bb93d8dbdc8e1684ca4fa.svg":{"logical_path":"flags/4x3/ga.svg","mtime":"2017-10-08T14:45:34+02:00","size":297,"digest":"80f90062ef9aa4d236c81ec6c6c6e08058750794014bb93d8dbdc8e1684ca4fa","integrity":"sha256-gPkAYu+apNI2yB7GxsbggFh1B5QBS7k9jb3I4WhMpPo="},"flags/1x1/ga-a66094862d24f29704c190fe42ff50820923f3940ff417f3e1623e9089b57eb9.svg":{"logical_path":"flags/1x1/ga.svg","mtime":"2017-10-08T14:45:34+02:00","size":328,"digest":"a66094862d24f29704c190fe42ff50820923f3940ff417f3e1623e9089b57eb9","integrity":"sha256-pmCUhi0k8pcEwZD+Qv9Qggkj85QP9Bfz4WI+kIm1frk="},"flags/4x3/gb-d85f0f149b4390bed6624bc30ca2cbfa37d394f14474fcf81d63363ad363e284.svg":{"logical_path":"flags/4x3/gb.svg","mtime":"2017-10-08T14:45:34+02:00","size":956,"digest":"d85f0f149b4390bed6624bc30ca2cbfa37d394f14474fcf81d63363ad363e284","integrity":"sha256-2F8PFJtDkL7WYkvDDKLL+jfTlPFEdPz4HWM2OtNj4oQ="},"flags/1x1/gb-2f0cc6ed1e8e9a7e56cafd3500585d685ae0c51abacddc52f750fb4d23f60b04.svg":{"logical_path":"flags/1x1/gb.svg","mtime":"2017-10-08T14:45:34+02:00","size":911,"digest":"2f0cc6ed1e8e9a7e56cafd3500585d685ae0c51abacddc52f750fb4d23f60b04","integrity":"sha256-LwzG7R6Omn5Wyv01AFhdaFrgxRq6zdxS91D7TSP2CwQ="},"flags/4x3/gd-51a8d53466df4426bec5fb202dd8f35239324b9c8b5256d38fe411c4b79945cb.svg":{"logical_path":"flags/4x3/gd.svg","mtime":"2017-10-08T14:45:34+02:00","size":1960,"digest":"51a8d53466df4426bec5fb202dd8f35239324b9c8b5256d38fe411c4b79945cb","integrity":"sha256-UajVNGbfRCa+xfsgLdjzUjkyS5yLUlbTj+QRxLeZRcs="},"flags/1x1/gd-9156f824a83004691a7a354e925bc1680b5cffe663bbfa37aa4609ff28148218.svg":{"logical_path":"flags/1x1/gd.svg","mtime":"2017-10-08T14:45:34+02:00","size":1872,"digest":"9156f824a83004691a7a354e925bc1680b5cffe663bbfa37aa4609ff28148218","integrity":"sha256-kVb4JKgwBGkaejVOklvBaAtc/+Zju/o3qkYJ/ygUghg="},"flags/4x3/ge-4ef2c8e6f371a711c61ac54d8d201a80aab53767cacc5322fb848cd3e38b00e7.svg":{"logical_path":"flags/4x3/ge.svg","mtime":"2017-10-08T14:45:34+02:00","size":2325,"digest":"4ef2c8e6f371a711c61ac54d8d201a80aab53767cacc5322fb848cd3e38b00e7","integrity":"sha256-TvLI5vNxpxHGGsVNjSAagKq1N2fKzFMi+4SM0+OLAOc="},"flags/1x1/ge-a3af8272a5fb63372705825519543e53269282c4800b70e6a93ba69674524eee.svg":{"logical_path":"flags/1x1/ge.svg","mtime":"2017-10-08T14:45:34+02:00","size":2263,"digest":"a3af8272a5fb63372705825519543e53269282c4800b70e6a93ba69674524eee","integrity":"sha256-o6+CcqX7YzcnBYJVGVQ+UyaSgsSAC3DmqTumlnRSTu4="},"flags/4x3/gf-c7d5ee882949b708641f99ec02edcc6b3b2362d393cc3869342442225be7cd3d.svg":{"logical_path":"flags/4x3/gf.svg","mtime":"2017-10-08T14:45:34+02:00","size":288,"digest":"c7d5ee882949b708641f99ec02edcc6b3b2362d393cc3869342442225be7cd3d","integrity":"sha256-x9XuiClJtwhkH5nsAu3MazsjYtOTzDhpNCRCIlvnzT0="},"flags/1x1/gf-b297e376fc00d3d7bfafd081766dafc4590f4ac4b71f53bc2bbdf2c028547920.svg":{"logical_path":"flags/1x1/gf.svg","mtime":"2017-10-08T14:45:34+02:00","size":292,"digest":"b297e376fc00d3d7bfafd081766dafc4590f4ac4b71f53bc2bbdf2c028547920","integrity":"sha256-spfjdvwA09e/r9CBdm2vxFkPSsS3H1O8K73ywChUeSA="},"flags/4x3/gg-e99b36723ffe04d7be392d612c76ef44e82bc84823d71793eb38e338116f0ee0.svg":{"logical_path":"flags/4x3/gg.svg","mtime":"2017-10-08T14:45:34+02:00","size":621,"digest":"e99b36723ffe04d7be392d612c76ef44e82bc84823d71793eb38e338116f0ee0","integrity":"sha256-6Zs2cj/+BNe+OS1hLHbvROgryEgj1xeT6zjjOBFvDuA="},"flags/1x1/gg-3f764a4568626d43f89b2b200dcbfe68de3093be418716549ab7c5c33f433d37.svg":{"logical_path":"flags/1x1/gg.svg","mtime":"2017-10-08T14:45:34+02:00","size":664,"digest":"3f764a4568626d43f89b2b200dcbfe68de3093be418716549ab7c5c33f433d37","integrity":"sha256-P3ZKRWhibUP4mysgDcv+aN4wk75BhxZUmrfFwz9DPTc="},"flags/4x3/gh-817c2eb8b3f7190647510371b2d38ad8e28e1348cb657e34778f970af5ca3868.svg":{"logical_path":"flags/4x3/gh.svg","mtime":"2017-10-08T14:45:34+02:00","size":312,"digest":"817c2eb8b3f7190647510371b2d38ad8e28e1348cb657e34778f970af5ca3868","integrity":"sha256-gXwuuLP3GQZHUQNxstOK2OKOE0jLZX40d4+XCvXKOGg="},"flags/1x1/gh-87a6486910cb62e58439da330c4270d1e2a0fd8e1ace80987c295971d15f9af3.svg":{"logical_path":"flags/1x1/gh.svg","mtime":"2017-10-08T14:45:34+02:00","size":332,"digest":"87a6486910cb62e58439da330c4270d1e2a0fd8e1ace80987c295971d15f9af3","integrity":"sha256-h6ZIaRDLYuWEOdozDEJw0eKg/Y4azoCYfClZcdFfmvM="},"flags/4x3/gi-52bfb6cd7cbebf1da96dfc6bf708d3b7239984d36400181ca4ac020081ae41b5.svg":{"logical_path":"flags/4x3/gi.svg","mtime":"2017-10-08T14:45:34+02:00","size":4125,"digest":"52bfb6cd7cbebf1da96dfc6bf708d3b7239984d36400181ca4ac020081ae41b5","integrity":"sha256-Ur+2zXy+vx2pbfxr9wjTtyOZhNNkABgcpKwCAIGuQbU="},"flags/1x1/gi-f7ebd8d36a5cb260392a92f10d8bc8d7cf11433fdce9474e08cc52a07dcd5258.svg":{"logical_path":"flags/1x1/gi.svg","mtime":"2017-10-08T14:45:34+02:00","size":4115,"digest":"f7ebd8d36a5cb260392a92f10d8bc8d7cf11433fdce9474e08cc52a07dcd5258","integrity":"sha256-9+vY02pcsmA5KpLxDYvI188RQz/c6UdOCMxSoH3NUlg="},"flags/4x3/gl-e031a722ec76e8262439e50a0dbba62f7b7bea020361f2bf4a9a49d6b59954a5.svg":{"logical_path":"flags/4x3/gl.svg","mtime":"2017-10-08T14:45:34+02:00","size":662,"digest":"e031a722ec76e8262439e50a0dbba62f7b7bea020361f2bf4a9a49d6b59954a5","integrity":"sha256-4DGnIux26CYkOeUKDbumL3t76gIDYfK/SppJ1rWZVKU="},"flags/1x1/gl-847b3362e50c1d74aeb01a5ea55cfa2950597cbbfa2377bd7cb70e273d4c57fb.svg":{"logical_path":"flags/1x1/gl.svg","mtime":"2017-10-08T14:45:34+02:00","size":511,"digest":"847b3362e50c1d74aeb01a5ea55cfa2950597cbbfa2377bd7cb70e273d4c57fb","integrity":"sha256-hHszYuUMHXSusBpepVz6KVBZfLv6I3e9fLcOJz1MV/s="},"flags/4x3/gm-a13d89d1cd66c77706dbaa380370ce3d62c0cf3219c287008759e823fd42a27c.svg":{"logical_path":"flags/4x3/gm.svg","mtime":"2017-10-08T14:45:34+02:00","size":558,"digest":"a13d89d1cd66c77706dbaa380370ce3d62c0cf3219c287008759e823fd42a27c","integrity":"sha256-oT2J0c1mx3cG26o4A3DOPWLAzzIZwocAh1noI/1Conw="},"flags/1x1/gm-4a4490e2aea203b32862d6e58bd02efc45d07a401684795ecae68ddb97756387.svg":{"logical_path":"flags/1x1/gm.svg","mtime":"2017-10-08T14:45:34+02:00","size":421,"digest":"4a4490e2aea203b32862d6e58bd02efc45d07a401684795ecae68ddb97756387","integrity":"sha256-SkSQ4q6iA7MoYtbli9Au/EXQekAWhHleyuaN25d1Y4c="},"flags/4x3/gn-cfa24192de905cc4a07dffb54ea252304bcffd387ce2d6dedae89b654486f286.svg":{"logical_path":"flags/4x3/gn.svg","mtime":"2017-10-08T14:45:34+02:00","size":310,"digest":"cfa24192de905cc4a07dffb54ea252304bcffd387ce2d6dedae89b654486f286","integrity":"sha256-z6JBkt6QXMSgff+1TqJSMEvP/Th84tbe2uibZUSG8oY="},"flags/1x1/gn-b50eaffe8a6fd16c9cf2c2d51adea53250b089f04ea701b8d5d812877de6d084.svg":{"logical_path":"flags/1x1/gn.svg","mtime":"2017-10-08T14:45:34+02:00","size":314,"digest":"b50eaffe8a6fd16c9cf2c2d51adea53250b089f04ea701b8d5d812877de6d084","integrity":"sha256-tQ6v/opv0Wyc8sLVGt6lMlCwifBOpwG41dgSh33m0IQ="},"flags/4x3/gp-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg":{"logical_path":"flags/4x3/gp.svg","mtime":"2017-10-08T14:45:34+02:00","size":313,"digest":"4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702","integrity":"sha256-ToxEbgMlcqLnTR/czsmjrpPWbcJJUu0vH+W9q2/vVwI="},"flags/1x1/gp-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/gp.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/gq-548afdaa6c448c6bec87c1e2148831c41f9a2f4f83922cf32e5a3904679d889d.svg":{"logical_path":"flags/4x3/gq.svg","mtime":"2017-10-08T14:45:34+02:00","size":6577,"digest":"548afdaa6c448c6bec87c1e2148831c41f9a2f4f83922cf32e5a3904679d889d","integrity":"sha256-VIr9qmxEjGvsh8HiFIgxxB+aL0+DkizzLlo5BGediJ0="},"flags/1x1/gq-28c6e2820b326370a489d4f9efaf258432fdabecb67e610ddd752ed0f0e8a8ce.svg":{"logical_path":"flags/1x1/gq.svg","mtime":"2017-10-08T14:45:34+02:00","size":8200,"digest":"28c6e2820b326370a489d4f9efaf258432fdabecb67e610ddd752ed0f0e8a8ce","integrity":"sha256-KMbiggsyY3CkidT5768lhDL9q+y2fmEN3XUu0PDoqM4="},"flags/4x3/gr-e2aa8c913feebbed26a8fa0de5ac4aeb51545a4c0dee9bfda4ec5d9673f96386.svg":{"logical_path":"flags/4x3/gr.svg","mtime":"2017-10-08T14:45:34+02:00","size":819,"digest":"e2aa8c913feebbed26a8fa0de5ac4aeb51545a4c0dee9bfda4ec5d9673f96386","integrity":"sha256-4qqMkT/uu+0mqPoN5axK61FUWkwN7pv9pOxdlnP5Y4Y="},"flags/1x1/gr-64dc4363c7c3b827adaa7cd51bb8a0f30bd0a547e86772c473d433b1a6033e2f.svg":{"logical_path":"flags/1x1/gr.svg","mtime":"2017-10-08T14:45:34+02:00","size":876,"digest":"64dc4363c7c3b827adaa7cd51bb8a0f30bd0a547e86772c473d433b1a6033e2f","integrity":"sha256-ZNxDY8fDuCetqnzVG7ig8wvQpUfoZ3LEc9QzsaYDPi8="},"flags/4x3/gs-83141fac364fa2871379c6b1cb8da9935a185bf9b0e5dafc6b6458fa13359589.svg":{"logical_path":"flags/4x3/gs.svg","mtime":"2017-10-08T14:45:34+02:00","size":46535,"digest":"83141fac364fa2871379c6b1cb8da9935a185bf9b0e5dafc6b6458fa13359589","integrity":"sha256-gxQfrDZPoocTecaxy42pk1oYW/mw5dr8a2RY+hM1lYk="},"flags/1x1/gs-31c9e0016c7bd2cfed68cc4e6c2ca73123ce9391e8a50804e5c74101b72e07cc.svg":{"logical_path":"flags/1x1/gs.svg","mtime":"2017-10-08T14:45:34+02:00","size":47063,"digest":"31c9e0016c7bd2cfed68cc4e6c2ca73123ce9391e8a50804e5c74101b72e07cc","integrity":"sha256-McngAWx70s/taMxObCynMSPOk5HopQgE5cdBAbcuB8w="},"flags/4x3/gt-b4ca8c4ed71131c43ba14f3631a0ee92dababef325bd698ee0bac0da84980c85.svg":{"logical_path":"flags/4x3/gt.svg","mtime":"2017-10-08T14:45:34+02:00","size":59566,"digest":"b4ca8c4ed71131c43ba14f3631a0ee92dababef325bd698ee0bac0da84980c85","integrity":"sha256-tMqMTtcRMcQ7oU82MaDuktq6vvMlvWmO4LrA2oSYDIU="},"flags/1x1/gt-a7ce73eaabe1b659b733691076f8455051951432a1fac682f5896f8c4af6ff69.svg":{"logical_path":"flags/1x1/gt.svg","mtime":"2017-10-08T14:45:34+02:00","size":59566,"digest":"a7ce73eaabe1b659b733691076f8455051951432a1fac682f5896f8c4af6ff69","integrity":"sha256-p85z6qvhtlm3M2kQdvhFUFGVFDKh+saC9YlvjEr2/2k="},"flags/4x3/gu-a71a2e02c06f22984e424d15a410d9261ec9ddeeb3df112d5f46b66a09f5bd9a.svg":{"logical_path":"flags/4x3/gu.svg","mtime":"2017-10-08T14:45:34+02:00","size":6350,"digest":"a71a2e02c06f22984e424d15a410d9261ec9ddeeb3df112d5f46b66a09f5bd9a","integrity":"sha256-pxouAsBvIphOQk0VpBDZJh7J3e6z3xEtX0a2agn1vZo="},"flags/1x1/gu-2156b3d721b79189d40c7f5b5de9e219f83a40b69e0a3855514a097fcdc2f2d2.svg":{"logical_path":"flags/1x1/gu.svg","mtime":"2017-10-08T14:45:34+02:00","size":6066,"digest":"2156b3d721b79189d40c7f5b5de9e219f83a40b69e0a3855514a097fcdc2f2d2","integrity":"sha256-IVaz1yG3kYnUDH9bXeniGfg6QLaeCjhVUUoJf83C8tI="},"flags/4x3/gw-9eba06bd7c024dbd764b1bc1360120ed8a280d59075f81a50994930534cc42f2.svg":{"logical_path":"flags/4x3/gw.svg","mtime":"2017-10-08T14:45:34+02:00","size":828,"digest":"9eba06bd7c024dbd764b1bc1360120ed8a280d59075f81a50994930534cc42f2","integrity":"sha256-nroGvXwCTb12SxvBNgEg7YooDVkHX4GlCZSTBTTMQvI="},"flags/1x1/gw-6c4ca99e9871a9cde81966aaf02aac0106e2210f9c64e94bdb5168c7abbbc0e6.svg":{"logical_path":"flags/1x1/gw.svg","mtime":"2017-10-08T14:45:34+02:00","size":840,"digest":"6c4ca99e9871a9cde81966aaf02aac0106e2210f9c64e94bdb5168c7abbbc0e6","integrity":"sha256-bEypnphxqc3oGWaq8CqsAQbiIQ+cZOlL21Fox6u7wOY="},"flags/4x3/gy-b6f25e30b463f760ea01c81ff88a3932bf6812e6b626fd7fbe711a4cbac246c6.svg":{"logical_path":"flags/4x3/gy.svg","mtime":"2017-10-08T14:45:34+02:00","size":573,"digest":"b6f25e30b463f760ea01c81ff88a3932bf6812e6b626fd7fbe711a4cbac246c6","integrity":"sha256-tvJeMLRj92DqAcgf+Io5Mr9oEua2Jv1/vnEaTLrCRsY="},"flags/1x1/gy-d82b2a81ce6cca3e7c5854a5bc1198224b6455eab7adf06d69822a3cf433a1d2.svg":{"logical_path":"flags/1x1/gy.svg","mtime":"2017-10-08T14:45:34+02:00","size":573,"digest":"d82b2a81ce6cca3e7c5854a5bc1198224b6455eab7adf06d69822a3cf433a1d2","integrity":"sha256-2Csqgc5syj58WFSlvBGYIktkVeq3rfBtaYIqPPQzodI="},"flags/4x3/hk-b69c165653e2d112296b963d3369a7d8f656e77432c6c1c5ac1485db077c80a0.svg":{"logical_path":"flags/4x3/hk.svg","mtime":"2017-10-08T14:45:34+02:00","size":4540,"digest":"b69c165653e2d112296b963d3369a7d8f656e77432c6c1c5ac1485db077c80a0","integrity":"sha256-tpwWVlPi0RIpa5Y9M2mn2PZW53QyxsHFrBSF2wd8gKA="},"flags/1x1/hk-09c50dc6f3b0d5bffbc85a2998c5c86da531a939cf48c07ddb644061ab0b2222.svg":{"logical_path":"flags/1x1/hk.svg","mtime":"2017-10-08T14:45:34+02:00","size":4601,"digest":"09c50dc6f3b0d5bffbc85a2998c5c86da531a939cf48c07ddb644061ab0b2222","integrity":"sha256-CcUNxvOw1b/7yFopmMXIbaUxqTnPSMB922RAYasLIiI="},"flags/4x3/hm-faf74b1cde15843a42becf5d05a373f9af8d867d68c824e80d2c41b48c23ea57.svg":{"logical_path":"flags/4x3/hm.svg","mtime":"2017-10-08T14:45:34+02:00","size":1814,"digest":"faf74b1cde15843a42becf5d05a373f9af8d867d68c824e80d2c41b48c23ea57","integrity":"sha256-+vdLHN4VhDpCvs9dBaNz+a+Nhn1oyCToDSxBtIwj6lc="},"flags/1x1/hm-6cc1243d9638246c1bac7e52287dcfc6f9b00d142105fcfc9e8b7b3405d4852f.svg":{"logical_path":"flags/1x1/hm.svg","mtime":"2017-10-08T14:45:34+02:00","size":1772,"digest":"6cc1243d9638246c1bac7e52287dcfc6f9b00d142105fcfc9e8b7b3405d4852f","integrity":"sha256-bMEkPZY4JGwbrH5SKH3PxvmwDRQhBfz8not7NAXUhS8="},"flags/4x3/hn-3ad02422915a4ac6a81c3249610cbd42638ebe27d412a2d490bc63e75e1028ea.svg":{"logical_path":"flags/4x3/hn.svg","mtime":"2017-10-08T14:45:34+02:00","size":1141,"digest":"3ad02422915a4ac6a81c3249610cbd42638ebe27d412a2d490bc63e75e1028ea","integrity":"sha256-OtAkIpFaSsaoHDJJYQy9QmOOvifUEqLUkLxj514QKOo="},"flags/1x1/hn-f0be4d00b892418864d0e4cd3000ee2dc519dbb96d424cb42f55707f8999d44a.svg":{"logical_path":"flags/1x1/hn.svg","mtime":"2017-10-08T14:45:34+02:00","size":1144,"digest":"f0be4d00b892418864d0e4cd3000ee2dc519dbb96d424cb42f55707f8999d44a","integrity":"sha256-8L5NALiSQYhk0OTNMADuLcUZ27ltQky0L1Vwf4mZ1Eo="},"flags/4x3/hr-6671992f1644503121dce7774bf2f7e2ab65da14124251d80b024d78fb34f6f0.svg":{"logical_path":"flags/4x3/hr.svg","mtime":"2017-10-08T14:45:34+02:00","size":79805,"digest":"6671992f1644503121dce7774bf2f7e2ab65da14124251d80b024d78fb34f6f0","integrity":"sha256-ZnGZLxZEUDEh3Od3S/L34qtl2hQSQlHYCwJNePs09vA="},"flags/1x1/hr-f086b6932d53408f2b57db5e038dc7b508af60a49670e187eed42714f1115b49.svg":{"logical_path":"flags/1x1/hr.svg","mtime":"2017-10-08T14:45:34+02:00","size":80065,"digest":"f086b6932d53408f2b57db5e038dc7b508af60a49670e187eed42714f1115b49","integrity":"sha256-8Ia2ky1TQI8rV9teA43HtQivYKSWcOGH7tQnFPERW0k="},"flags/4x3/ht-0c3452573c61366d1e9d647d61675d2e9a309312e63c649f98d73fe37d2aab4f.svg":{"logical_path":"flags/4x3/ht.svg","mtime":"2017-10-08T14:45:34+02:00","size":22536,"digest":"0c3452573c61366d1e9d647d61675d2e9a309312e63c649f98d73fe37d2aab4f","integrity":"sha256-DDRSVzxhNm0enWR9YWddLpowkxLmPGSfmNc/430qq08="},"flags/1x1/ht-80c212d49effab9e944de758c08cc296833bc2a04b3098e8ee58266657522fdc.svg":{"logical_path":"flags/1x1/ht.svg","mtime":"2017-10-08T14:45:34+02:00","size":22543,"digest":"80c212d49effab9e944de758c08cc296833bc2a04b3098e8ee58266657522fdc","integrity":"sha256-gMIS1J7/q56UTedYwIzCloM7wqBLMJjo7lgmZldSL9w="},"flags/4x3/hu-b48c8253bec6b4e08f8954a2955fdbc2311d254b51358770d3eaec5fe0875965.svg":{"logical_path":"flags/4x3/hu.svg","mtime":"2017-10-08T14:45:34+02:00","size":328,"digest":"b48c8253bec6b4e08f8954a2955fdbc2311d254b51358770d3eaec5fe0875965","integrity":"sha256-tIyCU77GtOCPiVSilV/bwjEdJUtRNYdw0+rsX+CHWWU="},"flags/1x1/hu-af59966ca652f5ba1d081af0c1c2343acb479d1a06e03d248bde266cb29aa931.svg":{"logical_path":"flags/1x1/hu.svg","mtime":"2017-10-08T14:45:34+02:00","size":327,"digest":"af59966ca652f5ba1d081af0c1c2343acb479d1a06e03d248bde266cb29aa931","integrity":"sha256-r1mWbKZS9bodCBrwwcI0OstHnRoG4D0ki94mbLKaqTE="},"flags/4x3/id-e02525ae7152d4bd10dcad2ffdf0bf5d08c6c67d3142bc78a7cdbcaf1fcd4a4a.svg":{"logical_path":"flags/4x3/id.svg","mtime":"2017-10-08T14:45:34+02:00","size":264,"digest":"e02525ae7152d4bd10dcad2ffdf0bf5d08c6c67d3142bc78a7cdbcaf1fcd4a4a","integrity":"sha256-4CUlrnFS1L0Q3K0v/fC/XQjGxn0xQrx4p828rx/NSko="},"flags/1x1/id-5b846f6ce4715ea50d4068d9941290229c1be67d619a978096eab2c612e9b297.svg":{"logical_path":"flags/1x1/id.svg","mtime":"2017-10-08T14:45:34+02:00","size":264,"digest":"5b846f6ce4715ea50d4068d9941290229c1be67d619a978096eab2c612e9b297","integrity":"sha256-W4RvbORxXqUNQGjZlBKQIpwb5n1hmpeAluqyxhLpspc="},"flags/4x3/ie-0e75a4c4027484997f14bd4c2529384ef6c621591908473ccbeda20381c05c93.svg":{"logical_path":"flags/4x3/ie.svg","mtime":"2017-10-08T14:45:34+02:00","size":333,"digest":"0e75a4c4027484997f14bd4c2529384ef6c621591908473ccbeda20381c05c93","integrity":"sha256-DnWkxAJ0hJl/FL1MJSk4TvbGIVkZCEc8y+2iA4HAXJM="},"flags/1x1/ie-6446113a9abff1feba085706937ff83d73ba310c78153e8da3ca2d6f0c529510.svg":{"logical_path":"flags/1x1/ie.svg","mtime":"2017-10-08T14:45:34+02:00","size":329,"digest":"6446113a9abff1feba085706937ff83d73ba310c78153e8da3ca2d6f0c529510","integrity":"sha256-ZEYROpq/8f66CFcGk3/4PXO6MQx4FT6No8otbwxSlRA="},"flags/4x3/il-98c3c0d9628008ac3a947d8f10fcb01d8e2545dfb265e94e6a29910e1ba57a2d.svg":{"logical_path":"flags/4x3/il.svg","mtime":"2017-10-08T14:45:34+02:00","size":1046,"digest":"98c3c0d9628008ac3a947d8f10fcb01d8e2545dfb265e94e6a29910e1ba57a2d","integrity":"sha256-mMPA2WKACKw6lH2PEPywHY4lRd+yZelOaimRDhulei0="},"flags/1x1/il-0f95bc7892bcf9eb3b6af9bf930e803b5121c45fa7261874ab4d7a8542c20c45.svg":{"logical_path":"flags/1x1/il.svg","mtime":"2017-10-08T14:45:34+02:00","size":993,"digest":"0f95bc7892bcf9eb3b6af9bf930e803b5121c45fa7261874ab4d7a8542c20c45","integrity":"sha256-D5W8eJK8+es7avm/kw6AO1EhxF+nJhh0q016hULCDEU="},"flags/4x3/im-0c402e364a705500028c46ccbd78a29944e91103b490607b366ae1d4f221ffc0.svg":{"logical_path":"flags/4x3/im.svg","mtime":"2017-10-08T14:45:34+02:00","size":15257,"digest":"0c402e364a705500028c46ccbd78a29944e91103b490607b366ae1d4f221ffc0","integrity":"sha256-DEAuNkpwVQACjEbMvXiimUTpEQO0kGB7Nmrh1PIh/8A="},"flags/1x1/im-718f45e1c60fd42db2a814bfaaa3a9be828f4dd0e4a4aea49e021f066087dece.svg":{"logical_path":"flags/1x1/im.svg","mtime":"2017-10-08T14:45:34+02:00","size":15596,"digest":"718f45e1c60fd42db2a814bfaaa3a9be828f4dd0e4a4aea49e021f066087dece","integrity":"sha256-cY9F4cYP1C2yqBS/qqOpvoKPTdDkpK6kngIfBmCH3s4="},"flags/4x3/in-a6c958c4b5cb12e2392d81b11dd0fed5fd5d0a66c7decb3ad3c8d27175854d3c.svg":{"logical_path":"flags/4x3/in.svg","mtime":"2017-10-08T14:45:34+02:00","size":1092,"digest":"a6c958c4b5cb12e2392d81b11dd0fed5fd5d0a66c7decb3ad3c8d27175854d3c","integrity":"sha256-pslYxLXLEuI5LYGxHdD+1f1dCmbH3ss608jScXWFTTw="},"flags/1x1/in-b4163420567e8e04fa58b79688af8d7bacf32ddf0e2b63ae2f1c5f0aacaaa696.svg":{"logical_path":"flags/1x1/in.svg","mtime":"2017-10-08T14:45:34+02:00","size":1114,"digest":"b4163420567e8e04fa58b79688af8d7bacf32ddf0e2b63ae2f1c5f0aacaaa696","integrity":"sha256-tBY0IFZ+jgT6WLeWiK+Ne6zzLd8OK2OuLxxfCqyqppY="},"flags/4x3/io-b951cf1fa71ddae941ee31dd018d2593bb8621ff92508bb311c7362c537a474c.svg":{"logical_path":"flags/4x3/io.svg","mtime":"2017-10-08T14:45:34+02:00","size":36459,"digest":"b951cf1fa71ddae941ee31dd018d2593bb8621ff92508bb311c7362c537a474c","integrity":"sha256-uVHPH6cd2ulB7jHdAY0lk7uGIf+SUIuzEcc2LFN6R0w="},"flags/1x1/io-d9dfc871f0bca35430b17de2e55394b0145334aa2080e07856e21d6d2e007d8d.svg":{"logical_path":"flags/1x1/io.svg","mtime":"2017-10-08T14:45:34+02:00","size":36554,"digest":"d9dfc871f0bca35430b17de2e55394b0145334aa2080e07856e21d6d2e007d8d","integrity":"sha256-2d/IcfC8o1QwsX3i5VOUsBRTNKoggOB4VuIdbS4AfY0="},"flags/4x3/iq-6a74e49d2c3d0ff072086fba1a2fc8b948ca34891a3aca960f9daacec107bcc6.svg":{"logical_path":"flags/4x3/iq.svg","mtime":"2017-10-08T14:45:34+02:00","size":2305,"digest":"6a74e49d2c3d0ff072086fba1a2fc8b948ca34891a3aca960f9daacec107bcc6","integrity":"sha256-anTknSw9D/ByCG+6Gi/IuUjKNIkaOsqWD52qzsEHvMY="},"flags/1x1/iq-95f5be79b6ab86e6338abd39ef8499af1517dba8ec3b266ea8e3c954601f0bbb.svg":{"logical_path":"flags/1x1/iq.svg","mtime":"2017-10-08T14:45:34+02:00","size":2321,"digest":"95f5be79b6ab86e6338abd39ef8499af1517dba8ec3b266ea8e3c954601f0bbb","integrity":"sha256-lfW+ebarhuYzir0574SZrxUX26jsOyZuqOPJVGAfC7s="},"flags/4x3/ir-5f9fdfd2d4cad535338f6de7927cc8094d02eaf06dd5122d3cba9e859c9ec4df.svg":{"logical_path":"flags/4x3/ir.svg","mtime":"2017-10-08T14:45:34+02:00","size":21755,"digest":"5f9fdfd2d4cad535338f6de7927cc8094d02eaf06dd5122d3cba9e859c9ec4df","integrity":"sha256-X5/f0tTK1TUzj23nknzICU0C6vBt1RItPLqehZyexN8="},"flags/1x1/ir-f5367274525b1f050dfae895943620a2e711f63a5726b273b488721a4501465d.svg":{"logical_path":"flags/1x1/ir.svg","mtime":"2017-10-08T14:45:34+02:00","size":21479,"digest":"f5367274525b1f050dfae895943620a2e711f63a5726b273b488721a4501465d","integrity":"sha256-9TZydFJbHwUN+uiVlDYgoucR9jpXJrJztIhyGkUBRl0="},"flags/4x3/is-15409efb6cec16b490b4abbbc03db415ef3448cb8cb281dd7cd1b2ba496d534d.svg":{"logical_path":"flags/4x3/is.svg","mtime":"2017-10-08T14:45:34+02:00","size":562,"digest":"15409efb6cec16b490b4abbbc03db415ef3448cb8cb281dd7cd1b2ba496d534d","integrity":"sha256-FUCe+2zsFrSQtKu7wD20Fe80SMuMsoHdfNGyukltU00="},"flags/1x1/is-500c3ef83fe917ab9cad59b7e8e6d693d9e78876febc1882c4bb06c8876b7357.svg":{"logical_path":"flags/1x1/is.svg","mtime":"2017-10-08T14:45:34+02:00","size":543,"digest":"500c3ef83fe917ab9cad59b7e8e6d693d9e78876febc1882c4bb06c8876b7357","integrity":"sha256-UAw++D/pF6ucrVm36ObWk9nniHb+vBiCxLsGyIdrc1c="},"flags/4x3/it-a285a0e341ba9492a2b7478e8a7a13f7c76d3c6a581aafb965ea26e1c554f0f3.svg":{"logical_path":"flags/4x3/it.svg","mtime":"2017-10-08T14:45:34+02:00","size":329,"digest":"a285a0e341ba9492a2b7478e8a7a13f7c76d3c6a581aafb965ea26e1c554f0f3","integrity":"sha256-ooWg40G6lJKit0eOinoT98dtPGpYGq+5Zeom4cVU8PM="},"flags/1x1/it-eeb47e346a5f6124b34f8428c97fc7dab2726f8d36d62dec08df3ec7171353cd.svg":{"logical_path":"flags/1x1/it.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"eeb47e346a5f6124b34f8428c97fc7dab2726f8d36d62dec08df3ec7171353cd","integrity":"sha256-7rR+NGpfYSSzT4QoyX/H2rJyb4021i3sCN8+xxcTU80="},"flags/4x3/je-b611f3e0fb7a94f85fa7d5f6f7a7db839381d054eb92abe0856dda8218c40687.svg":{"logical_path":"flags/4x3/je.svg","mtime":"2017-10-08T14:45:34+02:00","size":7509,"digest":"b611f3e0fb7a94f85fa7d5f6f7a7db839381d054eb92abe0856dda8218c40687","integrity":"sha256-thHz4Pt6lPhfp9X296fbg5OB0FTrkqvghW3aghjEBoc="},"flags/1x1/je-39c0c1482c1c533366153edc873f5eae266fdbf591e2022a7f82c17ce2d676ef.svg":{"logical_path":"flags/1x1/je.svg","mtime":"2017-10-08T14:45:34+02:00","size":7477,"digest":"39c0c1482c1c533366153edc873f5eae266fdbf591e2022a7f82c17ce2d676ef","integrity":"sha256-OcDBSCwcUzNmFT7chz9eriZv2/WR4gIqf4LBfOLWdu8="},"flags/4x3/jm-62fcbb8ed5b923b6aafe3990a24ad571485b4ac8db1bd7ed7b200cfadeeb8d7f.svg":{"logical_path":"flags/4x3/jm.svg","mtime":"2017-10-08T14:45:34+02:00","size":417,"digest":"62fcbb8ed5b923b6aafe3990a24ad571485b4ac8db1bd7ed7b200cfadeeb8d7f","integrity":"sha256-Yvy7jtW5I7aq/jmQokrVcUhbSsjbG9fteyAM+t7rjX8="},"flags/1x1/jm-b57cb61fb8eb67f0887afb7c779d6033e1c4c10242662093df69496aa58cc464.svg":{"logical_path":"flags/1x1/jm.svg","mtime":"2017-10-08T14:45:34+02:00","size":488,"digest":"b57cb61fb8eb67f0887afb7c779d6033e1c4c10242662093df69496aa58cc464","integrity":"sha256-tXy2H7jrZ/CIevt8d51gM+HEwQJCZiCT32lJaqWMxGQ="},"flags/4x3/jo-8e1174e66beeec19016b2754e8bdae987f420fa937ba78efecd61c177d9d40dc.svg":{"logical_path":"flags/4x3/jo.svg","mtime":"2017-10-08T14:45:34+02:00","size":835,"digest":"8e1174e66beeec19016b2754e8bdae987f420fa937ba78efecd61c177d9d40dc","integrity":"sha256-jhF05mvu7BkBaydU6L2umH9CD6k3unjv7NYcF32dQNw="},"flags/1x1/jo-47d2fc18e8af9194bcb249161a10383f89c11a73148b6dc77f4ab47a90294ae1.svg":{"logical_path":"flags/1x1/jo.svg","mtime":"2017-10-08T14:45:34+02:00","size":767,"digest":"47d2fc18e8af9194bcb249161a10383f89c11a73148b6dc77f4ab47a90294ae1","integrity":"sha256-R9L8GOivkZS8skkWGhA4P4nBGnMUi23Hf0q0epApSuE="},"flags/4x3/jp-1785964f1f3a4346ab8e1cbdc211399c5ced34a566c4725f3d23e8105413d6f4.svg":{"logical_path":"flags/4x3/jp.svg","mtime":"2017-10-08T14:45:34+02:00","size":513,"digest":"1785964f1f3a4346ab8e1cbdc211399c5ced34a566c4725f3d23e8105413d6f4","integrity":"sha256-F4WWTx86Q0arjhy9whE5nFztNKVmxHJfPSPoEFQT1vQ="},"flags/1x1/jp-a71cace9d237527635ee960b4df645f202d630c46458cf7e7a7ac09659e4404f.svg":{"logical_path":"flags/1x1/jp.svg","mtime":"2017-10-08T14:45:34+02:00","size":526,"digest":"a71cace9d237527635ee960b4df645f202d630c46458cf7e7a7ac09659e4404f","integrity":"sha256-pxys6dI3UnY17pYLTfZF8gLWMMRkWM9+enrAllnkQE8="},"flags/4x3/ke-680e981e37f7f0497e148043390987748a5bc78f4c3af09cf58c61d42b2a4a24.svg":{"logical_path":"flags/4x3/ke.svg","mtime":"2017-10-08T14:45:34+02:00","size":1432,"digest":"680e981e37f7f0497e148043390987748a5bc78f4c3af09cf58c61d42b2a4a24","integrity":"sha256-aA6YHjf38El+FIBDOQmHdIpbx49MOvCc9Yxh1CsqSiQ="},"flags/1x1/ke-60ff7f8bf6b5da9182867b8200475cb0a87f80cc960643ee15c99bcdcf200654.svg":{"logical_path":"flags/1x1/ke.svg","mtime":"2017-10-08T14:45:34+02:00","size":1570,"digest":"60ff7f8bf6b5da9182867b8200475cb0a87f80cc960643ee15c99bcdcf200654","integrity":"sha256-YP9/i/a12pGChnuCAEdcsKh/gMyWBkPuFcmbzc8gBlQ="},"flags/4x3/kg-3a93d17f0ed778664ae760032710fd7235bc43090de3543ec50fb8d2dfd9b595.svg":{"logical_path":"flags/4x3/kg.svg","mtime":"2017-10-08T14:45:34+02:00","size":5088,"digest":"3a93d17f0ed778664ae760032710fd7235bc43090de3543ec50fb8d2dfd9b595","integrity":"sha256-OpPRfw7XeGZK52ADJxD9cjW8QwkN41Q+xQ+40t/ZtZU="},"flags/1x1/kg-165c50f348fe0d4d8f0bc9cbf2666acde0f3a81dfed3398b8a7db5a51e3348aa.svg":{"logical_path":"flags/1x1/kg.svg","mtime":"2017-10-08T14:45:34+02:00","size":5012,"digest":"165c50f348fe0d4d8f0bc9cbf2666acde0f3a81dfed3398b8a7db5a51e3348aa","integrity":"sha256-FlxQ80j+DU2PC8nL8mZqzeDzqB3+0zmLin21pR4zSKo="},"flags/4x3/kh-6f3eb3cb44cd8124f4b7cb0d9230ddab4f782ad10746c2e1fa73f54ca2fe4446.svg":{"logical_path":"flags/4x3/kh.svg","mtime":"2017-10-08T14:45:34+02:00","size":10798,"digest":"6f3eb3cb44cd8124f4b7cb0d9230ddab4f782ad10746c2e1fa73f54ca2fe4446","integrity":"sha256-bz6zy0TNgST0t8sNkjDdq094KtEHRsLh+nP1TKL+REY="},"flags/1x1/kh-9541bd094c9e79e8ebb77a8ba94b22ed079b0502b2d70769b89ac9d19d16781b.svg":{"logical_path":"flags/1x1/kh.svg","mtime":"2017-10-08T14:45:34+02:00","size":10800,"digest":"9541bd094c9e79e8ebb77a8ba94b22ed079b0502b2d70769b89ac9d19d16781b","integrity":"sha256-lUG9CUyeeejrt3qLqUsi7QebBQKy1wdpuJrJ0Z0WeBs="},"flags/4x3/ki-a1b39a59ce5be52e1c6ca618ccc97f47d2a7b0d652bc2e5814c30a13d03842b8.svg":{"logical_path":"flags/4x3/ki.svg","mtime":"2017-10-08T14:45:34+02:00","size":7537,"digest":"a1b39a59ce5be52e1c6ca618ccc97f47d2a7b0d652bc2e5814c30a13d03842b8","integrity":"sha256-obOaWc5b5S4cbKYYzMl/R9KnsNZSvC5YFMMKE9A4Qrg="},"flags/1x1/ki-e9e5127171d893619b247b605865507b61019dee9e6ea589c5cd0c0e7d513f22.svg":{"logical_path":"flags/1x1/ki.svg","mtime":"2017-10-08T14:45:34+02:00","size":7920,"digest":"e9e5127171d893619b247b605865507b61019dee9e6ea589c5cd0c0e7d513f22","integrity":"sha256-6eUScXHYk2GbJHtgWGVQe2EBne6ebqWJxc0MDn1RPyI="},"flags/4x3/km-2ad8132e636de92218e06cad237154128fd1e84dbed82610e138ea148a53c01a.svg":{"logical_path":"flags/4x3/km.svg","mtime":"2017-10-08T14:45:34+02:00","size":1297,"digest":"2ad8132e636de92218e06cad237154128fd1e84dbed82610e138ea148a53c01a","integrity":"sha256-KtgTLmNt6SIY4GytI3FUEo/R6E2+2CYQ4TjqFIpTwBo="},"flags/1x1/km-d9d978cca1790b3165a0d18e159a536b4a2405f12b0200b03cf721042d326089.svg":{"logical_path":"flags/1x1/km.svg","mtime":"2017-10-08T14:45:34+02:00","size":1244,"digest":"d9d978cca1790b3165a0d18e159a536b4a2405f12b0200b03cf721042d326089","integrity":"sha256-2dl4zKF5CzFloNGOFZpTa0okBfErAgCwPPchBC0yYIk="},"flags/4x3/kn-08b7f26ac06f65c797de647f61bb738a4212cfc9ceb53ef11d8db093b58386d1.svg":{"logical_path":"flags/4x3/kn.svg","mtime":"2017-10-08T14:45:34+02:00","size":968,"digest":"08b7f26ac06f65c797de647f61bb738a4212cfc9ceb53ef11d8db093b58386d1","integrity":"sha256-CLfyasBvZceX3mR/YbtzikISz8nOtT7xHY2wk7WDhtE="},"flags/1x1/kn-e632854084c163a1752b53117eb4f773e57eef231917db846fc8009541cfe4b9.svg":{"logical_path":"flags/1x1/kn.svg","mtime":"2017-10-08T14:45:34+02:00","size":957,"digest":"e632854084c163a1752b53117eb4f773e57eef231917db846fc8009541cfe4b9","integrity":"sha256-5jKFQITBY6F1K1MRfrT3c+V+7yMZF9uEb8gAlUHP5Lk="},"flags/4x3/kp-f073e224e1faff5a0bbcb51cd05288d1b13cb607dda42fc7702afe8cfb01d0b3.svg":{"logical_path":"flags/4x3/kp.svg","mtime":"2017-10-08T14:45:34+02:00","size":1002,"digest":"f073e224e1faff5a0bbcb51cd05288d1b13cb607dda42fc7702afe8cfb01d0b3","integrity":"sha256-8HPiJOH6/1oLvLUc0FKI0bE8tgfdpC/HcCr+jPsB0LM="},"flags/1x1/kp-504fc83119f2a2c34ac75051d3ce15edee6f93555d729d759ef15f5f5caab3d3.svg":{"logical_path":"flags/1x1/kp.svg","mtime":"2017-10-08T14:45:34+02:00","size":1002,"digest":"504fc83119f2a2c34ac75051d3ce15edee6f93555d729d759ef15f5f5caab3d3","integrity":"sha256-UE/IMRnyosNKx1BR084V7e5vk1Vdcp11nvFfX1yqs9M="},"flags/4x3/kr-dbe4354aefeb100e561ee6f6ea6cc46551c1722d1b75fc164b60b0592d9dc30d.svg":{"logical_path":"flags/4x3/kr.svg","mtime":"2017-10-08T14:45:34+02:00","size":2420,"digest":"dbe4354aefeb100e561ee6f6ea6cc46551c1722d1b75fc164b60b0592d9dc30d","integrity":"sha256-2+Q1Su/rEA5WHub26mzEZVHBci0bdfwWS2CwWS2dww0="},"flags/1x1/kr-3aefdef6c6b72177aea924981a673bcc58c24b8c98cb00960e23250c07766b63.svg":{"logical_path":"flags/1x1/kr.svg","mtime":"2017-10-08T14:45:34+02:00","size":2194,"digest":"3aefdef6c6b72177aea924981a673bcc58c24b8c98cb00960e23250c07766b63","integrity":"sha256-Ou/e9sa3IXeuqSSYGmc7zFjCS4yYywCWDiMlDAd2a2M="},"flags/4x3/kw-fc682de5f565e3a918a9cce44a87a0cd8a40b93a555be3dc7c381ced74853021.svg":{"logical_path":"flags/4x3/kw.svg","mtime":"2017-10-08T14:45:34+02:00","size":515,"digest":"fc682de5f565e3a918a9cce44a87a0cd8a40b93a555be3dc7c381ced74853021","integrity":"sha256-/Ggt5fVl46kYqczkSoegzYpAuTpVW+PcfDgc7XSFMCE="},"flags/1x1/kw-63c2078d09713c30c0b917fdaac63a1fdb9161ec4b8cf1e91d4a9a8730a5cb65.svg":{"logical_path":"flags/1x1/kw.svg","mtime":"2017-10-08T14:45:34+02:00","size":529,"digest":"63c2078d09713c30c0b917fdaac63a1fdb9161ec4b8cf1e91d4a9a8730a5cb65","integrity":"sha256-Y8IHjQlxPDDAuRf9qsY6H9uRYexLjPHpHUqahzCly2U="},"flags/4x3/ky-77da018be33fa8aec69147e6107ff363bfc467ba857e7d47bd383984305cebab.svg":{"logical_path":"flags/4x3/ky.svg","mtime":"2017-10-08T14:45:34+02:00","size":33338,"digest":"77da018be33fa8aec69147e6107ff363bfc467ba857e7d47bd383984305cebab","integrity":"sha256-d9oBi+M/qK7GkUfmEH/zY7/EZ7qFfn1HvTg5hDBc66s="},"flags/1x1/ky-4a6b098e38d727959969a977668aefbdf6b9adcaef4cd922aac232d64a8a9d75.svg":{"logical_path":"flags/1x1/ky.svg","mtime":"2017-10-08T14:45:34+02:00","size":33549,"digest":"4a6b098e38d727959969a977668aefbdf6b9adcaef4cd922aac232d64a8a9d75","integrity":"sha256-SmsJjjjXJ5WZaal3Zorvvfa5rcrvTNkiqsIy1kqKnXU="},"flags/4x3/kz-ce3998065f1b6242d0a1755ffb590f15b2ff477b594b26b9a497f7181304bbe3.svg":{"logical_path":"flags/4x3/kz.svg","mtime":"2017-10-08T14:45:34+02:00","size":17502,"digest":"ce3998065f1b6242d0a1755ffb590f15b2ff477b594b26b9a497f7181304bbe3","integrity":"sha256-zjmYBl8bYkLQoXVf+1kPFbL/R3tZSya5pJf3GBMEu+M="},"flags/1x1/kz-795fd9bf32b68805f9e80f120db569eacbd5727fc523d7ff89943bdf9ef5b1e9.svg":{"logical_path":"flags/1x1/kz.svg","mtime":"2017-10-08T14:45:34+02:00","size":17476,"digest":"795fd9bf32b68805f9e80f120db569eacbd5727fc523d7ff89943bdf9ef5b1e9","integrity":"sha256-eV/ZvzK2iAX56A8SDbVp6svVcn/FI9f/iZQ73571sek="},"flags/4x3/la-dd2ead7123a2c4d2fda71d8a462319d30c6ff8e83c72cfd888230f6a670fdff4.svg":{"logical_path":"flags/4x3/la.svg","mtime":"2017-10-08T14:45:34+02:00","size":477,"digest":"dd2ead7123a2c4d2fda71d8a462319d30c6ff8e83c72cfd888230f6a670fdff4","integrity":"sha256-3S6tcSOixNL9px2KRiMZ0wxv+Og8cs/YiCMPamcP3/Q="},"flags/1x1/la-7ebc9f64aad0049a8167272ce06a7c1512c7d14080ff93a88e6b28e4050f33d3.svg":{"logical_path":"flags/1x1/la.svg","mtime":"2017-10-08T14:45:34+02:00","size":604,"digest":"7ebc9f64aad0049a8167272ce06a7c1512c7d14080ff93a88e6b28e4050f33d3","integrity":"sha256-fryfZKrQBJqBZycs4Gp8FRLH0UCA/5Oojmso5AUPM9M="},"flags/4x3/lb-7afb0e27b8cec77e2c65c3467b68ab24d49879a4739ab4780154a7db4358f6fc.svg":{"logical_path":"flags/4x3/lb.svg","mtime":"2017-10-08T14:45:34+02:00","size":3981,"digest":"7afb0e27b8cec77e2c65c3467b68ab24d49879a4739ab4780154a7db4358f6fc","integrity":"sha256-evsOJ7jOx34sZcNGe2irJNSYeaRzmrR4AVSn20NY9vw="},"flags/1x1/lb-6f50829425260779f08ad80ac9430796e64901b0dd74d010bdf2336f541eb47d.svg":{"logical_path":"flags/1x1/lb.svg","mtime":"2017-10-08T14:45:34+02:00","size":3991,"digest":"6f50829425260779f08ad80ac9430796e64901b0dd74d010bdf2336f541eb47d","integrity":"sha256-b1CClCUmB3nwitgKyUMHluZJAbDddNAQvfIzb1QetH0="},"flags/4x3/lc-9efcb3c88f9ff13bedcbd0c7f48c7fab604d3842ee559be3a11c6bc64e31a53c.svg":{"logical_path":"flags/4x3/lc.svg","mtime":"2017-10-08T14:45:34+02:00","size":403,"digest":"9efcb3c88f9ff13bedcbd0c7f48c7fab604d3842ee559be3a11c6bc64e31a53c","integrity":"sha256-nvyzyI+f8Tvty9DH9Ix/q2BNOELuVZvjoRxrxk4xpTw="},"flags/1x1/lc-31d72d1034bf031934561da9615fc3db916bb08a210f434a981e053a7edfa339.svg":{"logical_path":"flags/1x1/lc.svg","mtime":"2017-10-08T14:45:34+02:00","size":409,"digest":"31d72d1034bf031934561da9615fc3db916bb08a210f434a981e053a7edfa339","integrity":"sha256-MdctEDS/Axk0Vh2pYV/D25FrsIohD0NKmB4FOn7fozk="},"flags/4x3/li-9eed98d7d4e07cba0a2aae80e31add4bbe663e959df8cafd607cef17daf4351a.svg":{"logical_path":"flags/4x3/li.svg","mtime":"2017-10-08T14:45:34+02:00","size":12453,"digest":"9eed98d7d4e07cba0a2aae80e31add4bbe663e959df8cafd607cef17daf4351a","integrity":"sha256-nu2Y19TgfLoKKq6A4xrdS75mPpWd+Mr9YHzvF9r0NRo="},"flags/1x1/li-f655bf461c1690078c846528eb6d3ebe8d594b2539e3cc37f89204a754424c81.svg":{"logical_path":"flags/1x1/li.svg","mtime":"2017-10-08T14:45:34+02:00","size":12476,"digest":"f655bf461c1690078c846528eb6d3ebe8d594b2539e3cc37f89204a754424c81","integrity":"sha256-9lW/RhwWkAeMhGUo620+vo1ZSyU548w3+JIEp1RCTIE="},"flags/4x3/lk-3471b0585fb1e0ee350d6fe87e55ef07eef01e99444263b86ff005156dea1b73.svg":{"logical_path":"flags/4x3/lk.svg","mtime":"2017-10-08T14:45:34+02:00","size":17549,"digest":"3471b0585fb1e0ee350d6fe87e55ef07eef01e99444263b86ff005156dea1b73","integrity":"sha256-NHGwWF+x4O41DW/oflXvB+7wHplEQmO4b/AFFW3qG3M="},"flags/1x1/lk-d3bb56415e6e2095a470cf4e2ed455c57cde204aa79362786aca785db35ecff8.svg":{"logical_path":"flags/1x1/lk.svg","mtime":"2017-10-08T14:45:34+02:00","size":17573,"digest":"d3bb56415e6e2095a470cf4e2ed455c57cde204aa79362786aca785db35ecff8","integrity":"sha256-07tWQV5uIJWkcM9OLtRVxXzeIEqnk2J4asp4XbNez/g="},"flags/4x3/lr-a39f30a6169c4a3f3ff8e0eb04862e7f941c5d7c8e489ff5e7e4cd8cd436f5e2.svg":{"logical_path":"flags/4x3/lr.svg","mtime":"2017-10-08T14:45:34+02:00","size":829,"digest":"a39f30a6169c4a3f3ff8e0eb04862e7f941c5d7c8e489ff5e7e4cd8cd436f5e2","integrity":"sha256-o58wphacSj8/+ODrBIYuf5QcXXyOSJ/15+TNjNQ29eI="},"flags/1x1/lr-731191ad65bf784386cabac12693722d16aeb2e97d6456cc33488f805067aca8.svg":{"logical_path":"flags/1x1/lr.svg","mtime":"2017-10-08T14:45:34+02:00","size":801,"digest":"731191ad65bf784386cabac12693722d16aeb2e97d6456cc33488f805067aca8","integrity":"sha256-cxGRrWW/eEOGyrrBJpNyLRausul9ZFbMM0iPgFBnrKg="},"flags/4x3/ls-1e4f7ec2600e30b515cd12b509c376c3014d760731d89f87ae9a962fe249b3d4.svg":{"logical_path":"flags/4x3/ls.svg","mtime":"2017-10-08T14:45:34+02:00","size":1901,"digest":"1e4f7ec2600e30b515cd12b509c376c3014d760731d89f87ae9a962fe249b3d4","integrity":"sha256-Hk9+wmAOMLUVzRK1CcN2wwFNdgcx2J+HrpqWL+JJs9Q="},"flags/1x1/ls-ba2a8327ab9b0e74f4f411ab989980cde309e86395736a1f77e17a0eefc85266.svg":{"logical_path":"flags/1x1/ls.svg","mtime":"2017-10-08T14:45:34+02:00","size":1919,"digest":"ba2a8327ab9b0e74f4f411ab989980cde309e86395736a1f77e17a0eefc85266","integrity":"sha256-uiqDJ6ubDnT09BGrmJmAzeMJ6GOVc2ofd+F6Du/IUmY="},"flags/4x3/lt-d6a367644254244a8219c2eaa525b43d261f5da4fb074b0e08cedeb343f737a1.svg":{"logical_path":"flags/4x3/lt.svg","mtime":"2017-10-08T14:45:34+02:00","size":489,"digest":"d6a367644254244a8219c2eaa525b43d261f5da4fb074b0e08cedeb343f737a1","integrity":"sha256-1qNnZEJUJEqCGcLqpSW0PSYfXaT7B0sOCM7es0P3N6E="},"flags/1x1/lt-933670ec7627a78f72b60cfe7f49cd09b4afa58fb341857f76a5b7b612c12c97.svg":{"logical_path":"flags/1x1/lt.svg","mtime":"2017-10-08T14:45:34+02:00","size":489,"digest":"933670ec7627a78f72b60cfe7f49cd09b4afa58fb341857f76a5b7b612c12c97","integrity":"sha256-kzZw7HYnp49ytgz+f0nNCbSvpY+zQYV/dqW3thLBLJc="},"flags/4x3/lu-949c9e81217b58fe622d4d4d00903499b3e2249aa3f688401b78bd3ad977c740.svg":{"logical_path":"flags/4x3/lu.svg","mtime":"2017-10-08T14:45:34+02:00","size":268,"digest":"949c9e81217b58fe622d4d4d00903499b3e2249aa3f688401b78bd3ad977c740","integrity":"sha256-lJyegSF7WP5iLU1NAJA0mbPiJJqj9ohAG3i9Otl3x0A="},"flags/1x1/lu-ab39ab3ddef396fcd816d4170f3f73ed89465ed37a180685c68b3833aa3f01a9.svg":{"logical_path":"flags/1x1/lu.svg","mtime":"2017-10-08T14:45:34+02:00","size":254,"digest":"ab39ab3ddef396fcd816d4170f3f73ed89465ed37a180685c68b3833aa3f01a9","integrity":"sha256-qzmrPd7zlvzYFtQXDz9z7YlGXtN6GAaFxos4M6o/Aak="},"flags/4x3/lv-b672e3ee7e344abaaf9128111a6543ad7897aa92084b74c42a2877aa1b8cf7a8.svg":{"logical_path":"flags/4x3/lv.svg","mtime":"2017-10-08T14:45:34+02:00","size":252,"digest":"b672e3ee7e344abaaf9128111a6543ad7897aa92084b74c42a2877aa1b8cf7a8","integrity":"sha256-tnLj7n40SrqvkSgRGmVDrXiXqpIIS3TEKih3qhuM96g="},"flags/1x1/lv-55fc46607d153eb1d40d1b478ab6448117b79cdc3d9d973ea2beb44ee4d77316.svg":{"logical_path":"flags/1x1/lv.svg","mtime":"2017-10-08T14:45:34+02:00","size":264,"digest":"55fc46607d153eb1d40d1b478ab6448117b79cdc3d9d973ea2beb44ee4d77316","integrity":"sha256-VfxGYH0VPrHUDRtHirZEgRe3nNw9nZc+or60TuTXcxY="},"flags/4x3/ly-6f996771734c3f63c65d925a3d991f7d238734cc10e56b3160841fac2939e21a.svg":{"logical_path":"flags/4x3/ly.svg","mtime":"2017-10-08T14:45:34+02:00","size":537,"digest":"6f996771734c3f63c65d925a3d991f7d238734cc10e56b3160841fac2939e21a","integrity":"sha256-b5lncXNMP2PGXZJaPZkffSOHNMwQ5WsxYIQfrCk54ho="},"flags/1x1/ly-4e0bf9ff6856dcbba708b4fb176abd44cd385274badbb6e609b596a660109191.svg":{"logical_path":"flags/1x1/ly.svg","mtime":"2017-10-08T14:45:34+02:00","size":535,"digest":"4e0bf9ff6856dcbba708b4fb176abd44cd385274badbb6e609b596a660109191","integrity":"sha256-Tgv5/2hW3LunCLT7F2q9RM04UnS627bmCbWWpmAQkZE="},"flags/4x3/ma-70b305040cec175c749a22e6d1e0c1c96bd2164768f208a34d6c8a7ed5caa0ae.svg":{"logical_path":"flags/4x3/ma.svg","mtime":"2017-10-08T14:45:34+02:00","size":284,"digest":"70b305040cec175c749a22e6d1e0c1c96bd2164768f208a34d6c8a7ed5caa0ae","integrity":"sha256-cLMFBAzsF1x0miLm0eDByWvSFkdo8gijTWyKftXKoK4="},"flags/1x1/ma-919d8fa71ed3a3cadabade682f5326334f11d659245d51b31b40880689cbe275.svg":{"logical_path":"flags/1x1/ma.svg","mtime":"2017-10-08T14:45:34+02:00","size":282,"digest":"919d8fa71ed3a3cadabade682f5326334f11d659245d51b31b40880689cbe275","integrity":"sha256-kZ2Ppx7To8raut5oL1MmM08R1lkkXVGzG0CIBonL4nU="},"flags/4x3/mc-f0bd30faa57995276026f00e97f6d4ffd3c151e6d2c3d440331ac739965f3bc9.svg":{"logical_path":"flags/4x3/mc.svg","mtime":"2017-10-08T14:45:34+02:00","size":240,"digest":"f0bd30faa57995276026f00e97f6d4ffd3c151e6d2c3d440331ac739965f3bc9","integrity":"sha256-8L0w+qV5lSdgJvAOl/bU/9PBUebSw9RAMxrHOZZfO8k="},"flags/1x1/mc-6fcd8ec0404ec1e02e8f38934202004b443c39ffa369be045872c4c89b0674b3.svg":{"logical_path":"flags/1x1/mc.svg","mtime":"2017-10-08T14:45:34+02:00","size":260,"digest":"6fcd8ec0404ec1e02e8f38934202004b443c39ffa369be045872c4c89b0674b3","integrity":"sha256-b82OwEBOweAujziTQgIAS0Q8Of+jab4EWHLEyJsGdLM="},"flags/4x3/md-4bb12bafd1cae33ea4d420dc80301e573d39247323d0eca7c343650a414931ad.svg":{"logical_path":"flags/4x3/md.svg","mtime":"2017-10-08T14:45:34+02:00","size":14670,"digest":"4bb12bafd1cae33ea4d420dc80301e573d39247323d0eca7c343650a414931ad","integrity":"sha256-S7Err9HK4z6k1CDcgDAeVz05JHMj0Oynw0NlCkFJMa0="},"flags/1x1/md-76e3c791e11574492239b07821b43d8f5308e8b7b9ed7d72a5b189f06bb0a81d.svg":{"logical_path":"flags/1x1/md.svg","mtime":"2017-10-08T14:45:34+02:00","size":14809,"digest":"76e3c791e11574492239b07821b43d8f5308e8b7b9ed7d72a5b189f06bb0a81d","integrity":"sha256-duPHkeEVdEkiObB4IbQ9j1MI6Le57X1ypbGJ8GuwqB0="},"flags/4x3/me-096ce4c309762cde78cb1fec7f1d9ab7c38e6270ddb5aaaf9d29ec63a160e276.svg":{"logical_path":"flags/4x3/me.svg","mtime":"2017-10-08T14:45:34+02:00","size":110221,"digest":"096ce4c309762cde78cb1fec7f1d9ab7c38e6270ddb5aaaf9d29ec63a160e276","integrity":"sha256-CWzkwwl2LN54yx/sfx2at8OOYnDdtaqvnSnsY6Fg4nY="},"flags/1x1/me-9f8dc8f8e7b38bfc2edd5a35d13818544d304c7834a315ffbfcccecf7a9e6ba6.svg":{"logical_path":"flags/1x1/me.svg","mtime":"2017-10-08T14:45:34+02:00","size":108220,"digest":"9f8dc8f8e7b38bfc2edd5a35d13818544d304c7834a315ffbfcccecf7a9e6ba6","integrity":"sha256-n43I+Oezi/wu3Vo10TgYVE0wTHg0oxX/v8zOz3qea6Y="},"flags/4x3/mf-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg":{"logical_path":"flags/4x3/mf.svg","mtime":"2017-10-08T14:45:34+02:00","size":313,"digest":"4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702","integrity":"sha256-ToxEbgMlcqLnTR/czsmjrpPWbcJJUu0vH+W9q2/vVwI="},"flags/1x1/mf-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/mf.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/mg-f8afb0a551765b27b0c173a623e30af523e907e665858c401e8246b2fa5c2052.svg":{"logical_path":"flags/4x3/mg.svg","mtime":"2017-10-08T14:45:34+02:00","size":322,"digest":"f8afb0a551765b27b0c173a623e30af523e907e665858c401e8246b2fa5c2052","integrity":"sha256-+K+wpVF2WyewwXOmI+MK9SPpB+ZlhYxAHoJGsvpcIFI="},"flags/1x1/mg-d5527653deeb8cd3c7d24082dab7c9dcd8218dd9c9043c832cb1436f1d8090ae.svg":{"logical_path":"flags/1x1/mg.svg","mtime":"2017-10-08T14:45:34+02:00","size":349,"digest":"d5527653deeb8cd3c7d24082dab7c9dcd8218dd9c9043c832cb1436f1d8090ae","integrity":"sha256-1VJ2U97rjNPH0kCC2rfJ3NghjdnJBDyDLLFDbx2AkK4="},"flags/4x3/mh-4edc79226b41a72a4f0a8ca6d4f7f8f73e92972ae6b30c96a9dab4274a046165.svg":{"logical_path":"flags/4x3/mh.svg","mtime":"2017-10-08T14:45:34+02:00","size":1008,"digest":"4edc79226b41a72a4f0a8ca6d4f7f8f73e92972ae6b30c96a9dab4274a046165","integrity":"sha256-Ttx5ImtBpypPCoym1Pf49z6SlyrmswyWqdq0J0oEYWU="},"flags/1x1/mh-1bd8a38684a5d55aea8319d106fdc1e62a91424e36a8fb5a27f215cfadb98707.svg":{"logical_path":"flags/1x1/mh.svg","mtime":"2017-10-08T14:45:34+02:00","size":1017,"digest":"1bd8a38684a5d55aea8319d106fdc1e62a91424e36a8fb5a27f215cfadb98707","integrity":"sha256-G9ijhoSl1VrqgxnRBv3B5iqRQk42qPtaJ/IVz625hwc="},"flags/4x3/mk-2098f24dab54b22fbc7aff34c15009b4ae7012a6848cede09d6db9ed5caaffec.svg":{"logical_path":"flags/4x3/mk.svg","mtime":"2017-10-08T14:45:34+02:00","size":395,"digest":"2098f24dab54b22fbc7aff34c15009b4ae7012a6848cede09d6db9ed5caaffec","integrity":"sha256-IJjyTatUsi+8ev80wVAJtK5wEqaEjO3gnW257Vyq/+w="},"flags/1x1/mk-1b083e708a18b40383921595134b167e0fa84a6f233934668481b902b518f089.svg":{"logical_path":"flags/1x1/mk.svg","mtime":"2017-10-08T14:45:34+02:00","size":423,"digest":"1b083e708a18b40383921595134b167e0fa84a6f233934668481b902b518f089","integrity":"sha256-Gwg+cIoYtAODkhWVE0sWfg+oSm8jOTRmhIG5ArUY8Ik="},"flags/4x3/ml-5cb117165c5ebebb07725430dce0fbd0bce2ad618967354eda44d9229e16c676.svg":{"logical_path":"flags/4x3/ml.svg","mtime":"2017-10-08T14:45:34+02:00","size":342,"digest":"5cb117165c5ebebb07725430dce0fbd0bce2ad618967354eda44d9229e16c676","integrity":"sha256-XLEXFlxevrsHclQw3OD70LzirWGJZzVO2kTZIp4WxnY="},"flags/1x1/ml-cf94ba5bc9f5b9f3b15c187243a5fc60dd80a43715da7ae005dc13321f0d411b.svg":{"logical_path":"flags/1x1/ml.svg","mtime":"2017-10-08T14:45:34+02:00","size":299,"digest":"cf94ba5bc9f5b9f3b15c187243a5fc60dd80a43715da7ae005dc13321f0d411b","integrity":"sha256-z5S6W8n1ufOxXBhyQ6X8YN2ApDcV2nrgBdwTMh8NQRs="},"flags/4x3/mm-987d96563a6517ba568b2ad3e8dbcd77c01c0a6114b8497b214cf3e967ce27d1.svg":{"logical_path":"flags/4x3/mm.svg","mtime":"2017-10-08T14:45:34+02:00","size":996,"digest":"987d96563a6517ba568b2ad3e8dbcd77c01c0a6114b8497b214cf3e967ce27d1","integrity":"sha256-mH2WVjplF7pWiyrT6NvNd8AcCmEUuEl7IUzz6WfOJ9E="},"flags/1x1/mm-a78cffaf229320ef1cc28570ec3e91e9e188d8cff8cc01f14423b9c5383e87d2.svg":{"logical_path":"flags/1x1/mm.svg","mtime":"2017-10-08T14:45:34+02:00","size":1015,"digest":"a78cffaf229320ef1cc28570ec3e91e9e188d8cff8cc01f14423b9c5383e87d2","integrity":"sha256-p4z/ryKTIO8cwoVw7D6R6eGI2M/4zAHxRCO5xTg+h9I="},"flags/4x3/mn-a3dc85a21b868793f084dd954c31e13c0cf993eef59102a102406c95d99e243d.svg":{"logical_path":"flags/4x3/mn.svg","mtime":"2017-10-08T14:45:34+02:00","size":1601,"digest":"a3dc85a21b868793f084dd954c31e13c0cf993eef59102a102406c95d99e243d","integrity":"sha256-o9yFohuGh5PwhN2VTDHhPAz5k+71kQKhAkBsldmeJD0="},"flags/1x1/mn-141a15f289b3e49d8e0c1a21b9015f14ebb9e55660ebc23deefa55a3fa6fc9b5.svg":{"logical_path":"flags/1x1/mn.svg","mtime":"2017-10-08T14:45:34+02:00","size":1603,"digest":"141a15f289b3e49d8e0c1a21b9015f14ebb9e55660ebc23deefa55a3fa6fc9b5","integrity":"sha256-FBoV8omz5J2ODBohuQFfFOu55VZg68I97vpVo/pvybU="},"flags/4x3/mo-f58284a9e6021d88f7756d6cbe408f79789a30113084ef6bbd8541e15008d684.svg":{"logical_path":"flags/4x3/mo.svg","mtime":"2017-10-08T14:45:34+02:00","size":2047,"digest":"f58284a9e6021d88f7756d6cbe408f79789a30113084ef6bbd8541e15008d684","integrity":"sha256-9YKEqeYCHYj3dW1svkCPeXiaMBEwhO9rvYVB4VAI1oQ="},"flags/1x1/mo-b871b2e0087b09318060384476b25c28de16acac946f5ecbb4e162660e6486c1.svg":{"logical_path":"flags/1x1/mo.svg","mtime":"2017-10-08T14:45:34+02:00","size":2082,"digest":"b871b2e0087b09318060384476b25c28de16acac946f5ecbb4e162660e6486c1","integrity":"sha256-uHGy4Ah7CTGAYDhEdrJcKN4WrKyUb17LtOFiZg5khsE="},"flags/4x3/mp-d9f8b726babd7cba9e128eb81ce7e7d9adb81945f056072aaa3b5540c8299f9d.svg":{"logical_path":"flags/4x3/mp.svg","mtime":"2017-10-08T14:45:34+02:00","size":34391,"digest":"d9f8b726babd7cba9e128eb81ce7e7d9adb81945f056072aaa3b5540c8299f9d","integrity":"sha256-2fi3Jrq9fLqeEo64HOfn2a24GUXwVgcqqjtVQMgpn50="},"flags/1x1/mp-41d27c2d802f8487a3343a962c11711e9ebf682bda766cceb72ccac2b37dbda0.svg":{"logical_path":"flags/1x1/mp.svg","mtime":"2017-10-08T14:45:34+02:00","size":34062,"digest":"41d27c2d802f8487a3343a962c11711e9ebf682bda766cceb72ccac2b37dbda0","integrity":"sha256-QdJ8LYAvhIejNDqWLBFxHp6/aCvadmzOtyzKwrN9vaA="},"flags/4x3/mq-21e70a8c243dc97f486dadf01f0b3300a8310c719d5a650fe4d7512e7ee8169d.svg":{"logical_path":"flags/4x3/mq.svg","mtime":"2017-10-08T14:45:34+02:00","size":310,"digest":"21e70a8c243dc97f486dadf01f0b3300a8310c719d5a650fe4d7512e7ee8169d","integrity":"sha256-IecKjCQ9yX9Iba3wHwszAKgxDHGdWmUP5NdRLn7oFp0="},"flags/1x1/mq-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/mq.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/mr-76898913a879ac1eadb03f5950843ea63fd9a0a998d1b9113c386012cf1c80e6.svg":{"logical_path":"flags/4x3/mr.svg","mtime":"2017-10-08T14:45:34+02:00","size":935,"digest":"76898913a879ac1eadb03f5950843ea63fd9a0a998d1b9113c386012cf1c80e6","integrity":"sha256-domJE6h5rB6tsD9ZUIQ+pj/ZoKmY0bkRPDhgEs8cgOY="},"flags/1x1/mr-5288f91d4c12b6fdca7129a8564638991028f730a170bb72be9fee1ac8d8f206.svg":{"logical_path":"flags/1x1/mr.svg","mtime":"2017-10-08T14:45:34+02:00","size":969,"digest":"5288f91d4c12b6fdca7129a8564638991028f730a170bb72be9fee1ac8d8f206","integrity":"sha256-Uoj5HUwStv3KcSmoVkY4mRAo9zChcLtyvp/uGsjY8gY="},"flags/4x3/ms-add4964ba7fa5a4440d40902dabd49345476d13ddf6e20e7b06834ab30721b79.svg":{"logical_path":"flags/4x3/ms.svg","mtime":"2017-10-08T14:45:34+02:00","size":8602,"digest":"add4964ba7fa5a4440d40902dabd49345476d13ddf6e20e7b06834ab30721b79","integrity":"sha256-rdSWS6f6WkRA1AkC2r1JNFR20T3fbiDnsGg0qzByG3k="},"flags/1x1/ms-47f49520f4ba965587509e45980be0ef29792830738cdae717e52616a11bc00b.svg":{"logical_path":"flags/1x1/ms.svg","mtime":"2017-10-08T14:45:34+02:00","size":8574,"digest":"47f49520f4ba965587509e45980be0ef29792830738cdae717e52616a11bc00b","integrity":"sha256-R/SVIPS6llWHUJ5FmAvg7yl5KDBzjNrnF+UmFqEbwAs="},"flags/4x3/mt-55b5c69335d7e2691e50443b34fc5b708309c99326fea6233dd3575c3402043a.svg":{"logical_path":"flags/4x3/mt.svg","mtime":"2017-10-08T14:45:34+02:00","size":13407,"digest":"55b5c69335d7e2691e50443b34fc5b708309c99326fea6233dd3575c3402043a","integrity":"sha256-VbXGkzXX4mkeUEQ7NPxbcIMJyZMm/qYjPdNXXDQCBDo="},"flags/1x1/mt-bbdc4f8e3dc66dc066d8ad0a264d751090794c53eee6be34f8df84ab389988a0.svg":{"logical_path":"flags/1x1/mt.svg","mtime":"2017-10-08T14:45:34+02:00","size":15270,"digest":"bbdc4f8e3dc66dc066d8ad0a264d751090794c53eee6be34f8df84ab389988a0","integrity":"sha256-u9xPjj3GbcBm2K0KJk11EJB5TFPu5r40+N+EqziZiKA="},"flags/4x3/mu-d0d2fd85209d5ca5b9f90da3947f3142b96ae688536ed796f2bc912aef84c333.svg":{"logical_path":"flags/4x3/mu.svg","mtime":"2017-10-08T14:45:34+02:00","size":366,"digest":"d0d2fd85209d5ca5b9f90da3947f3142b96ae688536ed796f2bc912aef84c333","integrity":"sha256-0NL9hSCdXKW5+Q2jlH8xQrlq5ohTbteW8ryRKu+EwzM="},"flags/1x1/mu-3e18fa9a066e02636f5a119d445b4f0439c8b75bae4e2999c17a6105bb95bd5a.svg":{"logical_path":"flags/1x1/mu.svg","mtime":"2017-10-08T14:45:34+02:00","size":348,"digest":"3e18fa9a066e02636f5a119d445b4f0439c8b75bae4e2999c17a6105bb95bd5a","integrity":"sha256-Phj6mgZuAmNvWhGdRFtPBDnIt1uuTimZwXphBbuVvVo="},"flags/4x3/mv-595fccd022d985bf319bfee09ded164593e8206c364adc1fa3abbc68450c516a.svg":{"logical_path":"flags/4x3/mv.svg","mtime":"2017-10-08T14:45:34+02:00","size":304,"digest":"595fccd022d985bf319bfee09ded164593e8206c364adc1fa3abbc68450c516a","integrity":"sha256-WV/M0CLZhb8xm/7gne0WRZPoIGw2Stwfo6u8aEUMUWo="},"flags/1x1/mv-ba59c37e1fcf099ca68e7fa68fc30d5e75c4171aad18be54126fd214a0b0b6b5.svg":{"logical_path":"flags/1x1/mv.svg","mtime":"2017-10-08T14:45:34+02:00","size":330,"digest":"ba59c37e1fcf099ca68e7fa68fc30d5e75c4171aad18be54126fd214a0b0b6b5","integrity":"sha256-ulnDfh/PCZymjn+mj8MNXnXEFxqtGL5UEm/SFKCwtrU="},"flags/4x3/mw-67c2a39590afb916054063262e67293e303a264b9f9219767c13feb988f47212.svg":{"logical_path":"flags/4x3/mw.svg","mtime":"2017-10-08T14:45:34+02:00","size":5696,"digest":"67c2a39590afb916054063262e67293e303a264b9f9219767c13feb988f47212","integrity":"sha256-Z8KjlZCvuRYFQGMmLmcpPjA6Jkufkhl2fBP+uYj0chI="},"flags/1x1/mw-b82e28e3e51b467c8db86b1dd9cae837204255320928eb5e5f6b8536c7b1b28e.svg":{"logical_path":"flags/1x1/mw.svg","mtime":"2017-10-08T14:45:34+02:00","size":5922,"digest":"b82e28e3e51b467c8db86b1dd9cae837204255320928eb5e5f6b8536c7b1b28e","integrity":"sha256-uC4o4+UbRnyNuGsd2croNyBCVTIJKOteX2uFNsexso4="},"flags/4x3/mx-416fe6de02b7d9dfc0e479454d06fa7701631bf848c888365bc56978ea524bc5.svg":{"logical_path":"flags/4x3/mx.svg","mtime":"2017-10-08T14:45:34+02:00","size":48965,"digest":"416fe6de02b7d9dfc0e479454d06fa7701631bf848c888365bc56978ea524bc5","integrity":"sha256-QW/m3gK32d/A5HlFTQb6dwFjG/hIyIg2W8VpeOpSS8U="},"flags/1x1/mx-b9461685b2714abb039fbd65510729f7ab324940045465b1c74666721d721f7d.svg":{"logical_path":"flags/1x1/mx.svg","mtime":"2017-10-08T14:45:34+02:00","size":49254,"digest":"b9461685b2714abb039fbd65510729f7ab324940045465b1c74666721d721f7d","integrity":"sha256-uUYWhbJxSrsDn71lUQcp96sySUAEVGWxx0Zmch1yH30="},"flags/4x3/my-c0f21e9c6679e1ae455392ded0b9e5d8aad5f5ee79589634ac89d88f0c548060.svg":{"logical_path":"flags/4x3/my.svg","mtime":"2017-10-08T14:45:34+02:00","size":1542,"digest":"c0f21e9c6679e1ae455392ded0b9e5d8aad5f5ee79589634ac89d88f0c548060","integrity":"sha256-wPIenGZ54a5FU5Le0Lnl2KrV9e55WJY0rInYjwxUgGA="},"flags/1x1/my-868a1feec94ccf789db1040a953f25d3982056514195dcd961ff2d6b51b04431.svg":{"logical_path":"flags/1x1/my.svg","mtime":"2017-10-08T14:45:34+02:00","size":1538,"digest":"868a1feec94ccf789db1040a953f25d3982056514195dcd961ff2d6b51b04431","integrity":"sha256-hoof7slMz3idsQQKlT8l05ggVlFBldzZYf8ta1GwRDE="},"flags/4x3/mz-0c06b80f82ab675854d23444740910298f4b8e82b929112dbec4e1927342120f.svg":{"logical_path":"flags/4x3/mz.svg","mtime":"2017-10-08T14:45:34+02:00","size":3565,"digest":"0c06b80f82ab675854d23444740910298f4b8e82b929112dbec4e1927342120f","integrity":"sha256-DAa4D4KrZ1hU0jREdAkQKY9LjoK5KREtvsThknNCEg8="},"flags/1x1/mz-09a8632f1d20d400401b944af3c4b13e5d64052466bf9a59f6d2927d188150da.svg":{"logical_path":"flags/1x1/mz.svg","mtime":"2017-10-08T14:45:34+02:00","size":3592,"digest":"09a8632f1d20d400401b944af3c4b13e5d64052466bf9a59f6d2927d188150da","integrity":"sha256-CahjLx0g1ABAG5RK88SxPl1kBSRmv5pZ9tKSfRiBUNo="},"flags/4x3/na-43a5f5934fc004e64eadcfb7675114ed1eab3b7f1e9153886edb0b69e7581ce2.svg":{"logical_path":"flags/4x3/na.svg","mtime":"2017-10-08T14:45:34+02:00","size":1311,"digest":"43a5f5934fc004e64eadcfb7675114ed1eab3b7f1e9153886edb0b69e7581ce2","integrity":"sha256-Q6X1k0/ABOZOrc+3Z1EU7R6rO38ekVOIbtsLaedYHOI="},"flags/1x1/na-549c5971f5c2a771c83113a4f9b7a9b5e69546d855e92559b49d6772ff6d3e82.svg":{"logical_path":"flags/1x1/na.svg","mtime":"2017-10-08T14:45:34+02:00","size":1297,"digest":"549c5971f5c2a771c83113a4f9b7a9b5e69546d855e92559b49d6772ff6d3e82","integrity":"sha256-VJxZcfXCp3HIMROk+bepteaVRthV6SVZtJ1ncv9tPoI="},"flags/4x3/nc-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/nc.svg","mtime":"2017-10-08T14:45:34+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/nc-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/nc.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/ne-3be65335a772b7ba2c8916d0d60f12ed4cc2aebc302151ea23ced9c9a3c38ed4.svg":{"logical_path":"flags/4x3/ne.svg","mtime":"2017-10-08T14:45:34+02:00","size":291,"digest":"3be65335a772b7ba2c8916d0d60f12ed4cc2aebc302151ea23ced9c9a3c38ed4","integrity":"sha256-O+ZTNadyt7osiRbQ1g8S7UzCrrwwIVHqI87ZyaPDjtQ="},"flags/1x1/ne-783c25c63f68afe3c462b326b7faec7cc1493f6a4c140bc62fd524604de09d27.svg":{"logical_path":"flags/1x1/ne.svg","mtime":"2017-10-08T14:45:34+02:00","size":303,"digest":"783c25c63f68afe3c462b326b7faec7cc1493f6a4c140bc62fd524604de09d27","integrity":"sha256-eDwlxj9or+PEYrMmt/rsfMFJP2pMFAvGL9UkYE3gnSc="},"flags/4x3/nf-6ff37be9a0581fec55eef9e9871aa0d76d61c44007445184712ec6df3a04208a.svg":{"logical_path":"flags/4x3/nf.svg","mtime":"2017-10-08T14:45:34+02:00","size":9092,"digest":"6ff37be9a0581fec55eef9e9871aa0d76d61c44007445184712ec6df3a04208a","integrity":"sha256-b/N76aBYH+xV7vnphxqg121hxEAHRFGEcS7G3zoEIIo="},"flags/1x1/nf-2f25b6485f62ce38b25bc9f6428d3e0dc0043d71221eac1f4c3d71bca91c2ea6.svg":{"logical_path":"flags/1x1/nf.svg","mtime":"2017-10-08T14:45:34+02:00","size":8982,"digest":"2f25b6485f62ce38b25bc9f6428d3e0dc0043d71221eac1f4c3d71bca91c2ea6","integrity":"sha256-LyW2SF9izjiyW8n2Qo0+DcAEPXEiHqwfTD1xvKkcLqY="},"flags/4x3/ng-22aaf5a93f277f26cbfb21f7b141476fc8853298cf423fe5c849f87c2813d4e1.svg":{"logical_path":"flags/4x3/ng.svg","mtime":"2017-10-08T14:45:34+02:00","size":299,"digest":"22aaf5a93f277f26cbfb21f7b141476fc8853298cf423fe5c849f87c2813d4e1","integrity":"sha256-Iqr1qT8nfybL+yH3sUFHb8iFMpjPQj/lyEn4fCgT1OE="},"flags/1x1/ng-8753476807ab9e0c201397dbe6a884155d97e8766667d10071650d64fe277fb0.svg":{"logical_path":"flags/1x1/ng.svg","mtime":"2017-10-08T14:45:34+02:00","size":296,"digest":"8753476807ab9e0c201397dbe6a884155d97e8766667d10071650d64fe277fb0","integrity":"sha256-h1NHaAerngwgE5fb5qiEFV2X6HZmZ9EAcWUNZP4nf7A="},"flags/4x3/ni-295d07e91f9417b2ca8c7c918481874a7da7f9ac25035edf3a8d1d79b1230e32.svg":{"logical_path":"flags/4x3/ni.svg","mtime":"2017-10-08T14:45:34+02:00","size":28935,"digest":"295d07e91f9417b2ca8c7c918481874a7da7f9ac25035edf3a8d1d79b1230e32","integrity":"sha256-KV0H6R+UF7LKjHyRhIGHSn2n+awlA17fOo0debEjDjI="},"flags/1x1/ni-6786ef719864e51745934adc319ed0ed95fca75687ee6050d580435ee3f2b236.svg":{"logical_path":"flags/1x1/ni.svg","mtime":"2017-10-08T14:45:34+02:00","size":28945,"digest":"6786ef719864e51745934adc319ed0ed95fca75687ee6050d580435ee3f2b236","integrity":"sha256-Z4bvcZhk5RdFk0rcMZ7Q7ZX8p1aH7mBQ1YBDXuPysjY="},"flags/4x3/nl-8f7bff63589346e93733c01f1f18c5a11e8c94911253bcf852f173a933cd928e.svg":{"logical_path":"flags/4x3/nl.svg","mtime":"2017-10-08T14:45:34+02:00","size":385,"digest":"8f7bff63589346e93733c01f1f18c5a11e8c94911253bcf852f173a933cd928e","integrity":"sha256-j3v/Y1iTRuk3M8AfHxjFoR6MlJESU7z4UvFzqTPNko4="},"flags/1x1/nl-f46400354e3d489228eca5944d9e181114fe1f748fa22ac0a70fd06c557bec92.svg":{"logical_path":"flags/1x1/nl.svg","mtime":"2017-10-08T14:45:34+02:00","size":400,"digest":"f46400354e3d489228eca5944d9e181114fe1f748fa22ac0a70fd06c557bec92","integrity":"sha256-9GQANU49SJIo7KWUTZ4YERT+H3SPoirApw/QbFV77JI="},"flags/4x3/no-ecdb24f870c1e6777529ec85e3ea8d989a75b5874ecde94fead0218f7c1b5605.svg":{"logical_path":"flags/4x3/no.svg","mtime":"2017-10-08T14:45:34+02:00","size":336,"digest":"ecdb24f870c1e6777529ec85e3ea8d989a75b5874ecde94fead0218f7c1b5605","integrity":"sha256-7Nsk+HDB5nd1KeyF4+qNmJp1tYdOzelP6tAhj3wbVgU="},"flags/1x1/no-47a12b11ae8b0aca7f7e3d9084e9d3a6c0ef1ad979d22ba9258e6f9ddc3ab16a.svg":{"logical_path":"flags/1x1/no.svg","mtime":"2017-10-08T14:45:34+02:00","size":336,"digest":"47a12b11ae8b0aca7f7e3d9084e9d3a6c0ef1ad979d22ba9258e6f9ddc3ab16a","integrity":"sha256-R6ErEa6LCsp/fj2QhOnTpsDvGtl50iupJY5vndw6sWo="},"flags/4x3/np-b32c3bad572c4f27b5eee9c1ca97a5f2ca1c2a5b720b67fd636c91064e5fbdd9.svg":{"logical_path":"flags/4x3/np.svg","mtime":"2017-10-08T14:45:34+02:00","size":1378,"digest":"b32c3bad572c4f27b5eee9c1ca97a5f2ca1c2a5b720b67fd636c91064e5fbdd9","integrity":"sha256-syw7rVcsTye17unBypel8socKltyC2f9Y2yRBk5fvdk="},"flags/1x1/np-1279e1d699c05de413b30172b7ed97c13bfaa2069abe788ecf8b127210778354.svg":{"logical_path":"flags/1x1/np.svg","mtime":"2017-10-08T14:45:34+02:00","size":1520,"digest":"1279e1d699c05de413b30172b7ed97c13bfaa2069abe788ecf8b127210778354","integrity":"sha256-Ennh1pnAXeQTswFyt+2XwTv6ogaavniOz4sSchB3g1Q="},"flags/4x3/nr-3818437e2251e1f7310734098d13e2eee69a6b9cc310918d3287b345618e6fef.svg":{"logical_path":"flags/4x3/nr.svg","mtime":"2017-10-08T14:45:34+02:00","size":811,"digest":"3818437e2251e1f7310734098d13e2eee69a6b9cc310918d3287b345618e6fef","integrity":"sha256-OBhDfiJR4fcxBzQJjRPi7uaaa5zDEJGNMoezRWGOb+8="},"flags/1x1/nr-9b9edbaf4e09989f53511c969520cc2c10f3a693cdb80441b2aeabff30ebb381.svg":{"logical_path":"flags/1x1/nr.svg","mtime":"2017-10-08T14:45:34+02:00","size":802,"digest":"9b9edbaf4e09989f53511c969520cc2c10f3a693cdb80441b2aeabff30ebb381","integrity":"sha256-m57br04JmJ9TURyWlSDMLBDzppPNuARBsq6r/zDrs4E="},"flags/4x3/nu-3b27eef18754c7fb8def8deadc730f074b090c8b6e9101d008d529c1d8784e5e.svg":{"logical_path":"flags/4x3/nu.svg","mtime":"2017-10-08T14:45:34+02:00","size":2311,"digest":"3b27eef18754c7fb8def8deadc730f074b090c8b6e9101d008d529c1d8784e5e","integrity":"sha256-Oyfu8YdUx/uN743q3HMPB0sJDItukQHQCNUpwdh4Tl4="},"flags/1x1/nu-9f6f9a41e36004711e3ad2e31e3d0425ca698bf242a62b9665b6f41eeb999ac7.svg":{"logical_path":"flags/1x1/nu.svg","mtime":"2017-10-08T14:45:34+02:00","size":2303,"digest":"9f6f9a41e36004711e3ad2e31e3d0425ca698bf242a62b9665b6f41eeb999ac7","integrity":"sha256-n2+aQeNgBHEeOtLjHj0EJcppi/JCpiuWZbb0HuuZmsc="},"flags/4x3/nz-9690c3a7cdea4d5d6b88546ad69244a772fd0649e75f6334695fce89f5c4f076.svg":{"logical_path":"flags/4x3/nz.svg","mtime":"2017-10-08T14:45:34+02:00","size":2149,"digest":"9690c3a7cdea4d5d6b88546ad69244a772fd0649e75f6334695fce89f5c4f076","integrity":"sha256-lpDDp83qTV1riFRq1pJEp3L9BknnX2M0aV/OifXE8HY="},"flags/1x1/nz-e848215aaf4f9d5738b886ded97ff13b69c752888a27d1ac430116f7133a1c0e.svg":{"logical_path":"flags/1x1/nz.svg","mtime":"2017-10-08T14:45:34+02:00","size":2146,"digest":"e848215aaf4f9d5738b886ded97ff13b69c752888a27d1ac430116f7133a1c0e","integrity":"sha256-6EghWq9PnVc4uIbe2X/xO2nHUoiKJ9GsQwEW9xM6HA4="},"flags/4x3/om-7b9135ecdcf42a3bb69c5bf685930d32f9be7c6daaf58d5a8d154e22b6079347.svg":{"logical_path":"flags/4x3/om.svg","mtime":"2017-10-08T14:45:34+02:00","size":29648,"digest":"7b9135ecdcf42a3bb69c5bf685930d32f9be7c6daaf58d5a8d154e22b6079347","integrity":"sha256-e5E17Nz0Kju2nFv2hZMNMvm+fG2q9Y1ajRVOIrYHk0c="},"flags/1x1/om-665da86c6b715f3d5f36bba0e01539e574d7871437b03ecbe29a92e5e703e09a.svg":{"logical_path":"flags/1x1/om.svg","mtime":"2017-10-08T14:45:34+02:00","size":29508,"digest":"665da86c6b715f3d5f36bba0e01539e574d7871437b03ecbe29a92e5e703e09a","integrity":"sha256-Zl2obGtxXz1fNrug4BU55XTXhxQ3sD7L4pqS5ecD4Jo="},"flags/4x3/pa-a5b55e50a411899195a8f2bf8f37bddd94a4436582568c9ddfbddc2c99d1ae2d.svg":{"logical_path":"flags/4x3/pa.svg","mtime":"2017-10-08T14:45:34+02:00","size":879,"digest":"a5b55e50a411899195a8f2bf8f37bddd94a4436582568c9ddfbddc2c99d1ae2d","integrity":"sha256-pbVeUKQRiZGVqPK/jze93ZSkQ2WCVoyd373cLJnRri0="},"flags/1x1/pa-6c5566a7ace4125d958ec45ade8ce61e2fc065bb7fdd99cf1d6988a01b6fa73a.svg":{"logical_path":"flags/1x1/pa.svg","mtime":"2017-10-08T14:45:34+02:00","size":785,"digest":"6c5566a7ace4125d958ec45ade8ce61e2fc065bb7fdd99cf1d6988a01b6fa73a","integrity":"sha256-bFVmp6zkEl2VjsRa3ozmHi/AZbt/3ZnPHWmIoBtvpzo="},"flags/4x3/pe-12966232fe9a3dcc296389dea282cc8aa400327298d25f2f01c4963d1b900d13.svg":{"logical_path":"flags/4x3/pe.svg","mtime":"2017-10-08T14:45:34+02:00","size":315,"digest":"12966232fe9a3dcc296389dea282cc8aa400327298d25f2f01c4963d1b900d13","integrity":"sha256-EpZiMv6aPcwpY4neooLMiqQAMnKY0l8vAcSWPRuQDRM="},"flags/1x1/pe-449b3363ff9efe701e1f662ae71c31bb4b5952710b73346e2ae090a90c79488d.svg":{"logical_path":"flags/1x1/pe.svg","mtime":"2017-10-08T14:45:34+02:00","size":271,"digest":"449b3363ff9efe701e1f662ae71c31bb4b5952710b73346e2ae090a90c79488d","integrity":"sha256-RJszY/+e/nAeH2Yq5xwxu0tZUnELczRuKuCQqQx5SI0="},"flags/4x3/pf-db568d96a25e93ea2d51edb9ccb8a0ba15bbe46e1241e1bb4376a856290de4e8.svg":{"logical_path":"flags/4x3/pf.svg","mtime":"2017-10-08T14:45:34+02:00","size":6691,"digest":"db568d96a25e93ea2d51edb9ccb8a0ba15bbe46e1241e1bb4376a856290de4e8","integrity":"sha256-21aNlqJek+otUe25zLiguhW75G4SQeG7Q3aoVikN5Og="},"flags/1x1/pf-d6aacd56a7243b922bbbd26c94696f19a3dd242df5e5ede999e0319930bf8d64.svg":{"logical_path":"flags/1x1/pf.svg","mtime":"2017-10-08T14:45:34+02:00","size":6623,"digest":"d6aacd56a7243b922bbbd26c94696f19a3dd242df5e5ede999e0319930bf8d64","integrity":"sha256-1qrNVqckO5Iru9JslGlvGaPdJC315e3pmeAxmTC/jWQ="},"flags/4x3/pg-def242bd4b12703b11ddc016962c0ab5ac2252e6afb53647281af0ddf72b08b2.svg":{"logical_path":"flags/4x3/pg.svg","mtime":"2017-10-08T14:45:34+02:00","size":2218,"digest":"def242bd4b12703b11ddc016962c0ab5ac2252e6afb53647281af0ddf72b08b2","integrity":"sha256-3vJCvUsScDsR3cAWliwKtawiUuavtTZHKBrw3fcrCLI="},"flags/1x1/pg-0f89210b4effa3e2f248e9d22710191ec8a5f8cc00e24e7a493fcf6013af6985.svg":{"logical_path":"flags/1x1/pg.svg","mtime":"2017-10-08T14:45:34+02:00","size":2966,"digest":"0f89210b4effa3e2f248e9d22710191ec8a5f8cc00e24e7a493fcf6013af6985","integrity":"sha256-D4khC07/o+LySOnSJxAZHsil+MwA4k56ST/PYBOvaYU="},"flags/4x3/ph-76da2cb2822b71a1e7f182cfe2b8744af8704640feceb476aadf1753611c124c.svg":{"logical_path":"flags/4x3/ph.svg","mtime":"2017-10-08T14:45:34+02:00","size":1377,"digest":"76da2cb2822b71a1e7f182cfe2b8744af8704640feceb476aadf1753611c124c","integrity":"sha256-dtossoIrcaHn8YLP4rh0SvhwRkD+zrR2qt8XU2EcEkw="},"flags/1x1/ph-896fe211ebf65c4aec42a1f115ad43894870bc661eb9f32fd97962f0c6a8b666.svg":{"logical_path":"flags/1x1/ph.svg","mtime":"2017-10-08T14:45:34+02:00","size":1377,"digest":"896fe211ebf65c4aec42a1f115ad43894870bc661eb9f32fd97962f0c6a8b666","integrity":"sha256-iW/iEev2XErsQqHxFa1DiUhwvGYeufMv2Xli8MaotmY="},"flags/4x3/pk-d0f9243f586c99692f7d7d18a648095badef0c11bd98645924771c71283f6a51.svg":{"logical_path":"flags/4x3/pk.svg","mtime":"2017-10-08T14:45:34+02:00","size":922,"digest":"d0f9243f586c99692f7d7d18a648095badef0c11bd98645924771c71283f6a51","integrity":"sha256-0PkkP1hsmWkvfX0YpkgJW63vDBG9mGRZJHcccSg/alE="},"flags/1x1/pk-c32541b10dabe01538a811d9e1b600b91b1724239fe99325bc1156c4183127d9.svg":{"logical_path":"flags/1x1/pk.svg","mtime":"2017-10-08T14:45:34+02:00","size":864,"digest":"c32541b10dabe01538a811d9e1b600b91b1724239fe99325bc1156c4183127d9","integrity":"sha256-wyVBsQ2r4BU4qBHZ4bYAuRsXJCOf6ZMlvBFWxBgxJ9k="},"flags/4x3/pl-0fc0d2ef9f5b48e43bd93818263cc504c825346f09a73d22c6f84dcde8d651af.svg":{"logical_path":"flags/4x3/pl.svg","mtime":"2017-10-08T14:45:34+02:00","size":237,"digest":"0fc0d2ef9f5b48e43bd93818263cc504c825346f09a73d22c6f84dcde8d651af","integrity":"sha256-D8DS759bSOQ72TgYJjzFBMglNG8Jpz0ixvhNzejWUa8="},"flags/1x1/pl-44281da3343d3308aaa29a9e7d060a24b8d5bb949d07197e3771aa30793f5ffe.svg":{"logical_path":"flags/1x1/pl.svg","mtime":"2017-10-08T14:45:34+02:00","size":237,"digest":"44281da3343d3308aaa29a9e7d060a24b8d5bb949d07197e3771aa30793f5ffe","integrity":"sha256-RCgdozQ9MwiqopqefQYKJLjVu5SdBxl+N3GqMHk/X/4="},"flags/4x3/pm-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/pm.svg","mtime":"2017-10-08T14:45:34+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/pm-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/pm.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/pn-b9639507463a2e238b7d0f4cd976455ad4108594cc526882ed83807c321ca6b8.svg":{"logical_path":"flags/4x3/pn.svg","mtime":"2017-10-08T14:45:34+02:00","size":16790,"digest":"b9639507463a2e238b7d0f4cd976455ad4108594cc526882ed83807c321ca6b8","integrity":"sha256-uWOVB0Y6LiOLfQ9M2XZFWtQQhZTMUmiC7YOAfDIcprg="},"flags/1x1/pn-23189e2aa8792ba5d7bbfba6f21467ec9516f9b366ddddce193a7f26ddc18030.svg":{"logical_path":"flags/1x1/pn.svg","mtime":"2017-10-08T14:45:34+02:00","size":17272,"digest":"23189e2aa8792ba5d7bbfba6f21467ec9516f9b366ddddce193a7f26ddc18030","integrity":"sha256-IxieKqh5K6XXu/um8hRn7JUW+bNm3d3OGTp/Jt3BgDA="},"flags/4x3/pr-3194786def8e2510554b4d46d2ac49a10bfd1fb26f0d6803864b5982b36c12bb.svg":{"logical_path":"flags/4x3/pr.svg","mtime":"2017-10-08T14:45:34+02:00","size":721,"digest":"3194786def8e2510554b4d46d2ac49a10bfd1fb26f0d6803864b5982b36c12bb","integrity":"sha256-MZR4be+OJRBVS01G0qxJoQv9H7JvDWgDhktZgrNsErs="},"flags/1x1/pr-fb6e6e3064fc00cb41a3752358ba09e006375d6139ed63a13e6b81b4c8c53511.svg":{"logical_path":"flags/1x1/pr.svg","mtime":"2017-10-08T14:45:34+02:00","size":697,"digest":"fb6e6e3064fc00cb41a3752358ba09e006375d6139ed63a13e6b81b4c8c53511","integrity":"sha256-+25uMGT8AMtBo3UjWLoJ4AY3XWE57WOhPmuBtMjFNRE="},"flags/4x3/ps-e75b0d2d81c169c45624faf1f51ed1b9bf9b7945d71ceddac505c464f47c639a.svg":{"logical_path":"flags/4x3/ps.svg","mtime":"2017-10-08T14:45:34+02:00","size":609,"digest":"e75b0d2d81c169c45624faf1f51ed1b9bf9b7945d71ceddac505c464f47c639a","integrity":"sha256-51sNLYHBacRWJPrx9R7Rub+beUXXHO3axQXEZPR8Y5o="},"flags/1x1/ps-5e45e6b195fa5aa5b3c8bdff0824ef3fb354d4f1d5a1a5c4d92a9d67a568db3b.svg":{"logical_path":"flags/1x1/ps.svg","mtime":"2017-10-08T14:45:34+02:00","size":560,"digest":"5e45e6b195fa5aa5b3c8bdff0824ef3fb354d4f1d5a1a5c4d92a9d67a568db3b","integrity":"sha256-XkXmsZX6WqWzyL3/CCTvP7NU1PHVoaXE2SqdZ6Vo2zs="},"flags/4x3/pt-7056421a09bf65c1e96a0891db8b1d37b9ece7b39a7a8ecdfcbc837d0f773cfa.svg":{"logical_path":"flags/4x3/pt.svg","mtime":"2017-10-08T14:45:34+02:00","size":12226,"digest":"7056421a09bf65c1e96a0891db8b1d37b9ece7b39a7a8ecdfcbc837d0f773cfa","integrity":"sha256-cFZCGgm/ZcHpagiR24sdN7ns57Oaeo7N/LyDfQ93PPo="},"flags/1x1/pt-4f2b0e37162ed4d197eb28886933009600109e827ac83664f57f3683adc9617a.svg":{"logical_path":"flags/1x1/pt.svg","mtime":"2017-10-08T14:45:34+02:00","size":12319,"digest":"4f2b0e37162ed4d197eb28886933009600109e827ac83664f57f3683adc9617a","integrity":"sha256-TysONxYu1NGX6yiIaTMAlgAQnoJ6yDZk9X82g63JYXo="},"flags/4x3/pw-8991b8ae2bef2f0e81e79442947f1c68f843be48f652a4c3a2af5dab84d73170.svg":{"logical_path":"flags/4x3/pw.svg","mtime":"2017-10-08T14:45:34+02:00","size":489,"digest":"8991b8ae2bef2f0e81e79442947f1c68f843be48f652a4c3a2af5dab84d73170","integrity":"sha256-iZG4rivvLw6B55RClH8caPhDvkj2UqTDoq9dq4TXMXA="},"flags/1x1/pw-4c45576b7f0be5b37d463d126410bfbca0f9dcdd1539fc6866f9fc116baa3437.svg":{"logical_path":"flags/1x1/pw.svg","mtime":"2017-10-08T14:45:34+02:00","size":596,"digest":"4c45576b7f0be5b37d463d126410bfbca0f9dcdd1539fc6866f9fc116baa3437","integrity":"sha256-TEVXa38L5bN9Rj0SZBC/vKD53N0VOfxoZvn8EWuqNDc="},"flags/4x3/py-c416c19abcc7629572203f00253c9272876e59a88eafa893fa4a534ed8977776.svg":{"logical_path":"flags/4x3/py.svg","mtime":"2017-10-08T14:45:34+02:00","size":26946,"digest":"c416c19abcc7629572203f00253c9272876e59a88eafa893fa4a534ed8977776","integrity":"sha256-xBbBmrzHYpVyID8AJTyScoduWaiOr6iT+kpTTtiXd3Y="},"flags/1x1/py-adb6cfc575e9626cd8284964929c88830d0d6f7e5b0c135649eceb8bd9de1368.svg":{"logical_path":"flags/1x1/py.svg","mtime":"2017-10-08T14:45:34+02:00","size":27004,"digest":"adb6cfc575e9626cd8284964929c88830d0d6f7e5b0c135649eceb8bd9de1368","integrity":"sha256-rbbPxXXpYmzYKElkkpyIgw0Nb35bDBNWSezri9neE2g="},"flags/4x3/qa-821f667f3f99992cf08b05498cc1a0769dee9c4e36d2a2561d6cf7827255af1b.svg":{"logical_path":"flags/4x3/qa.svg","mtime":"2017-10-08T14:45:34+02:00","size":414,"digest":"821f667f3f99992cf08b05498cc1a0769dee9c4e36d2a2561d6cf7827255af1b","integrity":"sha256-gh9mfz+ZmSzwiwVJjMGgdp3unE420qJWHWz3gnJVrxs="},"flags/1x1/qa-b05242965c0835a82add68dbcfb4523bc5e53e191803eab2c0c8c8762f2fce80.svg":{"logical_path":"flags/1x1/qa.svg","mtime":"2017-10-08T14:45:34+02:00","size":430,"digest":"b05242965c0835a82add68dbcfb4523bc5e53e191803eab2c0c8c8762f2fce80","integrity":"sha256-sFJCllwINagq3Wjbz7RSO8XlPhkYA+qywMjIdi8vzoA="},"flags/4x3/re-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/re.svg","mtime":"2017-10-08T14:45:34+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/re-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/re.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/ro-63c55736a245e5fa5e0484b4693d43e171941143fcbdb34d3aa8d4cfd6160c9d.svg":{"logical_path":"flags/4x3/ro.svg","mtime":"2017-10-08T14:45:34+02:00","size":320,"digest":"63c55736a245e5fa5e0484b4693d43e171941143fcbdb34d3aa8d4cfd6160c9d","integrity":"sha256-Y8VXNqJF5fpeBIS0aT1D4XGUEUP8vbNNOqjUz9YWDJ0="},"flags/1x1/ro-f5c83b26832bb94b4320340ada4351a695bff66bb1410f6007c87e8395290380.svg":{"logical_path":"flags/1x1/ro.svg","mtime":"2017-10-08T14:45:34+02:00","size":324,"digest":"f5c83b26832bb94b4320340ada4351a695bff66bb1410f6007c87e8395290380","integrity":"sha256-9cg7JoMruUtDIDQK2kNRppW/9muxQQ9gB8h+g5UpA4A="},"flags/4x3/rs-a1bff9944ac65bce131f42964a45cfce50e334c6d52eeeea65f5f6179f8acf4d.svg":{"logical_path":"flags/4x3/rs.svg","mtime":"2017-10-08T14:45:34+02:00","size":494000,"digest":"a1bff9944ac65bce131f42964a45cfce50e334c6d52eeeea65f5f6179f8acf4d","integrity":"sha256-ob/5lErGW84TH0KWSkXPzlDjNMbVLu7qZfX2F5+Kz00="},"flags/1x1/rs-6af7605aa8aee1da6e0a75c750964b21b404011cd00f2df43ae55a827952251a.svg":{"logical_path":"flags/1x1/rs.svg","mtime":"2017-10-08T14:45:34+02:00","size":493892,"digest":"6af7605aa8aee1da6e0a75c750964b21b404011cd00f2df43ae55a827952251a","integrity":"sha256-avdgWqiu4dpuCnXHUJZLIbQEARzQDy30OuVagnlSJRo="},"flags/4x3/ru-2ba8996aa53f5eca5d1b0ea1a67d6d469659ac2523d1b394e3d6e25913bbbc15.svg":{"logical_path":"flags/4x3/ru.svg","mtime":"2017-10-08T14:45:34+02:00","size":309,"digest":"2ba8996aa53f5eca5d1b0ea1a67d6d469659ac2523d1b394e3d6e25913bbbc15","integrity":"sha256-K6iZaqU/XspdGw6hpn1tRpZZrCUj0bOU49biWRO7vBU="},"flags/1x1/ru-c8ecec77af983cd6ca10baaf2fa8f3dd67a6fa84f80cabdee10858910fdcc233.svg":{"logical_path":"flags/1x1/ru.svg","mtime":"2017-10-08T14:45:34+02:00","size":321,"digest":"c8ecec77af983cd6ca10baaf2fa8f3dd67a6fa84f80cabdee10858910fdcc233","integrity":"sha256-yOzsd6+YPNbKELqvL6jz3Wem+oT4DKve4QhYkQ/cwjM="},"flags/4x3/rw-0fa2c78359e9603d1cf21e4bb9355414ac3eed3635a25ba8f653d0498d61bd16.svg":{"logical_path":"flags/4x3/rw.svg","mtime":"2017-10-08T14:45:34+02:00","size":793,"digest":"0fa2c78359e9603d1cf21e4bb9355414ac3eed3635a25ba8f653d0498d61bd16","integrity":"sha256-D6LHg1npYD0c8h5LuTVUFKw+7TY1oluo9lPQSY1hvRY="},"flags/1x1/rw-61cce3e871326334478d73a379b202fc8548581abc02e39a898bc4fd16b2e0eb.svg":{"logical_path":"flags/1x1/rw.svg","mtime":"2017-10-08T14:45:34+02:00","size":795,"digest":"61cce3e871326334478d73a379b202fc8548581abc02e39a898bc4fd16b2e0eb","integrity":"sha256-Yczj6HEyYzRHjXOjebIC/IVIWBq8AuOaiYvE/Ray4Os="},"flags/4x3/sa-5aec890788f78356a42e38fe6ea2c30c4c82c99a3f05f654faae5918aae804c4.svg":{"logical_path":"flags/4x3/sa.svg","mtime":"2017-10-08T14:45:34+02:00","size":16083,"digest":"5aec890788f78356a42e38fe6ea2c30c4c82c99a3f05f654faae5918aae804c4","integrity":"sha256-WuyJB4j3g1akLjj+bqLDDEyCyZo/BfZU+q5ZGKroBMQ="},"flags/1x1/sa-57bf549298c1c3cb533120975d49b6cdb9c839addf278497d133236e666239f4.svg":{"logical_path":"flags/1x1/sa.svg","mtime":"2017-10-08T14:45:34+02:00","size":16334,"digest":"57bf549298c1c3cb533120975d49b6cdb9c839addf278497d133236e666239f4","integrity":"sha256-V79UkpjBw8tTMSCXXUm2zbnIOa3fJ4SX0TMjbmZiOfQ="},"flags/4x3/sb-3433de16f2b3f2a8373de87f879dd3b31ec8369256e23193947318976b51a182.svg":{"logical_path":"flags/4x3/sb.svg","mtime":"2017-10-08T14:45:34+02:00","size":1196,"digest":"3433de16f2b3f2a8373de87f879dd3b31ec8369256e23193947318976b51a182","integrity":"sha256-NDPeFvKz8qg3Peh/h53Tsx7INpJW4jGTlHMYl2tRoYI="},"flags/1x1/sb-e5352ddacf8edb727ef8f68dbb0951f00ae84b96e9b3b224cdf0c3ee2d33e8db.svg":{"logical_path":"flags/1x1/sb.svg","mtime":"2017-10-08T14:45:34+02:00","size":1221,"digest":"e5352ddacf8edb727ef8f68dbb0951f00ae84b96e9b3b224cdf0c3ee2d33e8db","integrity":"sha256-5TUt2s+O23J++PaNuwlR8AroS5bps7IkzfDD7i0z6Ns="},"flags/4x3/sc-9c1764a913e0577cadb24d11b883978389a818e94b39f6ac5cf4993dd041d501.svg":{"logical_path":"flags/4x3/sc.svg","mtime":"2017-10-08T14:45:34+02:00","size":591,"digest":"9c1764a913e0577cadb24d11b883978389a818e94b39f6ac5cf4993dd041d501","integrity":"sha256-nBdkqRPgV3ytsk0RuIOXg4moGOlLOfasXPSZPdBB1QE="},"flags/1x1/sc-c1abe18095ce0b84c2b21aa2453b916e00d8c0fd72fd5161f212e6bcf9c8ccd8.svg":{"logical_path":"flags/1x1/sc.svg","mtime":"2017-10-08T14:45:34+02:00","size":644,"digest":"c1abe18095ce0b84c2b21aa2453b916e00d8c0fd72fd5161f212e6bcf9c8ccd8","integrity":"sha256-wavhgJXOC4TCshqiRTuRbgDYwP1y/VFh8hLmvPnIzNg="},"flags/4x3/sd-df15037b269e643062988e5273f3cd5a379b18d0ff496bdac97e840deb0793bc.svg":{"logical_path":"flags/4x3/sd.svg","mtime":"2017-10-08T14:45:34+02:00","size":501,"digest":"df15037b269e643062988e5273f3cd5a379b18d0ff496bdac97e840deb0793bc","integrity":"sha256-3xUDeyaeZDBimI5Sc/PNWjebGND/SWvayX6EDesHk7w="},"flags/1x1/sd-baedc80da37d70ce8fa4d5619d85b4823435180311f0c2995717116e681c20d3.svg":{"logical_path":"flags/1x1/sd.svg","mtime":"2017-10-08T14:45:34+02:00","size":515,"digest":"baedc80da37d70ce8fa4d5619d85b4823435180311f0c2995717116e681c20d3","integrity":"sha256-uu3IDaN9cM6PpNVhnYW0gjQ1GAMR8MKZVxcRbmgcINM="},"flags/4x3/se-73964261d5ec45c856c9f7b57f1be90f60c5e748596e494aafa5facd817c7118.svg":{"logical_path":"flags/4x3/se.svg","mtime":"2017-10-08T14:45:34+02:00","size":765,"digest":"73964261d5ec45c856c9f7b57f1be90f60c5e748596e494aafa5facd817c7118","integrity":"sha256-c5ZCYdXsRchWyfe1fxvpD2DF50hZbklKr6X6zYF8cRg="},"flags/1x1/se-ea6d6caac7db4cfc8d68548f70afbf6ddbf072993e655bdb0b0860f724202e2b.svg":{"logical_path":"flags/1x1/se.svg","mtime":"2017-10-08T14:45:34+02:00","size":799,"digest":"ea6d6caac7db4cfc8d68548f70afbf6ddbf072993e655bdb0b0860f724202e2b","integrity":"sha256-6m1sqsfbTPyNaFSPcK+/bdvwcpk+ZVvbCwhg9yQgLis="},"flags/4x3/sg-2c8851a3c456051d7510b78da650054ee411ecdb01508ab3aa8ddac220de984a.svg":{"logical_path":"flags/4x3/sg.svg","mtime":"2017-10-08T14:45:34+02:00","size":1278,"digest":"2c8851a3c456051d7510b78da650054ee411ecdb01508ab3aa8ddac220de984a","integrity":"sha256-LIhRo8RWBR11ELeNplAFTuQR7NsBUIqzqo3awiDemEo="},"flags/1x1/sg-81517add5de364935b2173fd1ed3db2fefc22e07a072d03fd4f91e8543ffcb22.svg":{"logical_path":"flags/1x1/sg.svg","mtime":"2017-10-08T14:45:34+02:00","size":1373,"digest":"81517add5de364935b2173fd1ed3db2fefc22e07a072d03fd4f91e8543ffcb22","integrity":"sha256-gVF63V3jZJNbIXP9HtPbL+/CLgegctA/1PkehUP/yyI="},"flags/4x3/sh-cdfa61ab262caf8d6b13cc66f1d0e1e935dadb144d93ad28fcd850e9164c33d9.svg":{"logical_path":"flags/4x3/sh.svg","mtime":"2017-10-08T14:45:34+02:00","size":48963,"digest":"cdfa61ab262caf8d6b13cc66f1d0e1e935dadb144d93ad28fcd850e9164c33d9","integrity":"sha256-zfphqyYsr41rE8xm8dDh6TXa2xRNk60o/NhQ6RZMM9k="},"flags/1x1/sh-763ae01f8c0189641321a0de1085f0d1ceeb962d94bb989c6255dae4616fd14f.svg":{"logical_path":"flags/1x1/sh.svg","mtime":"2017-10-08T14:45:34+02:00","size":49731,"digest":"763ae01f8c0189641321a0de1085f0d1ceeb962d94bb989c6255dae4616fd14f","integrity":"sha256-djrgH4wBiWQTIaDeEIXw0c7rli2Uu5icYlXa5GFv0U8="},"flags/4x3/si-81f600f18fae95b3e2a6813cc012e94bdfd67965eb7ce1676780bc7d04f4f203.svg":{"logical_path":"flags/4x3/si.svg","mtime":"2017-10-08T14:45:34+02:00","size":2910,"digest":"81f600f18fae95b3e2a6813cc012e94bdfd67965eb7ce1676780bc7d04f4f203","integrity":"sha256-gfYA8Y+ulbPipoE8wBLpS9/WeWXrfOFnZ4C8fQT08gM="},"flags/1x1/si-6481bc748939a46efccac3df22ccc34341cc006d871a7ff521769c562a5325df.svg":{"logical_path":"flags/1x1/si.svg","mtime":"2017-10-08T14:45:34+02:00","size":2924,"digest":"6481bc748939a46efccac3df22ccc34341cc006d871a7ff521769c562a5325df","integrity":"sha256-ZIG8dIk5pG78ysPfIszDQ0HMAG2HGn/1IXacVipTJd8="},"flags/4x3/sj-8c78bb614796386f416c677e7ee2984c9997d0789306a9861e0d3f85edf62608.svg":{"logical_path":"flags/4x3/sj.svg","mtime":"2017-10-08T14:45:34+02:00","size":809,"digest":"8c78bb614796386f416c677e7ee2984c9997d0789306a9861e0d3f85edf62608","integrity":"sha256-jHi7YUeWOG9BbGd+fuKYTJmX0HiTBqmGHg0/he32Jgg="},"flags/1x1/sj-15448521086e54b5dc1b51bce3e8424a3282aaa539514a8d63fae537d400bc08.svg":{"logical_path":"flags/1x1/sj.svg","mtime":"2017-10-08T14:45:34+02:00","size":751,"digest":"15448521086e54b5dc1b51bce3e8424a3282aaa539514a8d63fae537d400bc08","integrity":"sha256-FUSFIQhuVLXcG1G84+hCSjKCqqU5UUqNY/rlN9QAvAg="},"flags/4x3/sk-271dd9219a226c5e9768072c3d0512b9ab07d1af59a3a5642eba620e3f53ea2c.svg":{"logical_path":"flags/4x3/sk.svg","mtime":"2017-10-08T14:45:34+02:00","size":1633,"digest":"271dd9219a226c5e9768072c3d0512b9ab07d1af59a3a5642eba620e3f53ea2c","integrity":"sha256-Jx3ZIZoibF6XaAcsPQUSuasH0a9Zo6VkLrpiDj9T6iw="},"flags/1x1/sk-4ee51ed995ad80a8f9a335b5f36b00a830da6e7065ecda1e84e427cf19dda736.svg":{"logical_path":"flags/1x1/sk.svg","mtime":"2017-10-08T14:45:34+02:00","size":1644,"digest":"4ee51ed995ad80a8f9a335b5f36b00a830da6e7065ecda1e84e427cf19dda736","integrity":"sha256-TuUe2ZWtgKj5ozW182sAqDDabnBl7NoehOQnzxndpzY="},"flags/4x3/sl-3fd8765025c44c215906c9d33be69326118f5025b35a93636df059926053c84c.svg":{"logical_path":"flags/4x3/sl.svg","mtime":"2017-10-08T14:45:34+02:00","size":340,"digest":"3fd8765025c44c215906c9d33be69326118f5025b35a93636df059926053c84c","integrity":"sha256-P9h2UCXETCFZBsnTO+aTJhGPUCWzWpNjbfBZkmBTyEw="},"flags/1x1/sl-ffbed472a2b3677e9339adfd150ffc76bbae85071cbf1b14f75c67b03fff29d8.svg":{"logical_path":"flags/1x1/sl.svg","mtime":"2017-10-08T14:45:34+02:00","size":454,"digest":"ffbed472a2b3677e9339adfd150ffc76bbae85071cbf1b14f75c67b03fff29d8","integrity":"sha256-/77UcqKzZ36TOa39FQ/8druuhQccvxsU91xnsD//Kdg="},"flags/4x3/sm-72df25d7ba785caa3201dc9ea30349a5bd3891de99e6d818bff2f34914264654.svg":{"logical_path":"flags/4x3/sm.svg","mtime":"2017-10-08T14:45:34+02:00","size":22920,"digest":"72df25d7ba785caa3201dc9ea30349a5bd3891de99e6d818bff2f34914264654","integrity":"sha256-ct8l17p4XKoyAdyeowNJpb04kd6Z5tgYv/LzSRQmRlQ="},"flags/1x1/sm-afa36059e43d3014dfc9088d30e86449b8463d282611b99f8d496aca155075c2.svg":{"logical_path":"flags/1x1/sm.svg","mtime":"2017-10-08T14:45:34+02:00","size":23051,"digest":"afa36059e43d3014dfc9088d30e86449b8463d282611b99f8d496aca155075c2","integrity":"sha256-r6NgWeQ9MBTfyQiNMOhkSbhGPSgmEbmfjUlqyhVQdcI="},"flags/4x3/sn-3465e8417cd4bd6d948ab2311442757688af8516c6aa7c4f73c48a9447087b8c.svg":{"logical_path":"flags/4x3/sn.svg","mtime":"2017-10-08T14:45:34+02:00","size":485,"digest":"3465e8417cd4bd6d948ab2311442757688af8516c6aa7c4f73c48a9447087b8c","integrity":"sha256-NGXoQXzUvW2UirIxFEJ1doivhRbGqnxPc8SKlEcIe4w="},"flags/1x1/sn-dfbe30abf15b2937f1b2de375b832ef3fe11e78f3536df35232b2f7265c00d9e.svg":{"logical_path":"flags/1x1/sn.svg","mtime":"2017-10-08T14:45:34+02:00","size":480,"digest":"dfbe30abf15b2937f1b2de375b832ef3fe11e78f3536df35232b2f7265c00d9e","integrity":"sha256-374wq/FbKTfxst43W4Mu8/4R5481Nt81IysvcmXADZ4="},"flags/4x3/so-16f7af15587913f17fd988f914c55de175ed1d4b2282ba2fa52b414c7359b440.svg":{"logical_path":"flags/4x3/so.svg","mtime":"2017-10-08T14:45:34+02:00","size":558,"digest":"16f7af15587913f17fd988f914c55de175ed1d4b2282ba2fa52b414c7359b440","integrity":"sha256-FvevFVh5E/F/2Yj5FMVd4XXtHUsigrovpStBTHNZtEA="},"flags/1x1/so-bbf08e60fbda4e45791d985450f6dbcd9ea779f93c818973271845dd01fc8df6.svg":{"logical_path":"flags/1x1/so.svg","mtime":"2017-10-08T14:45:34+02:00","size":571,"digest":"bbf08e60fbda4e45791d985450f6dbcd9ea779f93c818973271845dd01fc8df6","integrity":"sha256-u/COYPvaTkV5HZhUUPbbzZ6nefk8gYlzJxhF3QH8jfY="},"flags/4x3/sr-7718ec6fbe85ea55c72189bf0dc94b10f20a7948ab913903e5b8050af20e4f6f.svg":{"logical_path":"flags/4x3/sr.svg","mtime":"2017-10-08T14:45:34+02:00","size":331,"digest":"7718ec6fbe85ea55c72189bf0dc94b10f20a7948ab913903e5b8050af20e4f6f","integrity":"sha256-dxjsb76F6lXHIYm/DclLEPIKeUirkTkD5bgFCvIOT28="},"flags/1x1/sr-692dfcca46c35b618f0358ef0cc9b2ee7c27c839f98b12134318804f6498ceee.svg":{"logical_path":"flags/1x1/sr.svg","mtime":"2017-10-08T14:45:34+02:00","size":341,"digest":"692dfcca46c35b618f0358ef0cc9b2ee7c27c839f98b12134318804f6498ceee","integrity":"sha256-aS38ykbDW2GPA1jvDMmy7nwnyDn5ixITQxiAT2SYzu4="},"flags/4x3/ss-aebe3fc1b10d93add9906690e262b1baf5338529a832ff954e329c897e014e9c.svg":{"logical_path":"flags/4x3/ss.svg","mtime":"2017-10-08T14:45:34+02:00","size":406,"digest":"aebe3fc1b10d93add9906690e262b1baf5338529a832ff954e329c897e014e9c","integrity":"sha256-rr4/wbENk63ZkGaQ4mKxuvUzhSmoMv+VTjKciX4BTpw="},"flags/1x1/ss-1d0ebcb31f2c0fe874bd046253de4eec410239c2e0f41eb1cea1f312b51bc8a8.svg":{"logical_path":"flags/1x1/ss.svg","mtime":"2017-10-08T14:45:34+02:00","size":424,"digest":"1d0ebcb31f2c0fe874bd046253de4eec410239c2e0f41eb1cea1f312b51bc8a8","integrity":"sha256-HQ68sx8sD+h0vQRiU95O7EECOcLg9B6xzqHzErUbyKg="},"flags/4x3/st-b24fa19cb51844a3187239e3cbacf828f02e7b8ddf4b01e9ec3366e75966c5d6.svg":{"logical_path":"flags/4x3/st.svg","mtime":"2017-10-08T14:45:34+02:00","size":822,"digest":"b24fa19cb51844a3187239e3cbacf828f02e7b8ddf4b01e9ec3366e75966c5d6","integrity":"sha256-sk+hnLUYRKMYcjnjy6z4KPAue43fSwHp7DNm51lmxdY="},"flags/1x1/st-d4d96bc9009e10cec6a00ce0d6fae3746ddefce867f63503595110b2fd539d17.svg":{"logical_path":"flags/1x1/st.svg","mtime":"2017-10-08T14:45:34+02:00","size":790,"digest":"d4d96bc9009e10cec6a00ce0d6fae3746ddefce867f63503595110b2fd539d17","integrity":"sha256-1NlryQCeEM7GoAzg1vrjdG3e/Ohn9jUDWVEQsv1TnRc="},"flags/4x3/sv-cd0c1acd571abd1756fc4e7eea2369c0466265b1d170a7a3618a66800ddbb4c2.svg":{"logical_path":"flags/4x3/sv.svg","mtime":"2017-10-08T14:45:34+02:00","size":129725,"digest":"cd0c1acd571abd1756fc4e7eea2369c0466265b1d170a7a3618a66800ddbb4c2","integrity":"sha256-zQwazVcavRdW/E5+6iNpwEZiZbHRcKejYYpmgA3btMI="},"flags/1x1/sv-e86857616aaa7fc022b68dafd4a58d4be7ddfcc6d5b2c3d5dad67b457d1e75c9.svg":{"logical_path":"flags/1x1/sv.svg","mtime":"2017-10-08T14:45:34+02:00","size":129880,"digest":"e86857616aaa7fc022b68dafd4a58d4be7ddfcc6d5b2c3d5dad67b457d1e75c9","integrity":"sha256-6GhXYWqqf8Aito2v1KWNS+fd/MbVssPV2tZ7RX0edck="},"flags/4x3/sx-7ed9e6d8c02b265181248986ccd927f6540a7d55b4ec82b60baef06face66ee1.svg":{"logical_path":"flags/4x3/sx.svg","mtime":"2017-10-08T14:45:34+02:00","size":19945,"digest":"7ed9e6d8c02b265181248986ccd927f6540a7d55b4ec82b60baef06face66ee1","integrity":"sha256-ftnm2MArJlGBJImGzNkn9lQKfVW07IK2C67wb6zmbuE="},"flags/1x1/sx-09ab7415791d37231c9fb79b51fc52583407d7721e6f401cc98fc1ab12d2b62d.svg":{"logical_path":"flags/1x1/sx.svg","mtime":"2017-10-08T14:45:34+02:00","size":19770,"digest":"09ab7415791d37231c9fb79b51fc52583407d7721e6f401cc98fc1ab12d2b62d","integrity":"sha256-Cat0FXkdNyMcn7ebUfxSWDQH13Ieb0AcyY/BqxLSti0="},"flags/4x3/sy-49bb1803affb9e4ee070fb6e333a445f6df15ac11db6abe0a62f1aa922fe3c16.svg":{"logical_path":"flags/4x3/sy.svg","mtime":"2017-10-08T14:45:34+02:00","size":1029,"digest":"49bb1803affb9e4ee070fb6e333a445f6df15ac11db6abe0a62f1aa922fe3c16","integrity":"sha256-SbsYA6/7nk7gcPtuMzpEX23xWsEdtqvgpi8aqSL+PBY="},"flags/1x1/sy-b52b5ed6037c8e0e0a3ecd13006b79027d5fac2059fdd54109b591e5c5ada752.svg":{"logical_path":"flags/1x1/sy.svg","mtime":"2017-10-08T14:45:34+02:00","size":1193,"digest":"b52b5ed6037c8e0e0a3ecd13006b79027d5fac2059fdd54109b591e5c5ada752","integrity":"sha256-tSte1gN8jg4KPs0TAGt5An1frCBZ/dVBCbWR5cWtp1I="},"flags/4x3/sz-a545e703e03ec7f9e108fa348d9e222aba1d7514bad2786f9ca8c6c3063a0e68.svg":{"logical_path":"flags/4x3/sz.svg","mtime":"2017-10-08T14:45:34+02:00","size":9230,"digest":"a545e703e03ec7f9e108fa348d9e222aba1d7514bad2786f9ca8c6c3063a0e68","integrity":"sha256-pUXnA+A+x/nhCPo0jZ4iKroddRS60nhvnKjGwwY6Dmg="},"flags/1x1/sz-784ee11c6629bc411d3e274eea68a3739ddfaa4c3bd18e46e62262518ae0b93e.svg":{"logical_path":"flags/1x1/sz.svg","mtime":"2017-10-08T14:45:34+02:00","size":9135,"digest":"784ee11c6629bc411d3e274eea68a3739ddfaa4c3bd18e46e62262518ae0b93e","integrity":"sha256-eE7hHGYpvEEdPidO6mijc53fqkw70Y5G5iJiUYrguT4="},"flags/4x3/tc-a20d2d87632b3c19e16a599dd45f3918a5f2db3025867c5f1b279050af68f637.svg":{"logical_path":"flags/4x3/tc.svg","mtime":"2017-10-08T14:45:34+02:00","size":19596,"digest":"a20d2d87632b3c19e16a599dd45f3918a5f2db3025867c5f1b279050af68f637","integrity":"sha256-og0th2MrPBnhalmd1F85GKXy2zAlhnxfGyeQUK9o9jc="},"flags/1x1/tc-4c7c0e4227d06fb697b8c5ec5f95382b1549342013ea80211f2942f81d472d5a.svg":{"logical_path":"flags/1x1/tc.svg","mtime":"2017-10-08T14:45:34+02:00","size":19881,"digest":"4c7c0e4227d06fb697b8c5ec5f95382b1549342013ea80211f2942f81d472d5a","integrity":"sha256-THwOQifQb7aXuMXsX5U4KxVJNCAT6oAhHylC+B1HLVo="},"flags/4x3/td-1b92327abb7d3ba9b54361f6a38018979e57d5083990af57adac25102146b939.svg":{"logical_path":"flags/4x3/td.svg","mtime":"2017-10-08T14:45:34+02:00","size":342,"digest":"1b92327abb7d3ba9b54361f6a38018979e57d5083990af57adac25102146b939","integrity":"sha256-G5Iyert9O6m1Q2H2o4AYl55X1Qg5kK9XrawlECFGuTk="},"flags/1x1/td-977813c5dfc3b6b640d1390c04c469cf92e84827ca06ed7f4984a58782a059c5.svg":{"logical_path":"flags/1x1/td.svg","mtime":"2017-10-08T14:45:34+02:00","size":294,"digest":"977813c5dfc3b6b640d1390c04c469cf92e84827ca06ed7f4984a58782a059c5","integrity":"sha256-l3gTxd/DtrZA0TkMBMRpz5LoSCfKBu1/SYSlh4KgWcU="},"flags/4x3/tf-f45e133cfa8a01239d65e1693492ca1de1949f3660de77d802b41c9a9fc662e8.svg":{"logical_path":"flags/4x3/tf.svg","mtime":"2017-10-08T14:45:34+02:00","size":1130,"digest":"f45e133cfa8a01239d65e1693492ca1de1949f3660de77d802b41c9a9fc662e8","integrity":"sha256-9F4TPPqKASOdZeFpNJLKHeGUnzZg3nfYArQcmp/GYug="},"flags/1x1/tf-53581d6af7751cf4c126459a2226fd19cd10040d25e33d1653ece9e57a1a0e2b.svg":{"logical_path":"flags/1x1/tf.svg","mtime":"2017-10-08T14:45:34+02:00","size":1303,"digest":"53581d6af7751cf4c126459a2226fd19cd10040d25e33d1653ece9e57a1a0e2b","integrity":"sha256-U1gdavd1HPTBJkWaIib9Gc0QBA0l4z0WU+zp5XoaDis="},"flags/4x3/tg-de9fe13020d702ce964ff7d712c6b6a3a57c3933f56fbd0c783fe0309f0dbae3.svg":{"logical_path":"flags/4x3/tg.svg","mtime":"2017-10-08T14:45:34+02:00","size":831,"digest":"de9fe13020d702ce964ff7d712c6b6a3a57c3933f56fbd0c783fe0309f0dbae3","integrity":"sha256-3p/hMCDXAs6WT/fXEsa2o6V8OTP1b70MeD/gMJ8NuuM="},"flags/1x1/tg-92f575529494b0ba885e47302167a14343c1fd78fef5008ec3aacde7f840fd23.svg":{"logical_path":"flags/1x1/tg.svg","mtime":"2017-10-08T14:45:34+02:00","size":839,"digest":"92f575529494b0ba885e47302167a14343c1fd78fef5008ec3aacde7f840fd23","integrity":"sha256-kvV1UpSUsLqIXkcwIWehQ0PB/Xj+9QCOw6rN5/hA/SM="},"flags/4x3/th-6211c6caabbc4fdd4ff054cb689406bc9cc7816c01d482a6222e873b0e8fc9b0.svg":{"logical_path":"flags/4x3/th.svg","mtime":"2017-10-08T14:45:34+02:00","size":312,"digest":"6211c6caabbc4fdd4ff054cb689406bc9cc7816c01d482a6222e873b0e8fc9b0","integrity":"sha256-YhHGyqu8T91P8FTLaJQGvJzHgWwB1IKmIi6HOw6PybA="},"flags/1x1/th-b8a0cf7c820f9010ce12333bfa7f8713358dee291bc955fa7e5333fcf5fc8a07.svg":{"logical_path":"flags/1x1/th.svg","mtime":"2017-10-08T14:45:34+02:00","size":311,"digest":"b8a0cf7c820f9010ce12333bfa7f8713358dee291bc955fa7e5333fcf5fc8a07","integrity":"sha256-uKDPfIIPkBDOEjM7+n+HEzWN7ikbyVX6flMz/PX8igc="},"flags/4x3/tj-4bf387aa434be996fc00be6dbb457282e311ff6c7538a484f5cb4d99e45b0747.svg":{"logical_path":"flags/4x3/tj.svg","mtime":"2017-10-08T14:45:34+02:00","size":2023,"digest":"4bf387aa434be996fc00be6dbb457282e311ff6c7538a484f5cb4d99e45b0747","integrity":"sha256-S/OHqkNL6Zb8AL5tu0VyguMR/2x1OKSE9ctNmeRbB0c="},"flags/1x1/tj-b371ab0647e7dfba73251169fe1e3180058d6556aa7293b7b573eaf43add617d.svg":{"logical_path":"flags/1x1/tj.svg","mtime":"2017-10-08T14:45:34+02:00","size":1908,"digest":"b371ab0647e7dfba73251169fe1e3180058d6556aa7293b7b573eaf43add617d","integrity":"sha256-s3GrBkfn37pzJRFp/h4xgAWNZVaqcpO3tXPq9DrdYX0="},"flags/4x3/tk-cef6e368398b0cbaa4ee0b943d02155c51f9e8ab5ba27b9562ccd629f9a72183.svg":{"logical_path":"flags/4x3/tk.svg","mtime":"2017-10-08T14:45:34+02:00","size":841,"digest":"cef6e368398b0cbaa4ee0b943d02155c51f9e8ab5ba27b9562ccd629f9a72183","integrity":"sha256-zvbjaDmLDLqk7guUPQIVXFH56KtbonuVYszWKfmnIYM="},"flags/1x1/tk-1544aef42090102ba2e154b48f8c059dfddd5789fc5f12aa859939c41673a661.svg":{"logical_path":"flags/1x1/tk.svg","mtime":"2017-10-08T14:45:34+02:00","size":840,"digest":"1544aef42090102ba2e154b48f8c059dfddd5789fc5f12aa859939c41673a661","integrity":"sha256-FUSu9CCQECui4VS0j4wFnf3dV4n8XxKqhZk5xBZzpmE="},"flags/4x3/tl-cd74f59871cf5453b4e9454a4820e683c06dc8c9c84dae4c47af9264bed7ab22.svg":{"logical_path":"flags/4x3/tl.svg","mtime":"2017-10-08T14:45:34+02:00","size":658,"digest":"cd74f59871cf5453b4e9454a4820e683c06dc8c9c84dae4c47af9264bed7ab22","integrity":"sha256-zXT1mHHPVFO06UVKSCDmg8BtyMnITa5MR6+SZL7XqyI="},"flags/1x1/tl-a7cd9977244579380914f288bf358ec8b1b0abec6b8dc99e65cc35afe41bc405.svg":{"logical_path":"flags/1x1/tl.svg","mtime":"2017-10-08T14:45:34+02:00","size":675,"digest":"a7cd9977244579380914f288bf358ec8b1b0abec6b8dc99e65cc35afe41bc405","integrity":"sha256-p82ZdyRFeTgJFPKIvzWOyLGwq+xrjcmeZcw1r+QbxAU="},"flags/4x3/tm-3db83810be6239a1c7e594a0b11a4847a7d300cc54e12e4cf4c8a9558520dd67.svg":{"logical_path":"flags/4x3/tm.svg","mtime":"2017-10-08T14:45:34+02:00","size":45153,"digest":"3db83810be6239a1c7e594a0b11a4847a7d300cc54e12e4cf4c8a9558520dd67","integrity":"sha256-Pbg4EL5iOaHH5ZSgsRpIR6fTAMxU4S5M9MipVYUg3Wc="},"flags/1x1/tm-ade1696d2299d73cc6fa06304144055f9a02c1800846516c4e21baba2a05d4cf.svg":{"logical_path":"flags/1x1/tm.svg","mtime":"2017-10-08T14:45:34+02:00","size":45051,"digest":"ade1696d2299d73cc6fa06304144055f9a02c1800846516c4e21baba2a05d4cf","integrity":"sha256-reFpbSKZ1zzG+gYwQUQFX5oCwYAIRlFsTiG6uioF1M8="},"flags/4x3/tn-17e7bc4e9dad2da8f12c95c56de46b21890b9d1c725ba400fa7d8df17d59fd4d.svg":{"logical_path":"flags/4x3/tn.svg","mtime":"2017-10-08T14:45:34+02:00","size":984,"digest":"17e7bc4e9dad2da8f12c95c56de46b21890b9d1c725ba400fa7d8df17d59fd4d","integrity":"sha256-F+e8Tp2tLajxLJXFbeRrIYkLnRxyW6QA+n2N8X1Z/U0="},"flags/1x1/tn-55604ef719cd538ba0e2541667d4c52b08f18efe91bb52ad0954802d38ea12f7.svg":{"logical_path":"flags/1x1/tn.svg","mtime":"2017-10-08T14:45:34+02:00","size":957,"digest":"55604ef719cd538ba0e2541667d4c52b08f18efe91bb52ad0954802d38ea12f7","integrity":"sha256-VWBO9xnNU4ug4lQWZ9TFKwjxjv6Ru1KtCVSALTjqEvc="},"flags/4x3/to-db07012009b9d6ac0c8eca209a68c310d9371771cca8c6c4c2022b3db1ba39d9.svg":{"logical_path":"flags/4x3/to.svg","mtime":"2017-10-08T14:45:34+02:00","size":385,"digest":"db07012009b9d6ac0c8eca209a68c310d9371771cca8c6c4c2022b3db1ba39d9","integrity":"sha256-2wcBIAm51qwMjsogmmjDENk3F3HMqMbEwgIrPbG6Odk="},"flags/1x1/to-1ed20c5d05424776b5d3cc17487ed8311998cb69db89109a380d59722d4bc2bc.svg":{"logical_path":"flags/1x1/to.svg","mtime":"2017-10-08T14:45:34+02:00","size":387,"digest":"1ed20c5d05424776b5d3cc17487ed8311998cb69db89109a380d59722d4bc2bc","integrity":"sha256-HtIMXQVCR3a108wXSH7YMRmYy2nbiRCaOA1Zci1Lwrw="},"flags/4x3/tr-b8b3b6850c4c0ffa840db30c814dce6cb86e00e78138bafe8c2c58d263fb4503.svg":{"logical_path":"flags/4x3/tr.svg","mtime":"2017-10-08T14:45:34+02:00","size":688,"digest":"b8b3b6850c4c0ffa840db30c814dce6cb86e00e78138bafe8c2c58d263fb4503","integrity":"sha256-uLO2hQxMD/qEDbMMgU3ObLhuAOeBOLr+jCxY0mP7RQM="},"flags/1x1/tr-be0c612d78c2662c4e9c0dc836b63c8a7a5cfff48afc533f81c2ba2423542f5e.svg":{"logical_path":"flags/1x1/tr.svg","mtime":"2017-10-08T14:45:34+02:00","size":690,"digest":"be0c612d78c2662c4e9c0dc836b63c8a7a5cfff48afc533f81c2ba2423542f5e","integrity":"sha256-vgxhLXjCZixOnA3INrY8inpc//SK/FM/gcK6JCNUL14="},"flags/4x3/tt-05d9799b6519267990dccbc997c620c6478e00a96a79841494707cc3d036a381.svg":{"logical_path":"flags/4x3/tt.svg","mtime":"2017-10-08T14:45:34+02:00","size":365,"digest":"05d9799b6519267990dccbc997c620c6478e00a96a79841494707cc3d036a381","integrity":"sha256-Bdl5m2UZJnmQ3MvJl8YgxkeOAKlqeYQUlHB8w9A2o4E="},"flags/1x1/tt-4ab2fff1efee93f41060975098c5c11e043dc0853456c8c0c70cacd4ba92e8ed.svg":{"logical_path":"flags/1x1/tt.svg","mtime":"2017-10-08T14:45:34+02:00","size":393,"digest":"4ab2fff1efee93f41060975098c5c11e043dc0853456c8c0c70cacd4ba92e8ed","integrity":"sha256-SrL/8e/uk/QQYJdQmMXBHgQ9wIU0VsjAxwys1LqS6O0="},"flags/4x3/tv-14be4bb5a1fe44a8d3d58bde3dca6c63ed2974554c2008b4a2441a096c9f1fea.svg":{"logical_path":"flags/4x3/tv.svg","mtime":"2017-10-08T14:45:34+02:00","size":2957,"digest":"14be4bb5a1fe44a8d3d58bde3dca6c63ed2974554c2008b4a2441a096c9f1fea","integrity":"sha256-FL5LtaH+RKjT1YvePcpsY+0pdFVMIAi0okQaCWyfH+o="},"flags/1x1/tv-71e98b9502d12d655a169e8c89de6d5b2fcc957d67d0b7e93dd2be8ff9e6f2a8.svg":{"logical_path":"flags/1x1/tv.svg","mtime":"2017-10-08T14:45:34+02:00","size":2956,"digest":"71e98b9502d12d655a169e8c89de6d5b2fcc957d67d0b7e93dd2be8ff9e6f2a8","integrity":"sha256-cemLlQLRLWVaFp6Mid5tWy/MlX1n0LfpPdK+j/nm8qg="},"flags/4x3/tw-3b699e4e60f9765601c0f84bbf3f16f953f5a454a0cf62487a0eef358f456e66.svg":{"logical_path":"flags/4x3/tw.svg","mtime":"2017-10-08T14:45:34+02:00","size":1252,"digest":"3b699e4e60f9765601c0f84bbf3f16f953f5a454a0cf62487a0eef358f456e66","integrity":"sha256-O2meTmD5dlYBwPhLvz8W+VP1pFSgz2JIeg7vNY9FbmY="},"flags/1x1/tw-62cd36c5fc2aff70bbd11312601821ca09729e9e246e32d895e0f4a2017ac0b6.svg":{"logical_path":"flags/1x1/tw.svg","mtime":"2017-10-08T14:45:34+02:00","size":1228,"digest":"62cd36c5fc2aff70bbd11312601821ca09729e9e246e32d895e0f4a2017ac0b6","integrity":"sha256-Ys02xfwq/3C70RMSYBghyglynp4kbjLYleD0ogF6wLY="},"flags/4x3/tz-f219bcd0e3536ea3653178e0281620ebfe4c5b3b461c2c79fdf2b2a852de372e.svg":{"logical_path":"flags/4x3/tz.svg","mtime":"2017-10-08T14:45:34+02:00","size":582,"digest":"f219bcd0e3536ea3653178e0281620ebfe4c5b3b461c2c79fdf2b2a852de372e","integrity":"sha256-8hm80ONTbqNlMXjgKBYg6/5MWztGHCx5/fKyqFLeNy4="},"flags/1x1/tz-2829d5fc4fcdf2e6a149f63ea6b5a5f1af7b6b08fec523ec217ab5a6d9fb7e77.svg":{"logical_path":"flags/1x1/tz.svg","mtime":"2017-10-08T14:45:34+02:00","size":692,"digest":"2829d5fc4fcdf2e6a149f63ea6b5a5f1af7b6b08fec523ec217ab5a6d9fb7e77","integrity":"sha256-KCnV/E/N8uahSfY+prWl8a97awj+xSPsIXq1ptn7fnc="},"flags/4x3/ua-07199c03990a6b4f285e421d928ab4dba2dfdfdb3e40dd9bfa207c86bc0f3c9d.svg":{"logical_path":"flags/4x3/ua.svg","mtime":"2017-10-08T14:45:34+02:00","size":253,"digest":"07199c03990a6b4f285e421d928ab4dba2dfdfdb3e40dd9bfa207c86bc0f3c9d","integrity":"sha256-BxmcA5kKa08oXkIdkoq026Lf39s+QN2b+iB8hrwPPJ0="},"flags/1x1/ua-7c939efc452c13b0f8f489f3dfd37d3eba97c0f577c97f0b6673968af62a3207.svg":{"logical_path":"flags/1x1/ua.svg","mtime":"2017-10-08T14:45:34+02:00","size":261,"digest":"7c939efc452c13b0f8f489f3dfd37d3eba97c0f577c97f0b6673968af62a3207","integrity":"sha256-fJOe/EUsE7D49Inz39N9PrqXwPV3yX8LZnOWivYqMgc="},"flags/4x3/ug-48c6cbeae1a865915dd5a06f56bdd576e9ed9ce5085b627ef31f3757c0937a5d.svg":{"logical_path":"flags/4x3/ug.svg","mtime":"2017-10-08T14:45:34+02:00","size":5381,"digest":"48c6cbeae1a865915dd5a06f56bdd576e9ed9ce5085b627ef31f3757c0937a5d","integrity":"sha256-SMbL6uGoZZFd1aBvVr3VduntnOUIW2J+8x83V8CTel0="},"flags/1x1/ug-da6257aa7e40121a6e8e574bf201701910bbd838cbc8d76030397c0f34ae906b.svg":{"logical_path":"flags/1x1/ug.svg","mtime":"2017-10-08T14:45:34+02:00","size":5316,"digest":"da6257aa7e40121a6e8e574bf201701910bbd838cbc8d76030397c0f34ae906b","integrity":"sha256-2mJXqn5AEhpujldL8gFwGRC72DjLyNdgMDl8DzSukGs="},"flags/4x3/um-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg":{"logical_path":"flags/4x3/um.svg","mtime":"2017-10-08T14:45:34+02:00","size":6989,"digest":"6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7","integrity":"sha256-bQU/TW4UEnRXSfyNmBgz1tf48ZtyBC0aZeM1bKKafvc="},"flags/1x1/um-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg":{"logical_path":"flags/1x1/um.svg","mtime":"2017-10-08T14:45:34+02:00","size":6201,"digest":"5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435","integrity":"sha256-W89dQaptX9v8kgoBT8d9bNvfN7205n2/5o7RYbrkpDU="},"flags/4x3/us-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg":{"logical_path":"flags/4x3/us.svg","mtime":"2017-10-08T14:45:34+02:00","size":6989,"digest":"6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7","integrity":"sha256-bQU/TW4UEnRXSfyNmBgz1tf48ZtyBC0aZeM1bKKafvc="},"flags/1x1/us-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg":{"logical_path":"flags/1x1/us.svg","mtime":"2017-10-08T14:45:34+02:00","size":6201,"digest":"5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435","integrity":"sha256-W89dQaptX9v8kgoBT8d9bNvfN7205n2/5o7RYbrkpDU="},"flags/4x3/uy-3fc569672f687b4f08581179bea609b616d4b5c7d9524df918134fbcdfce6f9f.svg":{"logical_path":"flags/4x3/uy.svg","mtime":"2017-10-08T14:45:34+02:00","size":1753,"digest":"3fc569672f687b4f08581179bea609b616d4b5c7d9524df918134fbcdfce6f9f","integrity":"sha256-P8VpZy9oe08IWBF5vqYJthbUtcfZUk35GBNPvN/Ob58="},"flags/1x1/uy-90def9dd4890c96d1b6355d0bbcebe2a6f25e2bb3bbdc29c4fbba8a5fc601254.svg":{"logical_path":"flags/1x1/uy.svg","mtime":"2017-10-08T14:45:34+02:00","size":1758,"digest":"90def9dd4890c96d1b6355d0bbcebe2a6f25e2bb3bbdc29c4fbba8a5fc601254","integrity":"sha256-kN753UiQyW0bY1XQu86+Km8l4rs7vcKcT7uopfxgElQ="},"flags/4x3/uz-e3f628aff038df64725d75a863bc636ae9da4a16f58850ad86470cc012e3a40f.svg":{"logical_path":"flags/4x3/uz.svg","mtime":"2017-10-08T14:45:34+02:00","size":1465,"digest":"e3f628aff038df64725d75a863bc636ae9da4a16f58850ad86470cc012e3a40f","integrity":"sha256-4/Yor/A432RyXXWoY7xjaunaShb1iFCthkcMwBLjpA8="},"flags/1x1/uz-db8cba32635e9c36565f28fbd6b17e1e5afe26ce0af8560eeda3f9d815ecc749.svg":{"logical_path":"flags/1x1/uz.svg","mtime":"2017-10-08T14:45:34+02:00","size":1487,"digest":"db8cba32635e9c36565f28fbd6b17e1e5afe26ce0af8560eeda3f9d815ecc749","integrity":"sha256-24y6MmNenDZWXyj71rF+Hlr+Js4K+FYO7aP52BXsx0k="},"flags/4x3/va-c8b81b061cbe7a9b0b5f376e10f1a863b4609c742dbb5663ef923b80d43984a2.svg":{"logical_path":"flags/4x3/va.svg","mtime":"2017-10-08T14:45:34+02:00","size":114058,"digest":"c8b81b061cbe7a9b0b5f376e10f1a863b4609c742dbb5663ef923b80d43984a2","integrity":"sha256-yLgbBhy+epsLXzduEPGoY7RgnHQtu1Zj75I7gNQ5hKI="},"flags/1x1/va-d267dbb1213d75780a8d41a34f9eba098a66973c1c2e7d974257f24b4be9df1c.svg":{"logical_path":"flags/1x1/va.svg","mtime":"2017-10-08T14:45:34+02:00","size":113397,"digest":"d267dbb1213d75780a8d41a34f9eba098a66973c1c2e7d974257f24b4be9df1c","integrity":"sha256-0mfbsSE9dXgKjUGjT566CYpmlzwcLn2XQlfyS0vp3xw="},"flags/4x3/vc-a578edb2904169d050107b4c02051531e4164120c4ac0ad19faabd41fccdd821.svg":{"logical_path":"flags/4x3/vc.svg","mtime":"2017-10-08T14:45:34+02:00","size":518,"digest":"a578edb2904169d050107b4c02051531e4164120c4ac0ad19faabd41fccdd821","integrity":"sha256-pXjtspBBadBQEHtMAgUVMeQWQSDErArRn6q9QfzN2CE="},"flags/1x1/vc-85bbaa2c82ed6a9e077e73501bbf071956c761a897d1c4e1bbe061ad5ca9c0ed.svg":{"logical_path":"flags/1x1/vc.svg","mtime":"2017-10-08T14:45:34+02:00","size":597,"digest":"85bbaa2c82ed6a9e077e73501bbf071956c761a897d1c4e1bbe061ad5ca9c0ed","integrity":"sha256-hbuqLILtap4HfnNQG78HGVbHYaiX0cThu+BhrVypwO0="},"flags/4x3/ve-77718854ace7f0a8d8a087e331112e4b20f76e9ca7eeb9af41bacccef09bc9b4.svg":{"logical_path":"flags/4x3/ve.svg","mtime":"2017-10-08T14:45:34+02:00","size":1199,"digest":"77718854ace7f0a8d8a087e331112e4b20f76e9ca7eeb9af41bacccef09bc9b4","integrity":"sha256-d3GIVKzn8KjYoIfjMREuSyD3bpyn7rmvQbrMzvCbybQ="},"flags/1x1/ve-27cf5f75e9b842c417f62e3c3c502acafb67db674d5a1eba8709371c186f0fe9.svg":{"logical_path":"flags/1x1/ve.svg","mtime":"2017-10-08T14:45:34+02:00","size":1229,"digest":"27cf5f75e9b842c417f62e3c3c502acafb67db674d5a1eba8709371c186f0fe9","integrity":"sha256-J89fdem4QsQX9i48PFAqyvtn22dNWh66hwk3HBhvD+k="},"flags/4x3/vg-cefdd08a49ab6cf0ce32bf42cb7a72513dfd0a1619bac86ebedee3a86fa35c80.svg":{"logical_path":"flags/4x3/vg.svg","mtime":"2017-10-08T14:45:34+02:00","size":34914,"digest":"cefdd08a49ab6cf0ce32bf42cb7a72513dfd0a1619bac86ebedee3a86fa35c80","integrity":"sha256-zv3QikmrbPDOMr9Cy3pyUT39ChYZushuvt7jqG+jXIA="},"flags/1x1/vg-45357a28f1dc16c13df5cfc44454ff28f082b90a4747898d27575650bc93cb1e.svg":{"logical_path":"flags/1x1/vg.svg","mtime":"2017-10-08T14:45:34+02:00","size":34418,"digest":"45357a28f1dc16c13df5cfc44454ff28f082b90a4747898d27575650bc93cb1e","integrity":"sha256-RTV6KPHcFsE99c/ERFT/KPCCuQpHR4mNJ1dWULyTyx4="},"flags/4x3/vi-a83bcb200832191afa4091bf2c275289aa37f664027dfce6db6b0f7109fe3b6a.svg":{"logical_path":"flags/4x3/vi.svg","mtime":"2017-10-08T14:45:34+02:00","size":12347,"digest":"a83bcb200832191afa4091bf2c275289aa37f664027dfce6db6b0f7109fe3b6a","integrity":"sha256-qDvLIAgyGRr6QJG/LCdSiao39mQCffzm22sPcQn+O2o="},"flags/1x1/vi-cf017aea4123b31f1cf60087c4742b6d57a4213bece5b3f760e16a84a811a74c.svg":{"logical_path":"flags/1x1/vi.svg","mtime":"2017-10-08T14:45:34+02:00","size":12314,"digest":"cf017aea4123b31f1cf60087c4742b6d57a4213bece5b3f760e16a84a811a74c","integrity":"sha256-zwF66kEjsx8c9gCHxHQrbVekITvs5bP3YOFqhKgRp0w="},"flags/4x3/vn-16730ca8238b081b7376fc3829eaac4ddd61a5b423c24c9f07c9a02848c4827f.svg":{"logical_path":"flags/4x3/vn.svg","mtime":"2017-10-08T14:45:34+02:00","size":560,"digest":"16730ca8238b081b7376fc3829eaac4ddd61a5b423c24c9f07c9a02848c4827f","integrity":"sha256-FnMMqCOLCBtzdvw4KeqsTd1hpbQjwkyfB8mgKEjEgn8="},"flags/1x1/vn-fa15ba0b7d997046ffb7f2469f1254f7119503f2e95b35467151a947ff9b45d6.svg":{"logical_path":"flags/1x1/vn.svg","mtime":"2017-10-08T14:45:34+02:00","size":571,"digest":"fa15ba0b7d997046ffb7f2469f1254f7119503f2e95b35467151a947ff9b45d6","integrity":"sha256-+hW6C32ZcEb/t/JGnxJU9xGVA/LpWzVGcVGpR/+bRdY="},"flags/4x3/vu-4e084d69e403d0af11dfc47f622fb2ba88649b17b2038f6ebf533ce3c9907404.svg":{"logical_path":"flags/4x3/vu.svg","mtime":"2017-10-08T14:45:34+02:00","size":5820,"digest":"4e084d69e403d0af11dfc47f622fb2ba88649b17b2038f6ebf533ce3c9907404","integrity":"sha256-TghNaeQD0K8R38R/Yi+yuohkmxeyA49uv1M848mQdAQ="},"flags/1x1/vu-3c93d045c0ec3c08c0e9af785016995cbd7a28ddf08ec9abfce0e39c4e842058.svg":{"logical_path":"flags/1x1/vu.svg","mtime":"2017-10-08T14:45:34+02:00","size":5783,"digest":"3c93d045c0ec3c08c0e9af785016995cbd7a28ddf08ec9abfce0e39c4e842058","integrity":"sha256-PJPQRcDsPAjA6a94UBaZXL16KN3wjsmr/ODjnE6EIFg="},"flags/4x3/wf-039b39c2ab1d92470427e12e2310b2ad9d8a97a36a064b197858a083f5d7fd23.svg":{"logical_path":"flags/4x3/wf.svg","mtime":"2017-10-08T14:45:34+02:00","size":322,"digest":"039b39c2ab1d92470427e12e2310b2ad9d8a97a36a064b197858a083f5d7fd23","integrity":"sha256-A5s5wqsdkkcEJ+EuIxCyrZ2Kl6NqBksZeFigg/XX/SM="},"flags/1x1/wf-94672c2e6f10547f0023b9f0fff3adfda4d60f91340f287767f1ce68e5a57a12.svg":{"logical_path":"flags/1x1/wf.svg","mtime":"2017-10-08T14:45:34+02:00","size":310,"digest":"94672c2e6f10547f0023b9f0fff3adfda4d60f91340f287767f1ce68e5a57a12","integrity":"sha256-lGcsLm8QVH8AI7nw//Ot/aTWD5E0Dyh3Z/HOaOWlehI="},"flags/4x3/ws-f91aa288555a505b3e965c781de8207e2cb6e1d165603c80c54cfb111d277874.svg":{"logical_path":"flags/4x3/ws.svg","mtime":"2017-10-08T14:45:34+02:00","size":901,"digest":"f91aa288555a505b3e965c781de8207e2cb6e1d165603c80c54cfb111d277874","integrity":"sha256-+RqiiFVaUFs+llx4Heggfiy24dFlYDyAxUz7ER0neHQ="},"flags/1x1/ws-e6b2a35c9702941a1fe9d84ab2bf8b28b4931b6fce24efb4ce63d3a8fb8c3b90.svg":{"logical_path":"flags/1x1/ws.svg","mtime":"2017-10-08T14:45:34+02:00","size":879,"digest":"e6b2a35c9702941a1fe9d84ab2bf8b28b4931b6fce24efb4ce63d3a8fb8c3b90","integrity":"sha256-5rKjXJcClBof6dhKsr+LKLSTG2/OJO+0zmPTqPuMO5A="},"flags/4x3/ye-f3c80f7f99e1f12a079fe0d96830005657aff1687da92391c0acb882b014ff8c.svg":{"logical_path":"flags/4x3/ye.svg","mtime":"2017-10-08T14:45:34+02:00","size":287,"digest":"f3c80f7f99e1f12a079fe0d96830005657aff1687da92391c0acb882b014ff8c","integrity":"sha256-88gPf5nh8SoHn+DZaDAAVlev8Wh9qSORwKy4grAU/4w="},"flags/1x1/ye-a9b9b54ec295aed99c5439093242110193626524d336cc3115864e5ec0b787da.svg":{"logical_path":"flags/1x1/ye.svg","mtime":"2017-10-08T14:45:34+02:00","size":298,"digest":"a9b9b54ec295aed99c5439093242110193626524d336cc3115864e5ec0b787da","integrity":"sha256-qbm1TsKVrtmcVDkJMkIRAZNiZSTTNswxFYZOXsC3h9o="},"flags/4x3/yt-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg":{"logical_path":"flags/4x3/yt.svg","mtime":"2017-10-08T14:45:34+02:00","size":329,"digest":"6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554","integrity":"sha256-b5HSZsDJZfI0DqSalYv8dEXXbdmr9wlQkVQ82Nr+BVQ="},"flags/1x1/yt-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg":{"logical_path":"flags/1x1/yt.svg","mtime":"2017-10-08T14:45:34+02:00","size":317,"digest":"ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9","integrity":"sha256-/+x298QK1yqp99Lruqvrjq+FmEUo2YiwFsciTbhSLak="},"flags/4x3/za-57f1167ce07b3f345798c69ca8f159cb159f5dccb3c101616cc007ef1f2663d6.svg":{"logical_path":"flags/4x3/za.svg","mtime":"2017-10-08T14:45:34+02:00","size":1085,"digest":"57f1167ce07b3f345798c69ca8f159cb159f5dccb3c101616cc007ef1f2663d6","integrity":"sha256-V/EWfOB7PzRXmMacqPFZyxWfXcyzwQFhbMAH7x8mY9Y="},"flags/1x1/za-79fe7bd792f8b520caaa2c3db12ab5138cf24867d344a38167580ab6243322b1.svg":{"logical_path":"flags/1x1/za.svg","mtime":"2017-10-08T14:45:34+02:00","size":1033,"digest":"79fe7bd792f8b520caaa2c3db12ab5138cf24867d344a38167580ab6243322b1","integrity":"sha256-ef5715L4tSDKqiw9sSq1E4zySGfTRKOBZ1gKtiQzIrE="},"flags/4x3/zm-9a1622c4151a7379ecc32434948be48ba5af564e136232d1eb6e2a4dfec3baa9.svg":{"logical_path":"flags/4x3/zm.svg","mtime":"2017-10-08T14:45:34+02:00","size":8223,"digest":"9a1622c4151a7379ecc32434948be48ba5af564e136232d1eb6e2a4dfec3baa9","integrity":"sha256-mhYixBUac3nswyQ0lIvki6WvVk4TYjLR624qTf7Duqk="},"flags/1x1/zm-7bc0c09a0b3fd9f0dd01481080be99465d71218ac0679fbb077086f24835433e.svg":{"logical_path":"flags/1x1/zm.svg","mtime":"2017-10-08T14:45:34+02:00","size":8281,"digest":"7bc0c09a0b3fd9f0dd01481080be99465d71218ac0679fbb077086f24835433e","integrity":"sha256-e8DAmgs/2fDdAUgQgL6ZRl1xIYrAZ5+7B3CG8kg1Qz4="},"flags/4x3/zw-2576570465c39038f092c242d89e300a0943c50c090c922bc3bd9c8af9161478.svg":{"logical_path":"flags/4x3/zw.svg","mtime":"2017-10-08T14:45:34+02:00","size":3083,"digest":"2576570465c39038f092c242d89e300a0943c50c090c922bc3bd9c8af9161478","integrity":"sha256-JXZXBGXDkDjwksJC2J4wCglDxQwJDJIrw72civkWFHg="},"flags/1x1/zw-4ee873fa4e174f8d150c672917c8f506b530edcca86288e4b7942c7c74a63caf.svg":{"logical_path":"flags/1x1/zw.svg","mtime":"2017-10-08T14:45:34+02:00","size":2985,"digest":"4ee873fa4e174f8d150c672917c8f506b530edcca86288e4b7942c7c74a63caf","integrity":"sha256-Tuhz+k4XT40VDGcpF8j1BrUw7cyoYojkt5QsfHSmPK8="},"flags/4x3/eu-ca89dc2597154e6887930fd8bdf47636f82dc13c02d9610a3da2d156f09265d0.svg":{"logical_path":"flags/4x3/eu.svg","mtime":"2017-10-08T14:45:34+02:00","size":1289,"digest":"ca89dc2597154e6887930fd8bdf47636f82dc13c02d9610a3da2d156f09265d0","integrity":"sha256-yoncJZcVTmiHkw/YvfR2NvgtwTwC2WEKPaLRVvCSZdA="},"flags/1x1/eu-73d6f1f646500e1dc04ca798c0d192f9174268e3480a8b1d742004919b7463f9.svg":{"logical_path":"flags/1x1/eu.svg","mtime":"2017-10-08T14:45:34+02:00","size":1290,"digest":"73d6f1f646500e1dc04ca798c0d192f9174268e3480a8b1d742004919b7463f9","integrity":"sha256-c9bx9kZQDh3ATKeYwNGS+RdCaONICosddCAEkZt0Y/k="},"flags/4x3/gb-eng-ec744a15618e0a99abee9e53b70985e4cbf2fc2b7051cf239d6dd19b302e4ae9.svg":{"logical_path":"flags/4x3/gb-eng.svg","mtime":"2017-10-08T14:45:34+02:00","size":253,"digest":"ec744a15618e0a99abee9e53b70985e4cbf2fc2b7051cf239d6dd19b302e4ae9","integrity":"sha256-7HRKFWGOCpmr7p5TtwmF5Mvy/CtwUc8jnW3RmzAuSuk="},"flags/1x1/gb-eng-b1650bba14f5fa14df73f964c3b3dfeca8e1d48c19f1f9b3fded729cc96cf39d.svg":{"logical_path":"flags/1x1/gb-eng.svg","mtime":"2017-10-08T14:45:34+02:00","size":258,"digest":"b1650bba14f5fa14df73f964c3b3dfeca8e1d48c19f1f9b3fded729cc96cf39d","integrity":"sha256-sWULuhT1+hTfc/lkw7Pf7Kjh1IwZ8fmz/e1ynMls850="},"flags/4x3/gb-nir-0a09e794313d063a01d817f3ae931054dc9baddd38cfb9a0e4b3c9fa5852bc41.svg":{"logical_path":"flags/4x3/gb-nir.svg","mtime":"2017-10-08T14:45:34+02:00","size":34786,"digest":"0a09e794313d063a01d817f3ae931054dc9baddd38cfb9a0e4b3c9fa5852bc41","integrity":"sha256-CgnnlDE9BjoB2BfzrpMQVNybrd04z7mg5LPJ+lhSvEE="},"flags/1x1/gb-nir-c54214991841f1e32a4aaee502c6a7bde3ec3b43c0e74886d9bc7112f652035a.svg":{"logical_path":"flags/1x1/gb-nir.svg","mtime":"2017-10-08T14:45:34+02:00","size":35668,"digest":"c54214991841f1e32a4aaee502c6a7bde3ec3b43c0e74886d9bc7112f652035a","integrity":"sha256-xUIUmRhB8eMqSq7lAsanvePsO0PA50iG2bxxEvZSA1o="},"flags/4x3/gb-sct-c78f4e58aa162732c0a401eebe714a632ed03c5171a13bb98eb67365b338a0ab.svg":{"logical_path":"flags/4x3/gb-sct.svg","mtime":"2017-10-08T14:45:34+02:00","size":242,"digest":"c78f4e58aa162732c0a401eebe714a632ed03c5171a13bb98eb67365b338a0ab","integrity":"sha256-x49OWKoWJzLApAHuvnFKYy7QPFFxoTu5jrZzZbM4oKs="},"flags/1x1/gb-sct-4983d57dfd37f55b40b22dddfeefef38d2113818914755ee830c61b97549aaf3.svg":{"logical_path":"flags/1x1/gb-sct.svg","mtime":"2017-10-08T14:45:34+02:00","size":250,"digest":"4983d57dfd37f55b40b22dddfeefef38d2113818914755ee830c61b97549aaf3","integrity":"sha256-SYPVff039VtAsi3d/u/vONIROBiRR1XugwxhuXVJqvM="},"flags/4x3/gb-wls-963f0b8dfe114a50032ae1db25542a12d2032a30d88bbfd4698e30f50e752e31.svg":{"logical_path":"flags/4x3/gb-wls.svg","mtime":"2017-10-08T14:45:34+02:00","size":14488,"digest":"963f0b8dfe114a50032ae1db25542a12d2032a30d88bbfd4698e30f50e752e31","integrity":"sha256-lj8Ljf4RSlADKuHbJVQqEtIDKjDYi7/UaY4w9Q51LjE="},"flags/1x1/gb-wls-7d5a4120e3e0f7618bde0d4270b0c097f18472e6b1a285918d11538fb001cb60.svg":{"logical_path":"flags/1x1/gb-wls.svg","mtime":"2017-10-08T14:45:34+02:00","size":14312,"digest":"7d5a4120e3e0f7618bde0d4270b0c097f18472e6b1a285918d11538fb001cb60","integrity":"sha256-fVpBIOPg92GL3g1CcLDAl/GEcuaxooWRjRFTj7ABy2A="},"flags/4x3/un-c75bef804cdbe6617032bfb0332f009c144b1317cb073e71deb5619fbedefcdb.svg":{"logical_path":"flags/4x3/un.svg","mtime":"2017-10-08T14:45:34+02:00","size":31012,"digest":"c75bef804cdbe6617032bfb0332f009c144b1317cb073e71deb5619fbedefcdb","integrity":"sha256-x1vvgEzb5mFwMr+wMy8AnBRLExfLBz5x3rVhn77e/Ns="},"flags/1x1/un-ccaaa4bfae7e430b8bd72ddfa6fb07f167c1001490fd247a37898f4632803b1e.svg":{"logical_path":"flags/1x1/un.svg","mtime":"2017-10-08T14:45:34+02:00","size":32142,"digest":"ccaaa4bfae7e430b8bd72ddfa6fb07f167c1001490fd247a37898f4632803b1e","integrity":"sha256-zKqkv65+QwuL1y3fpvsH8WfBABSQ/SR6N4mPRjKAOx4="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2017-10-08T14:45:34+02:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2017-10-08T14:45:34+02:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2017-10-08T14:45:34+02:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2017-10-08T14:45:34+02:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2017-10-08T14:45:34+02:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"markers-soft-e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739.png":{"logical_path":"markers-soft.png","mtime":"2016-05-21T23:41:15+02:00","size":41226,"digest":"e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739","integrity":"sha256-54eE5O1wqv/d1zwxX6tZAjPMTntyOI191HoUeW/Hxzk="},"markers-shadow-8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20.png":{"logical_path":"markers-shadow.png","mtime":"2016-05-21T23:41:15+02:00","size":535,"digest":"8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20","integrity":"sha256-hwOiJicQ9ePSnmXSrN+Q1lEuFZ4RnSe4I0cx2KYgiiA="},"markers-soft@2x-c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf.png":{"logical_path":"markers-soft@2x.png","mtime":"2016-05-21T23:41:15+02:00","size":66408,"digest":"c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf","integrity":"sha256-wedyU6i/vjDOwkiF1wRvRDt267ZvTJYfdwg7A/Sly68="},"markers-shadow@2x-b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a.png":{"logical_path":"markers-shadow@2x.png","mtime":"2016-05-21T23:41:15+02:00","size":1469,"digest":"b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a","integrity":"sha256-shpTa+JzE/tQT2n1iZ/wsSRbJ2VxdprAjWwyw1Z25Ho="},"leaflet/dist/images/layers-1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6.png":{"logical_path":"leaflet/dist/images/layers.png","mtime":"2017-10-08T14:45:01+02:00","size":696,"digest":"1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6","integrity":"sha256-Hbvp0CjikvNvy6j4s6KNXokydU/CIVuaxp5M3s9RB8Y="},"leaflet/dist/images/layers-2x-066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf.png":{"logical_path":"leaflet/dist/images/layers-2x.png","mtime":"2017-10-08T14:45:01+02:00","size":1259,"digest":"066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf","integrity":"sha256-Bm2sqFDY/77wB68AsG6sABVyje4nnFHzy2xxbffELt8="},"leaflet/dist/images/marker-icon-574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437.png":{"logical_path":"leaflet/dist/images/marker-icon.png","mtime":"2017-10-08T14:45:01+02:00","size":1466,"digest":"574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437","integrity":"sha256-V0w6XMqF9BFAhbaEFZbWLwDXyJLHsD8oy/owHesdxDc="},"regions/CA-QC-776d563b6a4ac4312cae9f0bfe630c20711346e8dbddd41040998eba79f4b588.png":{"logical_path":"regions/CA-QC.png","mtime":"2015-10-22T22:54:30+02:00","size":567,"digest":"776d563b6a4ac4312cae9f0bfe630c20711346e8dbddd41040998eba79f4b588","integrity":"sha256-d21WO2pKxDEsrp8L/mMMIHETRujb3dQQQJmOunn0tYg="},"modernizr-654222debe8018b12f1993ceddff30dc163a7d5008d79869c399d6d167321f97.js":{"logical_path":"modernizr.js","mtime":"2017-10-08T14:44:59+02:00","size":51365,"digest":"654222debe8018b12f1993ceddff30dc163a7d5008d79869c399d6d167321f97","integrity":"sha256-ZUIi3r6AGLEvGZPO3f8w3BY6fVAI15hpw5nW0WcyH5c="},"agendadescommuns-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png":{"logical_path":"agendadescommuns.png","mtime":"2015-10-22T22:54:30+02:00","size":2760,"digest":"cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6","integrity":"sha256-zUDjQgJL4Fh/jnoOOQLTLPZwCdNJtnwA9ofgSZ/en/Y="},"alert-762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906.png":{"logical_path":"alert.png","mtime":"2014-07-04T14:08:56+02:00","size":47876,"digest":"762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906","integrity":"sha256-dirOlHkygkOkQGE0a2TE1rmX6WPGjfxr3dnk0kEZKQY="},"baby_gnu_adl-232caf355c30740d5d9b30491887cd546b8849b33ca9bdb6cc71f8a47ea61815.png":{"logical_path":"baby_gnu_adl.png","mtime":"2016-09-11T17:42:49+02:00","size":10155,"digest":"232caf355c30740d5d9b30491887cd546b8849b33ca9bdb6cc71f8a47ea61815","integrity":"sha256-IyyvNVwwdA1dmzBJGIfNVGuISbM8qb22zHH4pH6mGBU="},"baby_gnu_adl-97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e.svg":{"logical_path":"baby_gnu_adl.svg","mtime":"2016-09-11T17:42:49+02:00","size":109635,"digest":"97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e","integrity":"sha256-lyUQBdMiXPHVi4xJfWt5BdvJVgzIrNUBGPzOYNCiZ54="},"communs-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png":{"logical_path":"communs.png","mtime":"2015-10-22T22:54:30+02:00","size":2760,"digest":"cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6","integrity":"sha256-zUDjQgJL4Fh/jnoOOQLTLPZwCdNJtnwA9ofgSZ/en/Y="},"lef-small-160cf5b883add60c9c0f4361bd8425c75f6fb23b0e551a0b941fa0491c70e0c9.png":{"logical_path":"lef-small.png","mtime":"2015-03-29T11:07:15+02:00","size":1089,"digest":"160cf5b883add60c9c0f4361bd8425c75f6fb23b0e551a0b941fa0491c70e0c9","integrity":"sha256-Fgz1uIOt1gycD0NhvYQlx19vsjsOVRoLlB+gSRxw4Mk="},"lef-9fcdd7ddd4d40de29c3809b59688c668b85f5628e219d4cd8a8810b72a64533b.png":{"logical_path":"lef.png","mtime":"2017-01-07T19:07:36+01:00","size":8332,"digest":"9fcdd7ddd4d40de29c3809b59688c668b85f5628e219d4cd8a8810b72a64533b","integrity":"sha256-n83X3dTUDeKcOAm1lojGaLhfVijiGdTNiogQtypkUzs="},"priorite-logiciel-libre-je-soutiens-april_2_m-6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc.png":{"logical_path":"priorite-logiciel-libre-je-soutiens-april_2_m.png","mtime":"2015-10-22T22:54:30+02:00","size":16952,"digest":"6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc","integrity":"sha256-ZELkVOlu1FzB68QGc6bFC9KGucKOpqi1hXLpT31kWfw="},"team-cb04c7a311f7160c4eb6a281eae68be84f26991dde5d415bb4e205e6726ae275.png":{"logical_path":"team.png","mtime":"2014-07-04T14:08:56+02:00","size":3586,"digest":"cb04c7a311f7160c4eb6a281eae68be84f26991dde5d415bb4e205e6726ae275","integrity":"sha256-ywTHoxH3FgxOtqKB6uaL6E8mmR3eXUFbtOIF5nJq4nU="},"application-7a3f00de5ab63c63aeb8d9d4911869e3ee0ac0e05c869adbfdb78ba2a79dd517.js":{"logical_path":"application.js","mtime":"2017-10-08T00:43:01+02:00","size":2822533,"digest":"7a3f00de5ab63c63aeb8d9d4911869e3ee0ac0e05c869adbfdb78ba2a79dd517","integrity":"sha256-ej8A3lq2PGOuuNnUkRhp4+4KwOBchprb/beLoqed1Rc="},"markers-matte-497826545a90e09a240504d14530eba45823b19fd44175e09e27c47cd822ddb9.png":{"logical_path":"markers-matte.png","mtime":"2016-05-21T23:41:15+02:00","size":14323,"digest":"497826545a90e09a240504d14530eba45823b19fd44175e09e27c47cd822ddb9","integrity":"sha256-SXgmVFqQ4JokBQTRRTDrpFgjsZ/UQXXgnifEfNgi3bk="},"markers-matte@2x-948fc8c4426f04f60964ed20394247f45b0b60e575d02398b9b6810e7a29a823.png":{"logical_path":"markers-matte@2x.png","mtime":"2016-05-21T23:41:15+02:00","size":31113,"digest":"948fc8c4426f04f60964ed20394247f45b0b60e575d02398b9b6810e7a29a823","integrity":"sha256-lI/IxEJvBPYJZO0gOUJH9FsLYOV10COYubaBDnopqCM="},"markers-plain-cf233423aa44e75ac0031e77b8ba571cd3331010517e1197e63fb7b06856c1ff.png":{"logical_path":"markers-plain.png","mtime":"2016-05-21T23:41:15+02:00","size":7946,"digest":"cf233423aa44e75ac0031e77b8ba571cd3331010517e1197e63fb7b06856c1ff","integrity":"sha256-zyM0I6pE51rAAx53uLpXHNMzEBBRfhGX5j+3sGhWwf8="},"leaflet/dist/images/marker-icon-2x-2d77a2e4c2f08bbac41808324ef946b9a2fe61b6150480d011b72b379c3b238d.png":{"logical_path":"leaflet/dist/images/marker-icon-2x.png","mtime":"2017-10-08T14:45:01+02:00","size":2586,"digest":"2d77a2e4c2f08bbac41808324ef946b9a2fe61b6150480d011b72b379c3b238d","integrity":"sha256-LXei5MLwi7rEGAgyTvlGuaL+YbYVBIDQEbcrN5w7I40="},"leaflet/dist/images/marker-shadow-264f5c640339f042dd729062cfc04c17f8ea0f29882b538e3848ed8f10edb4da.png":{"logical_path":"leaflet/dist/images/marker-shadow.png","mtime":"2017-10-08T14:45:01+02:00","size":618,"digest":"264f5c640339f042dd729062cfc04c17f8ea0f29882b538e3848ed8f10edb4da","integrity":"sha256-Jk9cZAM58ELdcpBiz8BMF/jqDymIK1OOOEjtjxDttNo="},"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-ae65a7ae22c4c23115948fdeb5c05c9137dbd13ca2d426b3c4c3c4183451e410.png":{"logical_path":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png","mtime":"2017-10-08T14:45:44+02:00","size":86,"digest":"ae65a7ae22c4c23115948fdeb5c05c9137dbd13ca2d426b3c4c3c4183451e410","integrity":"sha256-rmWnriLEwjEVlI/etcBckTfb0Tyi1CazxMPEGDRR5BA="},"tinymce/langs/ar-e47a394dbc461d20aa547fa0c2027a9dad45fe55e18adb0da309045be6ed4109.js":{"logical_path":"tinymce/langs/ar.js","mtime":"2017-10-08T14:45:46+02:00","size":17776,"digest":"e47a394dbc461d20aa547fa0c2027a9dad45fe55e18adb0da309045be6ed4109","integrity":"sha256-5Ho5TbxGHSCqVH+gwgJ6na1F/lXhitsNowkEW+btQQk="},"tinymce/langs/ar_SA-24b62c76e99e114ae44480a67edbacf74f9fed0ff7afbeacce4966f1bc80333b.js":{"logical_path":"tinymce/langs/ar_SA.js","mtime":"2017-10-08T14:45:46+02:00","size":10003,"digest":"24b62c76e99e114ae44480a67edbacf74f9fed0ff7afbeacce4966f1bc80333b","integrity":"sha256-JLYsdumeEUrkRICmftus90+f7Q/3r76szklm8byAMzs="},"tinymce/langs/az-d40cecd6eb423f910f528ae98dcdaba4c2449802621759437174cf8c8c0d5b25.js":{"logical_path":"tinymce/langs/az.js","mtime":"2017-10-08T14:45:46+02:00","size":9680,"digest":"d40cecd6eb423f910f528ae98dcdaba4c2449802621759437174cf8c8c0d5b25","integrity":"sha256-1Azs1utCP5EPUorpjc2rpMJEmAJiF1lDcXTPjIwNWyU="},"tinymce/langs/be-42e2884c0f2394afa1a17e31e702660eeea0d84618bbd18155cb0313c6eb5f69.js":{"logical_path":"tinymce/langs/be.js","mtime":"2017-10-08T14:45:46+02:00","size":21064,"digest":"42e2884c0f2394afa1a17e31e702660eeea0d84618bbd18155cb0313c6eb5f69","integrity":"sha256-QuKITA8jlK+hoX4x5wJmDu6g2EYYu9GBVcsDE8brX2k="},"tinymce/langs/bg_BG-2fac9d785519d2791d42881fcc08c6a82e841575785690259d7f64e1b88d7db3.js":{"logical_path":"tinymce/langs/bg_BG.js","mtime":"2017-10-08T14:45:46+02:00","size":23945,"digest":"2fac9d785519d2791d42881fcc08c6a82e841575785690259d7f64e1b88d7db3","integrity":"sha256-L6ydeFUZ0nkdQogfzAjGqC6EFXV4VpAlnX9k4biNfbM="},"tinymce/langs/bn_BD-ef48a9094445dfa624af0c35902f60b7949b30585b5e9bc760a225fe2c07cbd3.js":{"logical_path":"tinymce/langs/bn_BD.js","mtime":"2017-10-08T14:45:46+02:00","size":6846,"digest":"ef48a9094445dfa624af0c35902f60b7949b30585b5e9bc760a225fe2c07cbd3","integrity":"sha256-70ipCURF36Ykrww1kC9gt5SbMFhbXpvHYKIl/iwHy9M="},"tinymce/langs/bs-eb66c6d6910a30b950d7a0e784027ed288e6e5a2c6db7741da3359f2067e2e0e.js":{"logical_path":"tinymce/langs/bs.js","mtime":"2017-10-08T14:45:46+02:00","size":6970,"digest":"eb66c6d6910a30b950d7a0e784027ed288e6e5a2c6db7741da3359f2067e2e0e","integrity":"sha256-62bG1pEKMLlQ16DnhAJ+0ojm5aLG23dB2jNZ8gZ+Lg4="},"tinymce/langs/ca-77ab49d6420318ed7f5fd51b6856bc396c393095bd78ea91dad83e38e5859637.js":{"logical_path":"tinymce/langs/ca.js","mtime":"2017-10-08T14:45:46+02:00","size":7787,"digest":"77ab49d6420318ed7f5fd51b6856bc396c393095bd78ea91dad83e38e5859637","integrity":"sha256-d6tJ1kIDGO1/X9UbaFa8OWw5MJW9eOqR2tg+OOWFljc="},"tinymce/langs/cs-3d7ecd619895e3e4c7e1db06f6526682ef88f22f6e8b50d7b45ed0ae7c206714.js":{"logical_path":"tinymce/langs/cs.js","mtime":"2017-10-08T14:45:46+02:00","size":8751,"digest":"3d7ecd619895e3e4c7e1db06f6526682ef88f22f6e8b50d7b45ed0ae7c206714","integrity":"sha256-PX7NYZiV4+TH4dsG9lJmgu+I8i9ui1DXtF7QrnwgZxQ="},"tinymce/langs/cs_CZ-4b0778d233e200dea350f8361129da2844e23d1c0f2d524aeffa6d34e581368d.js":{"logical_path":"tinymce/langs/cs_CZ.js","mtime":"2017-10-08T14:45:46+02:00","size":8399,"digest":"4b0778d233e200dea350f8361129da2844e23d1c0f2d524aeffa6d34e581368d","integrity":"sha256-Swd40jPiAN6jUPg2ESnaKETiPRwPLVJK7/ptNOWBNo0="},"tinymce/langs/cy-a847ff54657ccf76eec362cc14fbc63adb4c67f9b1de023b29d817aba4fec062.js":{"logical_path":"tinymce/langs/cy.js","mtime":"2017-10-08T14:45:46+02:00","size":6142,"digest":"a847ff54657ccf76eec362cc14fbc63adb4c67f9b1de023b29d817aba4fec062","integrity":"sha256-qEf/VGV8z3buw2LMFPvGOttMZ/mx3gI7KdgXq6T+wGI="},"tinymce/langs/da-a87f3ae1c442c3bb26b81569687e98072d038269360361ec9728f00d6b17c282.js":{"logical_path":"tinymce/langs/da.js","mtime":"2017-10-08T14:45:46+02:00","size":7513,"digest":"a87f3ae1c442c3bb26b81569687e98072d038269360361ec9728f00d6b17c282","integrity":"sha256-qH864cRCw7smuBVpaH6YBy0Dgmk2A2HslyjwDWsXwoI="},"tinymce/langs/de-a10c8f6f1e53da776e7026dffd54ea8ba527492b767e5b54ae5c3974f6953311.js":{"logical_path":"tinymce/langs/de.js","mtime":"2017-10-08T14:45:46+02:00","size":8280,"digest":"a10c8f6f1e53da776e7026dffd54ea8ba527492b767e5b54ae5c3974f6953311","integrity":"sha256-oQyPbx5T2nducCbf/VTqi6UnSSt2fltUrlw5dPaVMxE="},"tinymce/langs/de_AT-a32eec12ce12b06fc2c8919d2372242e9596712c96dc9bcfff1fc8b7dc458627.js":{"logical_path":"tinymce/langs/de_AT.js","mtime":"2017-10-08T14:45:46+02:00","size":8308,"digest":"a32eec12ce12b06fc2c8919d2372242e9596712c96dc9bcfff1fc8b7dc458627","integrity":"sha256-oy7sEs4SsG/CyJGdI3IkLpWWcSyW3JvP/x/It9xFhic="},"tinymce/langs/dv-182756bf33409a8b76bc684d0a2ab86881718c360d1f1fb3fbc609ce3f5e3f49.js":{"logical_path":"tinymce/langs/dv.js","mtime":"2017-10-08T14:45:46+02:00","size":18100,"digest":"182756bf33409a8b76bc684d0a2ab86881718c360d1f1fb3fbc609ce3f5e3f49","integrity":"sha256-GCdWvzNAmot2vGhNCiq4aIFxjDYNHx+z+8YJzj9eP0k="},"tinymce/langs/el-6bbdbf3ccb2b2f22f961eb6749b43fe401c84fd6d89cd3f76a538dc2d06bb071.js":{"logical_path":"tinymce/langs/el.js","mtime":"2017-10-08T14:45:46+02:00","size":22973,"digest":"6bbdbf3ccb2b2f22f961eb6749b43fe401c84fd6d89cd3f76a538dc2d06bb071","integrity":"sha256-a72/PMsrLyL5YetnSbQ/5AHIT9bYnNP3alONwtBrsHE="},"tinymce/langs/en_CA-1a9457da814b0a1f15687a00f3ae4b38da0301445b52c29a423a38c943d9a431.js":{"logical_path":"tinymce/langs/en_CA.js","mtime":"2017-10-08T14:45:46+02:00","size":6916,"digest":"1a9457da814b0a1f15687a00f3ae4b38da0301445b52c29a423a38c943d9a431","integrity":"sha256-GpRX2oFLCh8VaHoA865LONoDAURbUsKaQjo4yUPZpDE="},"tinymce/langs/en_GB-a0f7752ff9ddf3ed3d2cd24fee04fe585bca0babc4ce655560c923ad386c0c07.js":{"logical_path":"tinymce/langs/en_GB.js","mtime":"2017-10-08T14:45:46+02:00","size":5907,"digest":"a0f7752ff9ddf3ed3d2cd24fee04fe585bca0babc4ce655560c923ad386c0c07","integrity":"sha256-oPd1L/nd8+09LNJP7gT+WFvKC6vEzmVVYMkjrThsDAc="},"tinymce/langs/eo-cbac4d7ebcb0679845b852d9354e74586e78cf13eef82de1400cf6b465e203cd.js":{"logical_path":"tinymce/langs/eo.js","mtime":"2017-10-08T14:45:46+02:00","size":7466,"digest":"cbac4d7ebcb0679845b852d9354e74586e78cf13eef82de1400cf6b465e203cd","integrity":"sha256-y6xNfrywZ5hFuFLZNU50WG54zxPu+C3hQAz2tGXiA80="},"tinymce/langs/es-133cb5bd627c2a299544586bf365859b5a1c96c57d18c90e7853048434a809b6.js":{"logical_path":"tinymce/langs/es.js","mtime":"2017-10-08T14:45:46+02:00","size":7809,"digest":"133cb5bd627c2a299544586bf365859b5a1c96c57d18c90e7853048434a809b6","integrity":"sha256-Ezy1vWJ8KimVRFhr82WFm1oclsV9GMkOeFMEhDSoCbY="},"tinymce/langs/es_MX-352fcdff567919ff09a2e19c56d8059d339bffdbd999bcc82aa6d8340c19bbb9.js":{"logical_path":"tinymce/langs/es_MX.js","mtime":"2017-10-08T14:45:46+02:00","size":7894,"digest":"352fcdff567919ff09a2e19c56d8059d339bffdbd999bcc82aa6d8340c19bbb9","integrity":"sha256-NS/N/1Z5Gf8JouGcVtgFnTOb/9vZmbzIKqbYNAwZu7k="},"tinymce/langs/et-2cfc3da0ff39a37f0bd3c896d49604028f231ff0e7d8ebbc30dbfd4b87125f06.js":{"logical_path":"tinymce/langs/et.js","mtime":"2017-10-08T14:45:46+02:00","size":7784,"digest":"2cfc3da0ff39a37f0bd3c896d49604028f231ff0e7d8ebbc30dbfd4b87125f06","integrity":"sha256-LPw9oP85o38L08iW1JYEAo8jH/Dn2Ou8MNv9S4cSXwY="},"tinymce/langs/eu-8698ae4de236fcd490d0f45d485dbd33d8e9de6eb3db51191e1b4f8ea96a4d06.js":{"logical_path":"tinymce/langs/eu.js","mtime":"2017-10-08T14:45:46+02:00","size":7011,"digest":"8698ae4de236fcd490d0f45d485dbd33d8e9de6eb3db51191e1b4f8ea96a4d06","integrity":"sha256-hpiuTeI2/NSQ0PRdSF29M9jp3m6z21EZHhtPjqlqTQY="},"tinymce/langs/fa-7eff96595e93d4b0df484dd90c14b7b412966157ed8293f54429e9418882bdb2.js":{"logical_path":"tinymce/langs/fa.js","mtime":"2017-10-08T14:45:46+02:00","size":16462,"digest":"7eff96595e93d4b0df484dd90c14b7b412966157ed8293f54429e9418882bdb2","integrity":"sha256-fv+WWV6T1LDfSE3ZDBS3tBKWYVftgpP1RCnpQYiCvbI="},"tinymce/langs/fa_IR-2f9d33f16718ae9c1f3642905b58434ed2662fb66448c4d115b8491aa68e7904.js":{"logical_path":"tinymce/langs/fa_IR.js","mtime":"2017-10-08T14:45:46+02:00","size":17725,"digest":"2f9d33f16718ae9c1f3642905b58434ed2662fb66448c4d115b8491aa68e7904","integrity":"sha256-L50z8WcYrpwfNkKQW1hDTtJmL7ZkSMTRFbhJGqaOeQQ="},"tinymce/langs/fi-6ca2a93d045067a86e8ea973d0b89368054b15eb9b9625bf1ca871608a5cb77c.js":{"logical_path":"tinymce/langs/fi.js","mtime":"2017-10-08T14:45:46+02:00","size":8143,"digest":"6ca2a93d045067a86e8ea973d0b89368054b15eb9b9625bf1ca871608a5cb77c","integrity":"sha256-bKKpPQRQZ6hujqlz0LiTaAVLFeubliW/HKhxYIpct3w="},"tinymce/langs/fo-340609cecd5571e4eacb8fe7bd1343c8553d96d12610fb77d9a812dc6d3635fd.js":{"logical_path":"tinymce/langs/fo.js","mtime":"2017-10-08T14:45:46+02:00","size":8044,"digest":"340609cecd5571e4eacb8fe7bd1343c8553d96d12610fb77d9a812dc6d3635fd","integrity":"sha256-NAYJzs1VceTqy4/nvRNDyFU9ltEmEPt32agS3G02Nf0="},"tinymce/langs/fr_CH-e0f43c0f20727368ff0767f3bf099bc23eed9fe3e81f8bbe514381e786526928.js":{"logical_path":"tinymce/langs/fr_CH.js","mtime":"2017-10-08T14:45:46+02:00","size":8074,"digest":"e0f43c0f20727368ff0767f3bf099bc23eed9fe3e81f8bbe514381e786526928","integrity":"sha256-4PQ8DyByc2j/B2fzvwmbwj7tn+PoH4u+UUOB54ZSaSg="},"tinymce/langs/fr_FR-2702de7be93bd1e0d7120ae3c9e637061565186c66886f155ffca0663df25b4c.js":{"logical_path":"tinymce/langs/fr_FR.js","mtime":"2017-10-08T14:45:46+02:00","size":8009,"digest":"2702de7be93bd1e0d7120ae3c9e637061565186c66886f155ffca0663df25b4c","integrity":"sha256-JwLee+k70eDXEgrjyeY3BhVlGGxmiG8VX/ygZj3yW0w="},"tinymce/langs/ga-d2a3de6f28723d75b03f7f42fd3aedfd045d473425ee38f02350b56035383af1.js":{"logical_path":"tinymce/langs/ga.js","mtime":"2017-10-08T14:45:46+02:00","size":8591,"digest":"d2a3de6f28723d75b03f7f42fd3aedfd045d473425ee38f02350b56035383af1","integrity":"sha256-0qPebyhyPXWwP39C/Trt/QRdRzQl7jjwI1C1YDU4OvE="},"tinymce/langs/gd-0453e8b97bf3b6cca4065712ec59f20343ad6131735b38547e865177a1c1c490.js":{"logical_path":"tinymce/langs/gd.js","mtime":"2017-10-08T14:45:46+02:00","size":8808,"digest":"0453e8b97bf3b6cca4065712ec59f20343ad6131735b38547e865177a1c1c490","integrity":"sha256-BFPouXvztsykBlcS7FnyA0OtYTFzWzhUfoZRd6HBxJA="},"tinymce/langs/gl-1ff612222934f558870111f10934110c5656df3bb293c917e4eeceeb6605fcc5.js":{"logical_path":"tinymce/langs/gl.js","mtime":"2017-10-08T14:45:46+02:00","size":7066,"digest":"1ff612222934f558870111f10934110c5656df3bb293c917e4eeceeb6605fcc5","integrity":"sha256-H/YSIik09ViHARHxCTQRDFZW3zuyk8kX5O7O62YF/MU="},"tinymce/langs/he_IL-981f5250a4b8d404b37040ca5a35c30498cbeeb36e298d81bf1592b43fff7656.js":{"logical_path":"tinymce/langs/he_IL.js","mtime":"2017-10-08T14:45:46+02:00","size":16081,"digest":"981f5250a4b8d404b37040ca5a35c30498cbeeb36e298d81bf1592b43fff7656","integrity":"sha256-mB9SUKS41ASzcEDKWjXDBJjL7rNuKY2BvxWStD//dlY="},"tinymce/langs/hi_IN-695e0cdc22974fe45e0f35289f0249ddab87245165c9df765ec1b885ec55f0be.js":{"logical_path":"tinymce/langs/hi_IN.js","mtime":"2017-10-08T14:45:46+02:00","size":18458,"digest":"695e0cdc22974fe45e0f35289f0249ddab87245165c9df765ec1b885ec55f0be","integrity":"sha256-aV4M3CKXT+ReDzUonwJJ3auHJFFlyd92XsG4hexV8L4="},"tinymce/langs/hr-f77f1da2736d13f9a9a86ebf596f592fcc748f2975a0b9904b512d630f2c1a17.js":{"logical_path":"tinymce/langs/hr.js","mtime":"2017-10-08T14:45:46+02:00","size":7577,"digest":"f77f1da2736d13f9a9a86ebf596f592fcc748f2975a0b9904b512d630f2c1a17","integrity":"sha256-938donNtE/mpqG6/WW9ZL8x0jyl1oLmQS1EtYw8sGhc="},"tinymce/langs/hu_HU-1e22021a4f9c61919aa024041af555eac277bfc08ccb8c07fd329b87090a15e5.js":{"logical_path":"tinymce/langs/hu_HU.js","mtime":"2017-10-08T14:45:46+02:00","size":9410,"digest":"1e22021a4f9c61919aa024041af555eac277bfc08ccb8c07fd329b87090a15e5","integrity":"sha256-HiICGk+cYZGaoCQEGvVV6sJ3v8CMy4wH/TKbhwkKFeU="},"tinymce/langs/hy-0d384f3f82cd76793d3e7428a2140ea97f40a943f25ef99a2e3709a3e02b0930.js":{"logical_path":"tinymce/langs/hy.js","mtime":"2017-10-08T14:45:46+02:00","size":20375,"digest":"0d384f3f82cd76793d3e7428a2140ea97f40a943f25ef99a2e3709a3e02b0930","integrity":"sha256-DThPP4LNdnk9PnQoohQOqX9AqUPyXvmaLjcJo+ArCTA="},"tinymce/langs/id-e9fd018be745b5f14f4af47887420f98c590c607e01d57aca77ef5affe188523.js":{"logical_path":"tinymce/langs/id.js","mtime":"2017-10-08T14:45:46+02:00","size":7141,"digest":"e9fd018be745b5f14f4af47887420f98c590c607e01d57aca77ef5affe188523","integrity":"sha256-6f0Bi+dFtfFPSvR4h0IPmMWQxgfgHVesp371r/4YhSM="},"tinymce/langs/is_IS-c6e8c3e7b0e6b447faec3d8d258928f97c84558b29882c056513fb71cf237bfa.js":{"logical_path":"tinymce/langs/is_IS.js","mtime":"2017-10-08T14:45:46+02:00","size":7928,"digest":"c6e8c3e7b0e6b447faec3d8d258928f97c84558b29882c056513fb71cf237bfa","integrity":"sha256-xujD57DmtEf67D2NJYko+XyEVYspiCwFZRP7cc8je/o="},"tinymce/langs/it-25b5546d48c80ad666b600e5be3a05718b80645721b191785c1fafe1853f4a46.js":{"logical_path":"tinymce/langs/it.js","mtime":"2017-10-08T14:45:46+02:00","size":7598,"digest":"25b5546d48c80ad666b600e5be3a05718b80645721b191785c1fafe1853f4a46","integrity":"sha256-JbVUbUjICtZmtgDlvjoFcYuAZFchsZF4XB+v4YU/SkY="},"tinymce/langs/ja-80f0e7414030c32617ff651da1affa0bc85ee514fc9bc81f46edfd8ce0053ac0.js":{"logical_path":"tinymce/langs/ja.js","mtime":"2017-10-08T14:45:46+02:00","size":12290,"digest":"80f0e7414030c32617ff651da1affa0bc85ee514fc9bc81f46edfd8ce0053ac0","integrity":"sha256-gPDnQUAwwyYX/2Udoa/6C8he5RT8m8gfRu39jOAFOsA="},"tinymce/langs/ka_GE-3c6b82346a7070a8b6a15ae6e8faeecc5bfe63ad7e616b7de2e8ab8a75ec39c2.js":{"logical_path":"tinymce/langs/ka_GE.js","mtime":"2017-10-08T14:45:46+02:00","size":21284,"digest":"3c6b82346a7070a8b6a15ae6e8faeecc5bfe63ad7e616b7de2e8ab8a75ec39c2","integrity":"sha256-PGuCNGpwcKi2oVrm6PruzFv+Y61+YWt94uirinXsOcI="},"tinymce/langs/kab-3651d08aacd5bda15a04698f202bf616efbf13d3789aadd9ce4f93e430818c13.js":{"logical_path":"tinymce/langs/kab.js","mtime":"2017-10-08T14:45:46+02:00","size":7391,"digest":"3651d08aacd5bda15a04698f202bf616efbf13d3789aadd9ce4f93e430818c13","integrity":"sha256-NlHQiqzVvaFaBGmPICv2Fu+/E9N4mq3Zzk+T5DCBjBM="},"tinymce/langs/kk-0c1ba792ed9445c6512f310228f64d1cde7b5a98e0b212cca749dcb2d728fe86.js":{"logical_path":"tinymce/langs/kk.js","mtime":"2017-10-08T14:45:46+02:00","size":16681,"digest":"0c1ba792ed9445c6512f310228f64d1cde7b5a98e0b212cca749dcb2d728fe86","integrity":"sha256-DBunku2URcZRLzECKPZNHN57WpjgshLMp0ncstco/oY="},"tinymce/langs/km_KH-8bec84e4078db8c2a680260c073dfb486c85b61df62e14ca330d66d2ca2a85b5.js":{"logical_path":"tinymce/langs/km_KH.js","mtime":"2017-10-08T14:45:46+02:00","size":21396,"digest":"8bec84e4078db8c2a680260c073dfb486c85b61df62e14ca330d66d2ca2a85b5","integrity":"sha256-i+yE5AeNuMKmgCYMBz37SGyFth32LhTKMw1m0soqhbU="},"tinymce/langs/ko-ca535bfa388701fb020d24bdfb3f1e3aab127005b54e943cb1bd60b723c8194d.js":{"logical_path":"tinymce/langs/ko.js","mtime":"2017-10-08T14:45:46+02:00","size":10105,"digest":"ca535bfa388701fb020d24bdfb3f1e3aab127005b54e943cb1bd60b723c8194d","integrity":"sha256-ylNb+jiHAfsCDSS9+z8eOqsScAW1TpQ8sb1gtyPIGU0="},"tinymce/langs/ko_KR-daa3ae950d70260bb0901a5349034952247905523bbc2bcbe527701b6aad8e28.js":{"logical_path":"tinymce/langs/ko_KR.js","mtime":"2017-10-08T14:45:46+02:00","size":10005,"digest":"daa3ae950d70260bb0901a5349034952247905523bbc2bcbe527701b6aad8e28","integrity":"sha256-2qOulQ1wJguwkBpTSQNJUiR5BVI7vCvL5SdwG2qtjig="},"tinymce/langs/ku-95e2ffe4f0112df658f10327c26f2cdddedc2e2ed769767366ae22a465c14725.js":{"logical_path":"tinymce/langs/ku.js","mtime":"2017-10-08T14:45:46+02:00","size":18274,"digest":"95e2ffe4f0112df658f10327c26f2cdddedc2e2ed769767366ae22a465c14725","integrity":"sha256-leL/5PARLfZY8QMnwm8s3d7cLi7XaXZzZq4ipGXBRyU="},"tinymce/langs/ku_IQ-a212e8d41695989e56834facf72474e1934ef166c3fcaf7e255ef573a3c6e76c.js":{"logical_path":"tinymce/langs/ku_IQ.js","mtime":"2017-10-08T14:45:46+02:00","size":18364,"digest":"a212e8d41695989e56834facf72474e1934ef166c3fcaf7e255ef573a3c6e76c","integrity":"sha256-ohLo1BaVmJ5Wg0+s9yR04ZNO8WbD/K9+JV71c6PG52w="},"tinymce/langs/lb-94992279091f1a0be927d5d858d3724037d8d81ee6b63cc9ddde84af6124cc04.js":{"logical_path":"tinymce/langs/lb.js","mtime":"2017-10-08T14:45:46+02:00","size":7467,"digest":"94992279091f1a0be927d5d858d3724037d8d81ee6b63cc9ddde84af6124cc04","integrity":"sha256-lJkieQkfGgvpJ9XYWNNyQDfY2B7mtjzJ3d6Er2EkzAQ="},"tinymce/langs/lt-ae7cefbe2cb5420770b31eabf92605728135ab5d6a2d2cfca2d19809be67e6a8.js":{"logical_path":"tinymce/langs/lt.js","mtime":"2017-10-08T14:45:46+02:00","size":8899,"digest":"ae7cefbe2cb5420770b31eabf92605728135ab5d6a2d2cfca2d19809be67e6a8","integrity":"sha256-rnzvviy1Qgdwsx6r+SYFcoE1q11qLSz8otGYCb5n5qg="},"tinymce/langs/lv-e468ed0c78466d1fff9f4957645606d8aa683cb5dc35931e047df97b8e4f5433.js":{"logical_path":"tinymce/langs/lv.js","mtime":"2017-10-08T14:45:46+02:00","size":8282,"digest":"e468ed0c78466d1fff9f4957645606d8aa683cb5dc35931e047df97b8e4f5433","integrity":"sha256-5GjtDHhGbR//n0lXZFYG2KpoPLXcNZMeBH35e45PVDM="},"tinymce/langs/mk_MK-55aadb5d7c82c940cfcf42f24423ef0471294c9b02994a6b22e1b4173baa7ec6.js":{"logical_path":"tinymce/langs/mk_MK.js","mtime":"2017-10-08T14:45:46+02:00","size":18733,"digest":"55aadb5d7c82c940cfcf42f24423ef0471294c9b02994a6b22e1b4173baa7ec6","integrity":"sha256-VarbXXyCyUDPz0LyRCPvBHEpTJsCmUprIuG0FzuqfsY="},"tinymce/langs/ml-685de0808683c02274dcbe9f8de023a4d72a49b040e7526a99e3d5c786ff71ae.js":{"logical_path":"tinymce/langs/ml.js","mtime":"2017-10-08T14:45:46+02:00","size":7339,"digest":"685de0808683c02274dcbe9f8de023a4d72a49b040e7526a99e3d5c786ff71ae","integrity":"sha256-aF3ggIaDwCJ03L6fjeAjpNcqSbBA51JqmePVx4b/ca4="},"tinymce/langs/ml_IN-1ab433621d6257c7632718048bacc5ed98a302d33cf0438bbbb4200914e01aac.js":{"logical_path":"tinymce/langs/ml_IN.js","mtime":"2017-10-08T14:45:46+02:00","size":20019,"digest":"1ab433621d6257c7632718048bacc5ed98a302d33cf0438bbbb4200914e01aac","integrity":"sha256-GrQzYh1iV8djJxgEi6zF7ZijAtM88EOLu7QgCRTgGqw="},"tinymce/langs/mn_MN-b89f88cb9b0dd7c879e27532b2979c421c1e69648f65a4108a56060f1e1cb009.js":{"logical_path":"tinymce/langs/mn_MN.js","mtime":"2017-10-08T14:45:46+02:00","size":6877,"digest":"b89f88cb9b0dd7c879e27532b2979c421c1e69648f65a4108a56060f1e1cb009","integrity":"sha256-uJ+Iy5sN18h54nUyspecQhweaWSPZaQQilYGDx4csAk="},"tinymce/langs/nb_NO-602ee249e98a26ae24c1ee1311090c68a782050086a835f1e7bd46ebfe7879ef.js":{"logical_path":"tinymce/langs/nb_NO.js","mtime":"2017-10-08T14:45:46+02:00","size":7528,"digest":"602ee249e98a26ae24c1ee1311090c68a782050086a835f1e7bd46ebfe7879ef","integrity":"sha256-YC7iSemKJq4kwe4TEQkMaKeCBQCGqDXx571G6/54ee8="},"tinymce/langs/nl-9c77e9404a27fd7e4bd162ad44538b72d2725b7fee7be7ca3ff801cf217c4968.js":{"logical_path":"tinymce/langs/nl.js","mtime":"2017-10-08T14:45:46+02:00","size":7235,"digest":"9c77e9404a27fd7e4bd162ad44538b72d2725b7fee7be7ca3ff801cf217c4968","integrity":"sha256-nHfpQEon/X5L0WKtRFOLctJyW3/ue+fKP/gBzyF8SWg="},"tinymce/langs/pl-5cdd1586ec8fa67293f2175cd92edbd0392c4c77b24ed64cfdceccba8d99f152.js":{"logical_path":"tinymce/langs/pl.js","mtime":"2017-10-08T14:45:46+02:00","size":8129,"digest":"5cdd1586ec8fa67293f2175cd92edbd0392c4c77b24ed64cfdceccba8d99f152","integrity":"sha256-XN0VhuyPpnKT8hdc2S7b0DksTHeyTtZM/c7Muo2Z8VI="},"tinymce/langs/pt_BR-e3955318582d58bd241a62c3a81afe74e0ae7f31bdc92a562b75243701f114df.js":{"logical_path":"tinymce/langs/pt_BR.js","mtime":"2017-10-08T14:45:46+02:00","size":8002,"digest":"e3955318582d58bd241a62c3a81afe74e0ae7f31bdc92a562b75243701f114df","integrity":"sha256-45VTGFgtWL0kGmLDqBr+dOCufzG9ySpWK3UkNwHxFN8="},"tinymce/langs/pt_PT-1101d080ecd5da091c7ef70b23200adbd5136c5c32f0c79dae665a443d76c35d.js":{"logical_path":"tinymce/langs/pt_PT.js","mtime":"2017-10-08T14:45:46+02:00","size":8145,"digest":"1101d080ecd5da091c7ef70b23200adbd5136c5c32f0c79dae665a443d76c35d","integrity":"sha256-EQHQgOzV2gkcfvcLIyAK29UTbFwy8MedrmZaRD12w10="},"tinymce/langs/ro-484799d182031efab087d749b024014fd06ed06c1e7712b8bf87f3a4a965c2e4.js":{"logical_path":"tinymce/langs/ro.js","mtime":"2017-10-08T14:45:46+02:00","size":8275,"digest":"484799d182031efab087d749b024014fd06ed06c1e7712b8bf87f3a4a965c2e4","integrity":"sha256-SEeZ0YIDHvqwh9dJsCQBT9Bu0GwedxK4v4fzpKllwuQ="},"tinymce/langs/ru-bdd59cb662a7b4d61e770b07014d1791051312c87513ecc1891e80beba617171.js":{"logical_path":"tinymce/langs/ru.js","mtime":"2017-10-08T14:45:46+02:00","size":22290,"digest":"bdd59cb662a7b4d61e770b07014d1791051312c87513ecc1891e80beba617171","integrity":"sha256-vdWctmKntNYedwsHAU0XkQUTEsh1E+zBiR6AvrphcXE="},"tinymce/langs/ru_RU-9f18ef14f3493cc586cc0b4827fd9e1c2ed3d5790ce536d94f87e2d6aac2a688.js":{"logical_path":"tinymce/langs/ru_RU.js","mtime":"2017-10-08T14:45:46+02:00","size":4955,"digest":"9f18ef14f3493cc586cc0b4827fd9e1c2ed3d5790ce536d94f87e2d6aac2a688","integrity":"sha256-nxjvFPNJPMWGzAtIJ/2eHC7T1XkM5TbZT4fi1qrCpog="},"tinymce/langs/si_LK-5bfefe9b2fe82574d8ed839df18fd8ff65f1e1cd458b0a843cf1aadd1be704ea.js":{"logical_path":"tinymce/langs/si_LK.js","mtime":"2017-10-08T14:45:46+02:00","size":15856,"digest":"5bfefe9b2fe82574d8ed839df18fd8ff65f1e1cd458b0a843cf1aadd1be704ea","integrity":"sha256-W/7+my/oJXTY7YOd8Y/Y/2Xx4c1FiwqEPPGq3RvnBOo="},"tinymce/langs/sk-412fa7f982ad2733341203daa035c8ba10035262ca8f5f65e0a41507512209bd.js":{"logical_path":"tinymce/langs/sk.js","mtime":"2017-10-08T14:45:46+02:00","size":8958,"digest":"412fa7f982ad2733341203daa035c8ba10035262ca8f5f65e0a41507512209bd","integrity":"sha256-QS+n+YKtJzM0EgPaoDXIuhADUmLKj19l4KQVB1EiCb0="},"tinymce/langs/sl_SI-2bea4f3854a992ea840808019dc99467dc173b12454ea6016135234a741671d8.js":{"logical_path":"tinymce/langs/sl_SI.js","mtime":"2017-10-08T14:45:46+02:00","size":7039,"digest":"2bea4f3854a992ea840808019dc99467dc173b12454ea6016135234a741671d8","integrity":"sha256-K+pPOFSpkuqECAgBncmUZ9wXOxJFTqYBYTUjSnQWcdg="},"tinymce/langs/sr-e0b97453a0c1000b19f7ce37fcf86bcacbf9125d81076f60a77686820c7925c6.js":{"logical_path":"tinymce/langs/sr.js","mtime":"2017-10-08T14:45:46+02:00","size":6336,"digest":"e0b97453a0c1000b19f7ce37fcf86bcacbf9125d81076f60a77686820c7925c6","integrity":"sha256-4Ll0U6DBAAsZ9843/Phrysv5El2BB29gp3aGggx5JcY="},"tinymce/langs/sv_SE-fa561a7e49fdb42d5913337176fed6bc8a9997eb3ca8f20ecd9520d5391e17be.js":{"logical_path":"tinymce/langs/sv_SE.js","mtime":"2017-10-08T14:45:46+02:00","size":7496,"digest":"fa561a7e49fdb42d5913337176fed6bc8a9997eb3ca8f20ecd9520d5391e17be","integrity":"sha256-+lYafkn9tC1ZEzNxdv7WvIqZl+s8qPIOzZUg1TkeF74="},"tinymce/langs/ta-0fd0e62250fc1a3626ac2111c5adb4194a6a898888bb224414f6dc8adf53d385.js":{"logical_path":"tinymce/langs/ta.js","mtime":"2017-10-08T14:45:46+02:00","size":22617,"digest":"0fd0e62250fc1a3626ac2111c5adb4194a6a898888bb224414f6dc8adf53d385","integrity":"sha256-D9DmIlD8GjYmrCERxa20GUpqiYiIuyJEFPbcit9T04U="},"tinymce/langs/ta_IN-32303f65d2378e8202b17b0920b79277a2580872e3a6bd9409aeceef90867dd0.js":{"logical_path":"tinymce/langs/ta_IN.js","mtime":"2017-10-08T14:45:46+02:00","size":22620,"digest":"32303f65d2378e8202b17b0920b79277a2580872e3a6bd9409aeceef90867dd0","integrity":"sha256-MjA/ZdI3joICsXsJILeSd6JYCHLjpr2UCa7O75CGfdA="},"tinymce/langs/tg-1618248bf0aeda614a37ced9fd28b6623ae24f8453368bfb8c483ce820a3cb34.js":{"logical_path":"tinymce/langs/tg.js","mtime":"2017-10-08T14:45:46+02:00","size":18183,"digest":"1618248bf0aeda614a37ced9fd28b6623ae24f8453368bfb8c483ce820a3cb34","integrity":"sha256-Fhgki/Cu2mFKN87Z/Si2YjriT4RTNov7jEg86CCjyzQ="},"tinymce/langs/th_TH-5279a379afc886c2a31e22aba9d7ee7a8e3edf4c0785f39aaa20ccd03d46b19a.js":{"logical_path":"tinymce/langs/th_TH.js","mtime":"2017-10-08T14:45:46+02:00","size":17297,"digest":"5279a379afc886c2a31e22aba9d7ee7a8e3edf4c0785f39aaa20ccd03d46b19a","integrity":"sha256-Unmjea/IhsKjHiKrqdfueo4+30wHhfOaqiDM0D1GsZo="},"tinymce/langs/tr-3765d4a8923ef22864747d9c825c3e0af401e1356e75a5458bed837d486b7673.js":{"logical_path":"tinymce/langs/tr.js","mtime":"2017-10-08T14:45:46+02:00","size":8705,"digest":"3765d4a8923ef22864747d9c825c3e0af401e1356e75a5458bed837d486b7673","integrity":"sha256-N2XUqJI+8ihkdH2cglw+CvQB4TVudaVFi+2DfUhrdnM="},"tinymce/langs/tr_TR-5c93f80b89e5dd2eb6972f37bf50b76d7705c61f28120b836704a91fa5c14399.js":{"logical_path":"tinymce/langs/tr_TR.js","mtime":"2017-10-08T14:45:46+02:00","size":8141,"digest":"5c93f80b89e5dd2eb6972f37bf50b76d7705c61f28120b836704a91fa5c14399","integrity":"sha256-XJP4C4nl3S62ly83v1C3bXcFxh8oEguDZwSpH6XBQ5k="},"tinymce/langs/tt-22e302672df0a77de14688f58dbedf82de7a26e9089c9535a2a3cd1c0ccd7903.js":{"logical_path":"tinymce/langs/tt.js","mtime":"2017-10-08T14:45:46+02:00","size":19035,"digest":"22e302672df0a77de14688f58dbedf82de7a26e9089c9535a2a3cd1c0ccd7903","integrity":"sha256-IuMCZy3wp33hRoj1jb7fgt56JukInJU1oqPNHAzNeQM="},"tinymce/langs/ug-50232038bf7262c90be4f2919c74ff93792cdb82e6064d0f5c86f885b93271c5.js":{"logical_path":"tinymce/langs/ug.js","mtime":"2017-10-08T14:45:46+02:00","size":16888,"digest":"50232038bf7262c90be4f2919c74ff93792cdb82e6064d0f5c86f885b93271c5","integrity":"sha256-UCMgOL9yYskL5PKRnHT/k3ks24LmBk0PXIb4hbkyccU="},"tinymce/langs/uk-f6d7911714c422b178c0249df323cf7ec415a83195d751c7e4024590b1738c42.js":{"logical_path":"tinymce/langs/uk.js","mtime":"2017-10-08T14:45:46+02:00","size":22264,"digest":"f6d7911714c422b178c0249df323cf7ec415a83195d751c7e4024590b1738c42","integrity":"sha256-9teRFxTEIrF4wCSd8yPPfsQVqDGV11HH5AJFkLFzjEI="},"tinymce/langs/uk_UA-bd8cd7ca66228d85f8a4cadb651c49981f26e007fa2a952856c8c3d3c1baa66a.js":{"logical_path":"tinymce/langs/uk_UA.js","mtime":"2017-10-08T14:45:46+02:00","size":21691,"digest":"bd8cd7ca66228d85f8a4cadb651c49981f26e007fa2a952856c8c3d3c1baa66a","integrity":"sha256-vYzXymYijYX4pMrbZRxJmB8m4Af6KpUoVsjD08G6pmo="},"tinymce/langs/vi-6aa451047e4df911c92e10178e6a70147534e438c64df7a88eee37b4a440726e.js":{"logical_path":"tinymce/langs/vi.js","mtime":"2017-10-08T14:45:46+02:00","size":9901,"digest":"6aa451047e4df911c92e10178e6a70147534e438c64df7a88eee37b4a440726e","integrity":"sha256-aqRRBH5N+RHJLhAXjmpwFHU05DjGTfeoju43tKRAcm4="},"tinymce/langs/vi_VN-aea52c2e9397f8a657d54d50a42b3c5be0ca79480555a4fa1e0f5d785c5f6561.js":{"logical_path":"tinymce/langs/vi_VN.js","mtime":"2017-10-08T14:45:46+02:00","size":9899,"digest":"aea52c2e9397f8a657d54d50a42b3c5be0ca79480555a4fa1e0f5d785c5f6561","integrity":"sha256-rqUsLpOX+KZX1U1QpCs8W+DKeUgFVaT6Hg9deFxfZWE="},"tinymce/langs/zh_CN-8622ec46e2980b6f5baf3b745c6b0187dd2a54ddecbbf69a21f0b3e72f84f6dc.js":{"logical_path":"tinymce/langs/zh_CN.js","mtime":"2017-10-08T14:45:46+02:00","size":8483,"digest":"8622ec46e2980b6f5baf3b745c6b0187dd2a54ddecbbf69a21f0b3e72f84f6dc","integrity":"sha256-hiLsRuKYC29brzt0XGsBh90qVN3su/aaIfCz5y+E9tw="},"tinymce/langs/zh_TW-90723da3b889f2a4477d4aaf00ca3e75439998269b36b359ea4caa37e1defb4a.js":{"logical_path":"tinymce/langs/zh_TW.js","mtime":"2017-10-08T14:45:46+02:00","size":9379,"digest":"90723da3b889f2a4477d4aaf00ca3e75439998269b36b359ea4caa37e1defb4a","integrity":"sha256-kHI9o7iJ8qRHfUqvAMo+dUOZmCabNrNZ6kyqN+He+0o="},"tinymce/preinit-4eb7f4ac58f2f450d20185cf83ca1d8550d2a1419141bfe70eb5a2c4afe67349.js":{"logical_path":"tinymce/preinit.js","mtime":"2017-10-07T16:14:30+02:00","size":248,"digest":"4eb7f4ac58f2f450d20185cf83ca1d8550d2a1419141bfe70eb5a2c4afe67349","integrity":"sha256-Trf0rFjy9FDSAYXPg8odhVDSoUGRQb/nDrWixK/mc0k="},"tinymce/tinymce-ea002509455c2d4e12e195ec050ff03ce90bbe0bdf22bb0d4180bba730c2bcc6.js":{"logical_path":"tinymce/tinymce.js","mtime":"2017-10-07T16:14:30+02:00","size":1733332,"digest":"ea002509455c2d4e12e195ec050ff03ce90bbe0bdf22bb0d4180bba730c2bcc6","integrity":"sha256-6gAlCUVcLU4S4ZXsBQ/wPOkLvgvfIrsNQYC7pzDCvMY="},"tinymce/jquery.tinymce-c4e34b289f498e7a8e4ff16c48b895310113eae7c296ac5f17680704bc3a0032.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2017-10-07T16:14:30+02:00","size":4275,"digest":"c4e34b289f498e7a8e4ff16c48b895310113eae7c296ac5f17680704bc3a0032","integrity":"sha256-xONLKJ9JjnqOT/FsSLiVMQET6ufClqxfF2gHBLw6ADI="},"tinymce/langs/readme-5a8b6a04d57b5c88e3fb7f2a870b8e2d3a48ec03ce6474206c41df78c155b2de.md":{"logical_path":"tinymce/langs/readme.md","mtime":"2017-12-25T19:51:42+01:00","size":151,"digest":"5a8b6a04d57b5c88e3fb7f2a870b8e2d3a48ec03ce6474206c41df78c155b2de","integrity":"sha256-WotqBNV7XIjj+38qhwuOLTpI7APOZHQgbEHfeMFVst4="},"tinymce/license-47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66.txt":{"logical_path":"tinymce/license.txt","mtime":"2017-12-25T19:51:42+01:00","size":26441,"digest":"47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66","integrity":"sha256-R6nc0ldIkaWkZREv2d/OvMfmGETt7Cf6k2pkZCAI/mY="},"tinymce/plugins/advlist/plugin-8298c4226e435f9350b2bfedab63fec1a9a153277a48930406bd9446ca3d9206.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2683,"digest":"8298c4226e435f9350b2bfedab63fec1a9a153277a48930406bd9446ca3d9206","integrity":"sha256-gpjEIm5DX5NQsr/tq2P+wamhUyd6SJMEBr2URso9kgY="},"tinymce/plugins/anchor/plugin-910353b28da9ffa1075fd37b1c95f1f05f0d6809e41a5e4250b33e1a3a7a86c8.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2110,"digest":"910353b28da9ffa1075fd37b1c95f1f05f0d6809e41a5e4250b33e1a3a7a86c8","integrity":"sha256-kQNTso2p/6EHX9N7HJXx8F8NaAnkGl5CULM+Gjp6hsg="},"tinymce/plugins/autolink/plugin-ee2bb5e9c684882fb0db4d350f0c7feab2643841f2b8729db0f9111043c70d39.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3017,"digest":"ee2bb5e9c684882fb0db4d350f0c7feab2643841f2b8729db0f9111043c70d39","integrity":"sha256-7iu16caEiC+w2001Dwx/6rJkOEHyuHKdsPkREEPHDTk="},"tinymce/plugins/autoresize/plugin-2e0a2856650e8fa09fba9a00fd18a9078e5ee436c6c47ead6ba6689fee74cafa.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2916,"digest":"2e0a2856650e8fa09fba9a00fd18a9078e5ee436c6c47ead6ba6689fee74cafa","integrity":"sha256-LgooVmUOj6CfupoA/RipB45e5DbGxH6ta6Zon+50yvo="},"tinymce/plugins/autosave/plugin-54b4451f49d642d08cbec840341ac6edb501b69d2383115c62bc7070eb0a57f4.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3217,"digest":"54b4451f49d642d08cbec840341ac6edb501b69d2383115c62bc7070eb0a57f4","integrity":"sha256-VLRFH0nWQtCMvshANBrG7bUBtp0jgxFcYrxwcOsKV/Q="},"tinymce/plugins/bbcode/plugin-3e2fdc6fa5b587ce568ca570974d0e910b6684e392a9ecaba02b5c6c15269080.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3990,"digest":"3e2fdc6fa5b587ce568ca570974d0e910b6684e392a9ecaba02b5c6c15269080","integrity":"sha256-Pi/cb6W1h85WjKVwl00OkQtmhOOSqeyroCtcbBUmkIA="},"tinymce/plugins/charmap/plugin-49d7ef5688ed83d2a102b0c9702dc3aac70a33c22a7ef4885d6528a61b8210e2.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":9164,"digest":"49d7ef5688ed83d2a102b0c9702dc3aac70a33c22a7ef4885d6528a61b8210e2","integrity":"sha256-SdfvVojtg9KhArDJcC3DqscKM8IqfvSIXWUophuCEOI="},"tinymce/plugins/code/plugin-2c12bcd21813fa52b23a65c3080cc6f4ecb33be04ee058b6c460719724511372.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1656,"digest":"2c12bcd21813fa52b23a65c3080cc6f4ecb33be04ee058b6c460719724511372","integrity":"sha256-LBK80hgT+lKyOmXDCAzG9OyzO+BO4Fi2xGBxlyRRE3I="},"tinymce/plugins/codesample/css/prism-1988b66704b4d23e78c6c20c38a6856cbc1f0be96d6d60a3a0b12f4408f1057e.css":{"logical_path":"tinymce/plugins/codesample/css/prism.css","mtime":"2017-12-25T19:51:42+01:00","size":1776,"digest":"1988b66704b4d23e78c6c20c38a6856cbc1f0be96d6d60a3a0b12f4408f1057e","integrity":"sha256-GYi2ZwS00j54xsIMOKaFbLwfC+ltbWCjoLEvRAjxBX4="},"tinymce/plugins/codesample/plugin-a3591d2c33d0499eed106bbdc9d0aa698115456632cb806e8f44bdf270d8d6b8.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":19950,"digest":"a3591d2c33d0499eed106bbdc9d0aa698115456632cb806e8f44bdf270d8d6b8","integrity":"sha256-o1kdLDPQSZ7tEGu9ydCqaYEVRWYyy4Buj0S98nDY1rg="},"tinymce/plugins/colorpicker/plugin-f4ea1ac5bfaaef5adef0789427a1ef1e3c07814ff9a7623953bfb1a79f9f502d.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2144,"digest":"f4ea1ac5bfaaef5adef0789427a1ef1e3c07814ff9a7623953bfb1a79f9f502d","integrity":"sha256-9Ooaxb+q71re8HiUJ6HvHjwHgU/5p2I5U7+xp5+fUC0="},"tinymce/plugins/contextmenu/plugin-36bf2806ad2d3ead1a04e45b840bd6cea455f38ca02d88f973302219e05734ab.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":7098,"digest":"36bf2806ad2d3ead1a04e45b840bd6cea455f38ca02d88f973302219e05734ab","integrity":"sha256-Nr8oBq0tPq0aBORbhAvWzqRV84ygLYj5czAiGeBXNKs="},"tinymce/plugins/directionality/plugin-8b9d9e0d97d8cf5c20b4f74509a94cbd84c59b330d7badaad66ff2d0553479fd.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1653,"digest":"8b9d9e0d97d8cf5c20b4f74509a94cbd84c59b330d7badaad66ff2d0553479fd","integrity":"sha256-i52eDZfYz1wgtPdFCalMvYTFmzMNe62q1m/y0FU0ef0="},"tinymce/plugins/emoticons/img/smiley-cool-bb0e93a050a32df7913e4026b3c88a176998e0e3e073ba06e9b73f6c24227c9c.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-cool.gif","mtime":"2017-12-25T19:51:42+01:00","size":354,"digest":"bb0e93a050a32df7913e4026b3c88a176998e0e3e073ba06e9b73f6c24227c9c","integrity":"sha256-uw6ToFCjLfeRPkAms8iKF2mY4OPgc7oG6bc/bCQifJw="},"tinymce/plugins/emoticons/img/smiley-cry-a0c5f3e7a682449c973c9d9f7c46342081c46920686d2353f57aff91ab907f68.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-cry.gif","mtime":"2017-12-25T19:51:42+01:00","size":329,"digest":"a0c5f3e7a682449c973c9d9f7c46342081c46920686d2353f57aff91ab907f68","integrity":"sha256-oMXz56aCRJyXPJ2ffEY0IIHEaSBobSNT9Xr/kauQf2g="},"tinymce/plugins/emoticons/img/smiley-embarassed-d3cafcb50b335672cb5e9f4600ea9ea261dac7828dd28844d4927c393a25618f.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-embarassed.gif","mtime":"2017-12-25T19:51:42+01:00","size":331,"digest":"d3cafcb50b335672cb5e9f4600ea9ea261dac7828dd28844d4927c393a25618f","integrity":"sha256-08r8tQszVnLLXp9GAOqeomHax4KN0ohE1JJ8OTolYY8="},"tinymce/plugins/emoticons/img/smiley-foot-in-mouth-03fe04d3ed533423ac81f05146584b0c451be3d4a30e76687ceef283ed07071f.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif","mtime":"2017-12-25T19:51:42+01:00","size":342,"digest":"03fe04d3ed533423ac81f05146584b0c451be3d4a30e76687ceef283ed07071f","integrity":"sha256-A/4E0+1TNCOsgfBRRlhLDEUb49SjDnZofO7yg+0HBx8="},"tinymce/plugins/emoticons/img/smiley-frown-1b984bf98931dd1debb54461eb9d83e985f2b2999fe14bcb556d6c0921bc83b0.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-frown.gif","mtime":"2017-12-25T19:51:42+01:00","size":340,"digest":"1b984bf98931dd1debb54461eb9d83e985f2b2999fe14bcb556d6c0921bc83b0","integrity":"sha256-G5hL+Ykx3R3rtURh652D6YXyspmf4UvLVW1sCSG8g7A="},"tinymce/plugins/emoticons/img/smiley-innocent-8db353ef102196f2c6ddf5c4666446de955d7b14fc0957c806c9dbfb48fb0c29.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-innocent.gif","mtime":"2017-12-25T19:51:42+01:00","size":336,"digest":"8db353ef102196f2c6ddf5c4666446de955d7b14fc0957c806c9dbfb48fb0c29","integrity":"sha256-jbNT7xAhlvLG3fXEZmRG3pVdexT8CVfIBsnb+0j7DCk="},"tinymce/plugins/emoticons/img/smiley-kiss-3154c3665356c13ab10fefdbac1fe187fff978a0052037c99cdc4a97103413f2.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-kiss.gif","mtime":"2017-12-25T19:51:42+01:00","size":338,"digest":"3154c3665356c13ab10fefdbac1fe187fff978a0052037c99cdc4a97103413f2","integrity":"sha256-MVTDZlNWwTqxD+/brB/hh//5eKAFIDfJnNxKlxA0E/I="},"tinymce/plugins/emoticons/img/smiley-laughing-8f6adedcd091975ffead171867a6304d908bb6541a6ccb4919286ec6b7d4551e.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-laughing.gif","mtime":"2017-12-25T19:51:42+01:00","size":343,"digest":"8f6adedcd091975ffead171867a6304d908bb6541a6ccb4919286ec6b7d4551e","integrity":"sha256-j2re3NCRl1/+rRcYZ6YwTZCLtlQabMtJGShuxrfUVR4="},"tinymce/plugins/emoticons/img/smiley-money-mouth-f0b9f4f22e237f5dbc851f900fed8d7eca4c954ae6fbc606c0cd8be431d0ac80.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-money-mouth.gif","mtime":"2017-12-25T19:51:42+01:00","size":321,"digest":"f0b9f4f22e237f5dbc851f900fed8d7eca4c954ae6fbc606c0cd8be431d0ac80","integrity":"sha256-8Ln08i4jf128hR+QD+2NfspMlUrm+8YGwM2L5DHQrIA="},"tinymce/plugins/emoticons/img/smiley-sealed-9933b442636b6e537df7b564e2c3f7a2873526eea6b022a98eb1e468e5204c32.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-sealed.gif","mtime":"2017-12-25T19:51:42+01:00","size":323,"digest":"9933b442636b6e537df7b564e2c3f7a2873526eea6b022a98eb1e468e5204c32","integrity":"sha256-mTO0QmNrblN997Vk4sP3ooc1Ju6msCKpjrHkaOUgTDI="},"tinymce/plugins/emoticons/img/smiley-smile-fd89cd460ffcacb7e725e00c0275ef5b3924ce468248e5ff4fb43545571cfa65.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-smile.gif","mtime":"2017-12-25T19:51:42+01:00","size":344,"digest":"fd89cd460ffcacb7e725e00c0275ef5b3924ce468248e5ff4fb43545571cfa65","integrity":"sha256-/YnNRg/8rLfnJeAMAnXvWzkkzkaCSOX/T7Q1RVcc+mU="},"tinymce/plugins/emoticons/img/smiley-surprised-3871f356cb41976d7ae8a5f005e8739e4d014352a8adef9b33f773d81b6e6c01.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-surprised.gif","mtime":"2017-12-25T19:51:42+01:00","size":338,"digest":"3871f356cb41976d7ae8a5f005e8739e4d014352a8adef9b33f773d81b6e6c01","integrity":"sha256-OHHzVstBl2166KXwBehznk0BQ1Kore+bM/dz2BtubAE="},"tinymce/plugins/emoticons/img/smiley-tongue-out-5843c85667a8226dc43be83749fd9fbbc5d20b1577de2b763915d99815d37d47.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-tongue-out.gif","mtime":"2017-12-25T19:51:42+01:00","size":328,"digest":"5843c85667a8226dc43be83749fd9fbbc5d20b1577de2b763915d99815d37d47","integrity":"sha256-WEPIVmeoIm3EO+g3Sf2fu8XSCxV33it2ORXZmBXTfUc="},"tinymce/plugins/emoticons/img/smiley-undecided-d8b9bcbb433951ff3c4ca8dd959ac3844239b98e6d52218833e1485a91f67347.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-undecided.gif","mtime":"2017-12-25T19:51:42+01:00","size":337,"digest":"d8b9bcbb433951ff3c4ca8dd959ac3844239b98e6d52218833e1485a91f67347","integrity":"sha256-2Lm8u0M5Uf88TKjdlZrDhEI5uY5tUiGIM+FIWpH2c0c="},"tinymce/plugins/emoticons/img/smiley-wink-2af75ad7b1c08488505513503e34b15f40005e04a2a9568f698f0945d2d8ba1f.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-wink.gif","mtime":"2017-12-25T19:51:42+01:00","size":350,"digest":"2af75ad7b1c08488505513503e34b15f40005e04a2a9568f698f0945d2d8ba1f","integrity":"sha256-Kvda17HAhIhQVRNQPjSxX0AAXgSiqVaPaY8JRdLYuh8="},"tinymce/plugins/emoticons/img/smiley-yell-bba903fbcb46fce8c68b9e01863fd095b3b1d0e6aa72161f3a88d762a5f90a79.gif":{"logical_path":"tinymce/plugins/emoticons/img/smiley-yell.gif","mtime":"2017-12-25T19:51:42+01:00","size":336,"digest":"bba903fbcb46fce8c68b9e01863fd095b3b1d0e6aa72161f3a88d762a5f90a79","integrity":"sha256-u6kD+8tG/OjGi54Bhj/QlbOx0OaqchYfOojXYqX5Cnk="},"tinymce/plugins/emoticons/plugin-4e4ed709e1a04969c1d82745d84b01eb7fdd36a19a3529452c81cc2ed4e6b58d.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1838,"digest":"4e4ed709e1a04969c1d82745d84b01eb7fdd36a19a3529452c81cc2ed4e6b58d","integrity":"sha256-Tk7XCeGgSWnB2CdF2EsB63/dNqGaNSlFLIHMLtTmtY0="},"tinymce/plugins/fullpage/plugin-2184bd5db93788e2ead614801f7f96ed7aea38a25dd6f5f94a836807da12f4b7.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":7649,"digest":"2184bd5db93788e2ead614801f7f96ed7aea38a25dd6f5f94a836807da12f4b7","integrity":"sha256-IYS9Xbk3iOLq1hSAH3+W7XrqOKJd1vX5SoNoB9oS9Lc="},"tinymce/plugins/fullscreen/plugin-58355e469e27d887f7c5cedc4ab9c33268605171d0a6ef7539d7889bd6c22e95.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2611,"digest":"58355e469e27d887f7c5cedc4ab9c33268605171d0a6ef7539d7889bd6c22e95","integrity":"sha256-WDVeRp4n2If3xc7cSrnDMmhgUXHQpu91OdeIm9bCLpU="},"tinymce/plugins/help/img/logo-8b03dc4f83c4fea0b62c4f9866898c98e81057c55b3e3b8c1da3f5fdbf0086e9.png":{"logical_path":"tinymce/plugins/help/img/logo.png","mtime":"2017-10-07T16:14:30+02:00","size":23101,"digest":"8b03dc4f83c4fea0b62c4f9866898c98e81057c55b3e3b8c1da3f5fdbf0086e9","integrity":"sha256-iwPcT4PE/qC2LE+YZomMmOgQV8VbPjuMHaP1/b8Ahuk="},"tinymce/plugins/help/plugin-fe41ec41705f0ab8974189c7a262bd6abfca631da91bec80cca08557d933400e.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":13955,"digest":"fe41ec41705f0ab8974189c7a262bd6abfca631da91bec80cca08557d933400e","integrity":"sha256-/kHsQXBfCriXQYnHomK9ar/KYx2pG+yAzKCFV9kzQA4="},"tinymce/plugins/hr/plugin-7e54a59e7cc42e5dbcb208c5e1e171bfa1e07a12a4f2bc29eb924e3b56b2137e.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1198,"digest":"7e54a59e7cc42e5dbcb208c5e1e171bfa1e07a12a4f2bc29eb924e3b56b2137e","integrity":"sha256-flSlnnzELl28sgjF4eFxv6HgehKk8rwp65JOO1ayE34="},"tinymce/plugins/image/plugin-9c58ff73baa30b22932a2940f6499720916ff0667664c0fd1879facb30c7e15e.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":12180,"digest":"9c58ff73baa30b22932a2940f6499720916ff0667664c0fd1879facb30c7e15e","integrity":"sha256-nFj/c7qjCyKTKilA9kmXIJFv8GZ2ZMD9GHn6yzDH4V4="},"tinymce/plugins/imagetools/plugin-cde4e862daaa1072a4a548d462ecd155e4c5798ea673bdab3ba4bf6193123257.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":38257,"digest":"cde4e862daaa1072a4a548d462ecd155e4c5798ea673bdab3ba4bf6193123257","integrity":"sha256-zeToYtqqEHKkpUjUYuzRVeTFeY6mc72rO6S/YZMSMlc="},"tinymce/plugins/importcss/plugin-c9f390348b03c3c6311b5babcb935a60ba6fb23cf30013749dd3cda157b784b9.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3760,"digest":"c9f390348b03c3c6311b5babcb935a60ba6fb23cf30013749dd3cda157b784b9","integrity":"sha256-yfOQNIsDw8YxG1ury5NaYLpvsjzzABN0ndPNoVe3hLk="},"tinymce/plugins/insertdatetime/plugin-918c81e56c28ac5ecf1a7cf1441532a94637da84ae8119d69f5628a42dc1a70a.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2904,"digest":"918c81e56c28ac5ecf1a7cf1441532a94637da84ae8119d69f5628a42dc1a70a","integrity":"sha256-kYyB5WworF7PGnzxRBUyqUY32oSugRnWn1YopC3Bpwo="},"tinymce/plugins/legacyoutput/plugin-367fc211a27027020d9cab6dec42bf1a86f428a507bb47530386439a9d581bd7.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":4184,"digest":"367fc211a27027020d9cab6dec42bf1a86f428a507bb47530386439a9d581bd7","integrity":"sha256-Nn/CEaJwJwINnKtt7EK/Gob0KKUHu0dTA4ZDmp1YG9c="},"tinymce/plugins/link/plugin-188203a47fcc2b8092733c0999105e52aa76af1fc7fa86d82791feee615105e5.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":11309,"digest":"188203a47fcc2b8092733c0999105e52aa76af1fc7fa86d82791feee615105e5","integrity":"sha256-GIIDpH/MK4CSczwJmRBeUqp2rx/H+obYJ5H+7mFRBeU="},"tinymce/plugins/lists/plugin-570f4ed934292f815ba8a8ab0309e44abd776120f629c35a9e6d19d8fb2f7890.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":16394,"digest":"570f4ed934292f815ba8a8ab0309e44abd776120f629c35a9e6d19d8fb2f7890","integrity":"sha256-Vw9O2TQpL4FbqKirAwnkSr13YSD2KcNanm0Z2PsveJA="},"tinymce/plugins/media/plugin-5b4758de69f15a33a07cc4cddd1a896c9de832cdd120b901a7188e57f31cb570.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":16814,"digest":"5b4758de69f15a33a07cc4cddd1a896c9de832cdd120b901a7188e57f31cb570","integrity":"sha256-W0dY3mnxWjOgfMTN3RqJbJ3oMs3RILkBpxiOV/MctXA="},"tinymce/plugins/nonbreaking/plugin-911e6f2517df4ca758f67e28dadebaf921d1b7bb120b23ee2779dce0cf7bb842.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1573,"digest":"911e6f2517df4ca758f67e28dadebaf921d1b7bb120b23ee2779dce0cf7bb842","integrity":"sha256-kR5vJRffTKdY9n4o2t66+SHRt7sSCyPuJ3nc4M97uEI="},"tinymce/plugins/noneditable/plugin-99b4ff9b08ba148764914357b4c626cf07ce5dae739ec678d43fd6f6c6461bc0.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2191,"digest":"99b4ff9b08ba148764914357b4c626cf07ce5dae739ec678d43fd6f6c6461bc0","integrity":"sha256-mbT/mwi6FIdkkUNXtMYmzwfOXa5znsZ41D/W9sZGG8A="},"tinymce/plugins/pagebreak/plugin-ba3703ad8ce5ff341f209e6fa1ab0afdb66d66365dde2f322338d9382f8cabcb.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2152,"digest":"ba3703ad8ce5ff341f209e6fa1ab0afdb66d66365dde2f322338d9382f8cabcb","integrity":"sha256-ujcDrYzl/zQfIJ5voasK/bZtZjZd3i8yIzjZOC+Mq8s="},"tinymce/plugins/paste/plugin-e32879a5ac81dedf097e5a06653c4740fc4fab4766589bab761312d0b2d560c9.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":21374,"digest":"e32879a5ac81dedf097e5a06653c4740fc4fab4766589bab761312d0b2d560c9","integrity":"sha256-4yh5payB3t8JfloGZTxHQPxPq0dmWJurdhMS0LLVYMk="},"tinymce/plugins/preview/plugin-326a8321cd75624f9b746e4efcd8e6f1d5e4d0b2d96155e3b8c8345ec70a95aa.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2611,"digest":"326a8321cd75624f9b746e4efcd8e6f1d5e4d0b2d96155e3b8c8345ec70a95aa","integrity":"sha256-MmqDIc11Yk+bdG5O/Njm8dXk0LLZYVXjuMg0XscKlao="},"tinymce/plugins/print/plugin-360588108f9b3c4d49e62b084a288f7b789d4555ff53eaedd793b7880d5b0799.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":1169,"digest":"360588108f9b3c4d49e62b084a288f7b789d4555ff53eaedd793b7880d5b0799","integrity":"sha256-NgWIEI+bPE1J5isISiiPe3idRVX/U+rt15O3iA1bB5k="},"tinymce/plugins/save/plugin-18a4bdbbb2894ce2f3badb7a901ce2b21f18c9cbe54c1c346245ea3092f1d230.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2202,"digest":"18a4bdbbb2894ce2f3badb7a901ce2b21f18c9cbe54c1c346245ea3092f1d230","integrity":"sha256-GKS9u7KJTOLzutt6kBzish8YycvlTBw0YkXqMJLx0jA="},"tinymce/plugins/searchreplace/plugin-cf1237ef21f140faadb3977c326cca488796cae1bafc26f201ab78dd6a498752.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":7494,"digest":"cf1237ef21f140faadb3977c326cca488796cae1bafc26f201ab78dd6a498752","integrity":"sha256-zxI37yHxQPqts5d8MmzKSIeWyuG6/CbyAat43WpJh1I="},"tinymce/plugins/spellchecker/plugin-c4b0e6c01647313b0beda3037aff99d35fd3c10e74afd56329210239cee26a53.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":10081,"digest":"c4b0e6c01647313b0beda3037aff99d35fd3c10e74afd56329210239cee26a53","integrity":"sha256-xLDmwBZHMTsL7aMDev+Z01/TwQ50r9VjKSECOc7ialM="},"tinymce/plugins/tabfocus/plugin-c004f18acdee65bc533bf582e05017cb72a1c78e235e6a6301d7f8cb218f059e.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2368,"digest":"c004f18acdee65bc533bf582e05017cb72a1c78e235e6a6301d7f8cb218f059e","integrity":"sha256-wATxis3uZbxTO/WC4FAXy3Khx44jXmpjAdf4yyGPBZ4="},"tinymce/plugins/table/plugin-dbea734fa37f0c2143ea225ff48c358261941b6cf347292de89f6d503a16cd27.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":48127,"digest":"dbea734fa37f0c2143ea225ff48c358261941b6cf347292de89f6d503a16cd27","integrity":"sha256-2+pzT6N/DCFD6iJf9Iw1gmGUG2zzRykt6J9tUDoWzSc="},"tinymce/plugins/template/plugin-9d2e073f0fa6d0e2c9433260db997138945ea2c73402420a8b12dbba432c5726.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":6762,"digest":"9d2e073f0fa6d0e2c9433260db997138945ea2c73402420a8b12dbba432c5726","integrity":"sha256-nS4HPw+m0OLJQzJg25lxOJReosc0AkIKixLbukMsVyY="},"tinymce/plugins/textcolor/plugin-7f993a50c7d5ca5af4a2117aecbafa820fc5c669bae6916509bc392b21ec10d7.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":5169,"digest":"7f993a50c7d5ca5af4a2117aecbafa820fc5c669bae6916509bc392b21ec10d7","integrity":"sha256-f5k6UMfVylr0ohF67Lr6gg/Fxmm65pFlCbw5KyHsENc="},"tinymce/plugins/textpattern/plugin-3abf3b59885a2b30139e25377c6ebf369e77178752ded63a8ae3a04bba7dabeb.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":4951,"digest":"3abf3b59885a2b30139e25377c6ebf369e77178752ded63a8ae3a04bba7dabeb","integrity":"sha256-Or87WYhaKzATniU3fG6/Np53F4dS3tY6iuOgS7p9q+s="},"tinymce/plugins/toc/plugin-24e4d24233ae96b5d80a1add45fed792c0be45c2ffb266957112465cd45ed0b7.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":3764,"digest":"24e4d24233ae96b5d80a1add45fed792c0be45c2ffb266957112465cd45ed0b7","integrity":"sha256-JOTSQjOulrXYChrdRf7XksC+RcL/smaVcRJGXNRe0Lc="},"tinymce/plugins/visualblocks/css/visualblocks-859e261c1d940c90994673ce593b60946710cc4f71371164db4ea695035ea593.css":{"logical_path":"tinymce/plugins/visualblocks/css/visualblocks.css","mtime":"2017-12-25T19:51:42+01:00","size":4995,"digest":"859e261c1d940c90994673ce593b60946710cc4f71371164db4ea695035ea593","integrity":"sha256-hZ4mHB2UDJCZRnPOWTtglGcQzE9xNxFk206mlQNepZM="},"tinymce/plugins/visualblocks/plugin-d65e950bb619d5c52a4fb236da31bb0ecc492e7477e7b0841a2ac06b6faeea26.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":2029,"digest":"d65e950bb619d5c52a4fb236da31bb0ecc492e7477e7b0841a2ac06b6faeea26","integrity":"sha256-1l6VC7YZ1cUqT7I22jG7DsxJLnR357CEGirAa2+u6iY="},"tinymce/plugins/visualchars/plugin-d56ff99b2792abbb690ebafe6d70e6c4487a7f5cf2788cb1f3fa4ea62d8b70a2.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":8944,"digest":"d56ff99b2792abbb690ebafe6d70e6c4487a7f5cf2788cb1f3fa4ea62d8b70a2","integrity":"sha256-1W/5myeSq7tpDrr+bXDmxEh6f1zyeIyx8/pOpi2LcKI="},"tinymce/plugins/wordcount/plugin-15f7440d901e81ffa69553b6cb42b1c9ed94c8d9a2417bbe47802539d152bdbc.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2017-10-07T16:14:30+02:00","size":12201,"digest":"15f7440d901e81ffa69553b6cb42b1c9ed94c8d9a2417bbe47802539d152bdbc","integrity":"sha256-FfdEDZAegf+mlVO2y0Kxye2UyNmiQXu+R4AlOdFSvbw="},"tinymce/skins/lightgray/content.inline.min-244f66927d819115fc6403d3562ac16d18884dcd2ca4766e464a03ec6f223adf.css":{"logical_path":"tinymce/skins/lightgray/content.inline.min.css","mtime":"2017-10-07T16:14:30+02:00","size":3335,"digest":"244f66927d819115fc6403d3562ac16d18884dcd2ca4766e464a03ec6f223adf","integrity":"sha256-JE9mkn2BkRX8ZAPTVirBbRiITc0spHZuRkoD7G8iOt8="},"tinymce/skins/lightgray/content.min-c59b96ac316de5e14c27896f4ffdfb27da41502112b8a9c5ea0851a25a742e4e.css":{"logical_path":"tinymce/skins/lightgray/content.min.css","mtime":"2017-10-07T16:14:30+02:00","size":3741,"digest":"c59b96ac316de5e14c27896f4ffdfb27da41502112b8a9c5ea0851a25a742e4e","integrity":"sha256-xZuWrDFt5eFMJ4lvT/37J9pBUCESuKnF6ghRolp0Lk4="},"tinymce/skins/lightgray/fonts/tinymce-small-a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9.eot":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.eot","mtime":"2017-12-25T19:51:42+01:00","size":9492,"digest":"a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9","integrity":"sha256-oQ/END2VtxbBbXdGPUdb5cB5WZ6mfhzSvTqU1ef1CPk="},"tinymce/skins/lightgray/fonts/tinymce-small-e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee.svg":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.svg","mtime":"2017-12-25T19:51:42+01:00","size":24727,"digest":"e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee","integrity":"sha256-53cwAURquTfh2NS9Xo29mzHREgNzU6FLMZ423QEO2O4="},"tinymce/skins/lightgray/fonts/tinymce-small-2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09.ttf":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.ttf","mtime":"2017-12-25T19:51:42+01:00","size":9304,"digest":"2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09","integrity":"sha256-L2V1ApBtb1w/yN86gpaRFOvgMK3f3AYcYMl0sPUV/Qk="},"tinymce/skins/lightgray/fonts/tinymce-small-d3efbb678ca6de5632902bd93772746ba2f8e4e2322b953936e12694a183aa31.woff":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-small.woff","mtime":"2017-12-25T19:51:42+01:00","size":9380,"digest":"d3efbb678ca6de5632902bd93772746ba2f8e4e2322b953936e12694a183aa31","integrity":"sha256-0++7Z4ym3lYykCvZN3J0a6L45OIyK5U5NuEmlKGDqjE="},"tinymce/skins/lightgray/fonts/tinymce-2e9c4a68fde992476e0db9e44128cb1f2e898f0de0b80f552a8acb52bb7ca0db.eot":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.eot","mtime":"2017-12-25T19:51:42+01:00","size":17572,"digest":"2e9c4a68fde992476e0db9e44128cb1f2e898f0de0b80f552a8acb52bb7ca0db","integrity":"sha256-LpxKaP3pkkduDbnkQSjLHy6Jjw3guA9VKorLUrt8oNs="},"tinymce/skins/lightgray/fonts/tinymce-2094ddadc265c7f33570475fc78ef7adcdcb814e49060d17f5b4c4f8d1cb7ec6.svg":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.svg","mtime":"2017-12-25T19:51:42+01:00","size":45991,"digest":"2094ddadc265c7f33570475fc78ef7adcdcb814e49060d17f5b4c4f8d1cb7ec6","integrity":"sha256-IJTdrcJlx/M1cEdfx473rc3LgU5JBg0X9bTE+NHLfsY="},"tinymce/skins/lightgray/fonts/tinymce-477ea2d46c1a975dd492af4c10235fabfd09069595779cce00ea0381ca9b4a20.ttf":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.ttf","mtime":"2017-12-25T19:51:42+01:00","size":17408,"digest":"477ea2d46c1a975dd492af4c10235fabfd09069595779cce00ea0381ca9b4a20","integrity":"sha256-R36i1Gwal13Ukq9MECNfq/0JBpWVd5zOAOoDgcqbSiA="},"tinymce/skins/lightgray/fonts/tinymce-1ebc636bb24cbea637946ba8c22cbf4f35d8343ba9763045d2aee59e3714ae78.woff":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce.woff","mtime":"2017-12-25T19:51:42+01:00","size":17484,"digest":"1ebc636bb24cbea637946ba8c22cbf4f35d8343ba9763045d2aee59e3714ae78","integrity":"sha256-Hrxja7JMvqY3lGuowiy/TzXYNDupdjBF0q7lnjcUrng="},"tinymce/skins/lightgray/img/anchor-2861666fd107d278d4449970615136d06d7f746be9bb19072cf9c8f30e565e1e.gif":{"logical_path":"tinymce/skins/lightgray/img/anchor.gif","mtime":"2017-12-25T19:51:42+01:00","size":53,"digest":"2861666fd107d278d4449970615136d06d7f746be9bb19072cf9c8f30e565e1e","integrity":"sha256-KGFmb9EH0njURJlwYVE20G1/dGvpuxkHLPnI8w5WXh4="},"tinymce/skins/lightgray/img/loader-eb7cfd3d959b2e09c170f532e29f8b825f9bc770b2279fde58e595617753e244.gif":{"logical_path":"tinymce/skins/lightgray/img/loader.gif","mtime":"2017-12-25T19:51:42+01:00","size":2608,"digest":"eb7cfd3d959b2e09c170f532e29f8b825f9bc770b2279fde58e595617753e244","integrity":"sha256-63z9PZWbLgnBcPUy4p+Lgl+bx3CyJ5/eWOWVYXdT4kQ="},"tinymce/skins/lightgray/img/object-e6a15e52bc4a17b085073ba8debd4708ead6ae3d4cbeb3880c65cb7afc489777.gif":{"logical_path":"tinymce/skins/lightgray/img/object.gif","mtime":"2017-12-25T19:51:42+01:00","size":152,"digest":"e6a15e52bc4a17b085073ba8debd4708ead6ae3d4cbeb3880c65cb7afc489777","integrity":"sha256-5qFeUrxKF7CFBzuo3r1HCOrWrj1MvrOIDGXLevxIl3c="},"tinymce/skins/lightgray/img/trans-9cf020d7c3bba7f5ab10cda54aabef934f906d4f9a3acf99e9e7dc6c98579635.gif":{"logical_path":"tinymce/skins/lightgray/img/trans.gif","mtime":"2017-12-25T19:51:42+01:00","size":43,"digest":"9cf020d7c3bba7f5ab10cda54aabef934f906d4f9a3acf99e9e7dc6c98579635","integrity":"sha256-nPAg18O7p/WrEM2lSqvvk0+QbU+aOs+Z6efcbJhXljU="},"tinymce/skins/lightgray/skin.min-b12163641969e8e7775e00e73f8691e2892c35bf53d399deb4399832950c8acf.css":{"logical_path":"tinymce/skins/lightgray/skin.min.css","mtime":"2017-10-07T16:14:30+02:00","size":40376,"digest":"b12163641969e8e7775e00e73f8691e2892c35bf53d399deb4399832950c8acf","integrity":"sha256-sSFjZBlp6Od3XgDnP4aR4oksNb9T05netDmYMpUMis8="},"tinymce/themes/inlite/theme-705c8874883e10384f2f0f31576331734af05e4871ea70c8b54c09acf68b562a.js":{"logical_path":"tinymce/themes/inlite/theme.js","mtime":"2017-10-07T16:14:30+02:00","size":17114,"digest":"705c8874883e10384f2f0f31576331734af05e4871ea70c8b54c09acf68b562a","integrity":"sha256-cFyIdIg+EDhPLw8xV2Mxc0rwXkhx6nDItUwJrPaLVio="},"tinymce/themes/modern/theme-acb8d1f30de151cc3b7f6b5131ed0e7e45abfd745256260b2d57b3594c97c685.js":{"logical_path":"tinymce/themes/modern/theme.js","mtime":"2017-10-07T16:14:30+02:00","size":14361,"digest":"acb8d1f30de151cc3b7f6b5131ed0e7e45abfd745256260b2d57b3594c97c685","integrity":"sha256-rLjR8w3hUcw7f2tRMe0OfkWr/XRSViYLLVezWUyXxoU="},"application-a3e14c617593fb4bc194d8021b38514c9b130e782e45cf92a07e546d36602c13.js":{"logical_path":"application.js","mtime":"2017-10-14T19:50:25+02:00","size":2822537,"digest":"a3e14c617593fb4bc194d8021b38514c9b130e782e45cf92a07e546d36602c13","integrity":"sha256-o+FMYXWT+0vBlNgCGzhRTJsTDnguRc+SoH5UbTZgLBM="},"tinymce-e0a997125d47cb527bd10d048179b98997bbac47ebaca5bd3e7a7439ae29d0f0.js":{"logical_path":"tinymce.js","mtime":"2017-12-25T19:51:42+01:00","size":1370217,"digest":"e0a997125d47cb527bd10d048179b98997bbac47ebaca5bd3e7a7439ae29d0f0","integrity":"sha256-4KmXEl1Hy1J70Q0EgXm5iZe7rEfrrKW9Pnp0Oa4p0PA="},"application-9b741d81e960c215cca53ea2b4e0bda53cfedf35d173e3075fa3aa0b1ed8ef0a.js":{"logical_path":"application.js","mtime":"2017-12-30T15:54:26+01:00","size":2459274,"digest":"9b741d81e960c215cca53ea2b4e0bda53cfedf35d173e3075fa3aa0b1ed8ef0a","integrity":"sha256-m3QdgelgwhXMpT6itOC9pTz+3zXRc+MHX6OqCx7Y7wo="},"application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css":{"logical_path":"application.css","mtime":"2017-12-30T15:54:26+01:00","size":230014,"digest":"661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7","integrity":"sha256-Zh+KOhWJUS/ONLE4L2t6YxAB+c9DCJb8ZYyVVi7f9Lc="},"tinymce/preinit-84328a53e798df12f891eb49871773fd9f925439c8630e9e22423a82ef9e6f89.js":{"logical_path":"tinymce/preinit.js","mtime":"2017-12-25T19:51:42+01:00","size":82,"digest":"84328a53e798df12f891eb49871773fd9f925439c8630e9e22423a82ef9e6f89","integrity":"sha256-hDKKU+eY3xL4ketJhxdz/Z+SVDnIYw6eIkI6gu+eb4k="},"tinymce/rails-bf7fd5c952f25481010758dde6a2681498074f9509230f601b317356a6a54fca.js":{"logical_path":"tinymce/rails.js","mtime":"2017-12-25T19:51:42+01:00","size":1345,"digest":"bf7fd5c952f25481010758dde6a2681498074f9509230f601b317356a6a54fca","integrity":"sha256-v3/VyVLyVIEBB1jd5qJoFJgHT5UJIw9gGzFzVqalT8o="},"tinymce/tinymce-cccbb9fb34a9d8d8634a3a9ae0080ca394081f2b98cd81c4c378c5a1d73fba21.js":{"logical_path":"tinymce/tinymce.js","mtime":"2017-12-25T19:51:42+01:00","size":1368787,"digest":"cccbb9fb34a9d8d8634a3a9ae0080ca394081f2b98cd81c4c378c5a1d73fba21","integrity":"sha256-zMu5+zSp2NhjSjqa4AgMo5QIHyuYzYHEw3jFodc/uiE="},"tinymce/jquery.tinymce-c9ec5ed0b9118216bc9aa1ad4a251afff33d2c60e62057737b026003ab34efb3.js":{"logical_path":"tinymce/jquery.tinymce.js","mtime":"2017-12-25T19:51:42+01:00","size":4353,"digest":"c9ec5ed0b9118216bc9aa1ad4a251afff33d2c60e62057737b026003ab34efb3","integrity":"sha256-yexe0LkRgha8mqGtSiUa//M9LGDmIFdzewJgA6s077M="},"tinymce/plugins/advlist/plugin-1470ecd481c44e215caf021f095382fb9960da96dc0986228f269dbba0067d4a.js":{"logical_path":"tinymce/plugins/advlist/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3704,"digest":"1470ecd481c44e215caf021f095382fb9960da96dc0986228f269dbba0067d4a","integrity":"sha256-FHDs1IHETiFcrwIfCVOC+5lg2pbcCYYijyadu6AGfUo="},"tinymce/plugins/anchor/plugin-c0c08d516edff61b4216b240af7f77487a035272794d0aef1c924a67129ac067.js":{"logical_path":"tinymce/plugins/anchor/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2595,"digest":"c0c08d516edff61b4216b240af7f77487a035272794d0aef1c924a67129ac067","integrity":"sha256-wMCNUW7f9htCFrJAr393SHoDUnJ5TQrvHJJKZxKawGc="},"tinymce/plugins/autolink/plugin-a13df878211dfb03dda14031db66bbc8021b6b55e1da4447a96ee50ea0ba86e0.js":{"logical_path":"tinymce/plugins/autolink/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3283,"digest":"a13df878211dfb03dda14031db66bbc8021b6b55e1da4447a96ee50ea0ba86e0","integrity":"sha256-oT34eCEd+wPdoUAx22a7yAIba1Xh2kRHqW7lDqC6huA="},"tinymce/plugins/autoresize/plugin-4cb04cc171a4e3f3b3b69770c74c53ec2ac0a743c303c2f5072b7f7c0d71c187.js":{"logical_path":"tinymce/plugins/autoresize/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3400,"digest":"4cb04cc171a4e3f3b3b69770c74c53ec2ac0a743c303c2f5072b7f7c0d71c187","integrity":"sha256-TLBMwXGk4/Oztpdwx0xT7CrAp0PDA8L1Byt/fA1xwYc="},"tinymce/plugins/autosave/plugin-b471db0ebd9f584c62a614a85fa16ae06cadce14af85ee5b2e39b84d0c9ec05c.js":{"logical_path":"tinymce/plugins/autosave/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":4787,"digest":"b471db0ebd9f584c62a614a85fa16ae06cadce14af85ee5b2e39b84d0c9ec05c","integrity":"sha256-tHHbDr2fWExiphSoX6Fq4GytzhSvhe5bLjm4TQyewFw="},"tinymce/plugins/bbcode/plugin-b624047c40c5435b935c2591fbf0eb851ae7794d9350b611b10bb6b23aa4bd9c.js":{"logical_path":"tinymce/plugins/bbcode/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3771,"digest":"b624047c40c5435b935c2591fbf0eb851ae7794d9350b611b10bb6b23aa4bd9c","integrity":"sha256-tiQEfEDFQ1uTXCWR+/DrhRrneU2TULYRsQu2sjqkvZw="},"tinymce/plugins/charmap/plugin-8f5abea75aec0a80dd6328f29da433574c8a9b025fea0a3b2cb8127605dda330.js":{"logical_path":"tinymce/plugins/charmap/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":10091,"digest":"8f5abea75aec0a80dd6328f29da433574c8a9b025fea0a3b2cb8127605dda330","integrity":"sha256-j1q+p1rsCoDdYyjynaQzV0yKmwJf6go7LLgSdgXdozA="},"tinymce/plugins/code/plugin-41ed678cf1339c20afc948e499212d06bd502c3d4a94da1d37ad427ec525f123.js":{"logical_path":"tinymce/plugins/code/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2209,"digest":"41ed678cf1339c20afc948e499212d06bd502c3d4a94da1d37ad427ec525f123","integrity":"sha256-Qe1njPEznCCvyUjkmSEtBr1QLD1KlNodN61CfsUl8SM="},"tinymce/plugins/codesample/plugin-a59fe13189ec82797e929ebf320e294669e73fc040d5a4505e3ab01f6b96daaa.js":{"logical_path":"tinymce/plugins/codesample/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":21159,"digest":"a59fe13189ec82797e929ebf320e294669e73fc040d5a4505e3ab01f6b96daaa","integrity":"sha256-pZ/hMYnsgnl+kp6/Mg4pRmnnP8BA1aRQXjqwH2uW2qo="},"tinymce/plugins/colorpicker/plugin-e48f5ad978732e6129285d3aa00dfaf5d7b670dc189629835ad888438963bc3d.js":{"logical_path":"tinymce/plugins/colorpicker/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2230,"digest":"e48f5ad978732e6129285d3aa00dfaf5d7b670dc189629835ad888438963bc3d","integrity":"sha256-5I9a2XhzLmEpKF06oA369de2cNwYlimDWtiIQ4ljvD0="},"tinymce/plugins/contextmenu/plugin-d9e7ddcde9ffdbdb2eec811e817b822662234b90d6046fba0ed5a77c5cc0c3d7.js":{"logical_path":"tinymce/plugins/contextmenu/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3139,"digest":"d9e7ddcde9ffdbdb2eec811e817b822662234b90d6046fba0ed5a77c5cc0c3d7","integrity":"sha256-2efdzen/29su7IEegXuCJmIjS5DWBG+6DtWnfFzAw9c="},"tinymce/plugins/directionality/plugin-d2e6f8a1c65b0c9e6484d356263e8afc3dc7d3c4c9bbf2bb2155599063f427e5.js":{"logical_path":"tinymce/plugins/directionality/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":1859,"digest":"d2e6f8a1c65b0c9e6484d356263e8afc3dc7d3c4c9bbf2bb2155599063f427e5","integrity":"sha256-0ub4ocZbDJ5khNNWJj6K/D3H08TJu/K7IVVZkGP0J+U="},"tinymce/plugins/emoticons/plugin-d57266d91f221127649a29316e2a6b33a89281d5e546b0688cf177d56144b62d.js":{"logical_path":"tinymce/plugins/emoticons/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2014,"digest":"d57266d91f221127649a29316e2a6b33a89281d5e546b0688cf177d56144b62d","integrity":"sha256-1XJm2R8iESdkmikxbiprM6iSgdXlRrBojPF31WFEti0="},"tinymce/plugins/fullpage/plugin-04d845d28977b02b9669d861dc21188ca666de825803eef4e57c040d40249562.js":{"logical_path":"tinymce/plugins/fullpage/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":8990,"digest":"04d845d28977b02b9669d861dc21188ca666de825803eef4e57c040d40249562","integrity":"sha256-BNhF0ol3sCuWadhh3CEYjKZm3oJYA+705XwEDUAklWI="},"tinymce/plugins/fullscreen/plugin-f8bbdd50ed0196693f9d98d1e478cc4d18a65270cc1517eca5a03d6eeefd369a.js":{"logical_path":"tinymce/plugins/fullscreen/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3430,"digest":"f8bbdd50ed0196693f9d98d1e478cc4d18a65270cc1517eca5a03d6eeefd369a","integrity":"sha256-+LvdUO0Blmk/nZjR5HjMTRimUnDMFRfspaA9bu79Npo="},"tinymce/plugins/help/img/logo-95b06f8538b11c4c30170075a09f93cf5871f74dd2541e95ad3d9da31976fcac.png":{"logical_path":"tinymce/plugins/help/img/logo.png","mtime":"2017-12-25T19:51:42+01:00","size":13208,"digest":"95b06f8538b11c4c30170075a09f93cf5871f74dd2541e95ad3d9da31976fcac","integrity":"sha256-lbBvhTixHEwwFwB1oJ+Tz1hx903SVB6VrT2doxl2/Kw="},"tinymce/plugins/help/plugin-18f46f77691cc2f94b36c711b01da5f867cfe14faf2fb84c9e8886782ce3de52.js":{"logical_path":"tinymce/plugins/help/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":14457,"digest":"18f46f77691cc2f94b36c711b01da5f867cfe14faf2fb84c9e8886782ce3de52","integrity":"sha256-GPRvd2kcwvlLNscRsB2l+GfP4U+vL7hMnoiGeCzj3lI="},"tinymce/plugins/hr/plugin-9664dcccc57ea070459d3ba1aba0916f22c941d7a601f9d4cc91b9d29365b15a.js":{"logical_path":"tinymce/plugins/hr/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":1355,"digest":"9664dcccc57ea070459d3ba1aba0916f22c941d7a601f9d4cc91b9d29365b15a","integrity":"sha256-lmTczMV+oHBFnTuhq6CRbyLJQdemAfnUzJG50pNlsVo="},"tinymce/plugins/image/plugin-1f27e4ea86eb5aa38162dd5ba9dc2c4dd1ee8bd5d11f5583420979cf05d16f86.js":{"logical_path":"tinymce/plugins/image/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":15667,"digest":"1f27e4ea86eb5aa38162dd5ba9dc2c4dd1ee8bd5d11f5583420979cf05d16f86","integrity":"sha256-Hyfk6obrWqOBYt1bqdwsTdHui9XRH1WDQgl5zwXRb4Y="},"tinymce/plugins/imagetools/plugin-c4dab69e83c305806965c9b31f0ea987b2e2a82a7cb893376775e06cf233a59c.js":{"logical_path":"tinymce/plugins/imagetools/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":41850,"digest":"c4dab69e83c305806965c9b31f0ea987b2e2a82a7cb893376775e06cf233a59c","integrity":"sha256-xNq2noPDBYBpZcmzHw6ph7LiqCp8uJM3Z3XgbPIzpZw="},"tinymce/plugins/importcss/plugin-cbf47759816f889168075dc99299a2c0913572f8edcc2e1ef4b994b9b61cae30.js":{"logical_path":"tinymce/plugins/importcss/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":4619,"digest":"cbf47759816f889168075dc99299a2c0913572f8edcc2e1ef4b994b9b61cae30","integrity":"sha256-y/R3WYFviJFoB13JkpmiwJE1cvjtzC4e9LmUubYcrjA="},"tinymce/plugins/insertdatetime/plugin-75e743483171dc0dc5b35e040cd1ff5d6ef7d4e2d609dc1ce68589420ccc07c2.js":{"logical_path":"tinymce/plugins/insertdatetime/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":4725,"digest":"75e743483171dc0dc5b35e040cd1ff5d6ef7d4e2d609dc1ce68589420ccc07c2","integrity":"sha256-dedDSDFx3A3Fs14EDNH/XW731OLWCdwc5oWJQgzMB8I="},"tinymce/plugins/legacyoutput/plugin-46d0010c4bcbf3c9f0a737f16a659768461a617884441096dae0102a2654a089.js":{"logical_path":"tinymce/plugins/legacyoutput/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":4352,"digest":"46d0010c4bcbf3c9f0a737f16a659768461a617884441096dae0102a2654a089","integrity":"sha256-RtABDEvL88nwpzfxamWXaEYaYXiERBCW2uAQKiZUoIk="},"tinymce/plugins/link/plugin-bc112313d4019d56fc62bf3d7feac911b1eb5e8b1272256e8e926380f098599e.js":{"logical_path":"tinymce/plugins/link/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":11480,"digest":"bc112313d4019d56fc62bf3d7feac911b1eb5e8b1272256e8e926380f098599e","integrity":"sha256-vBEjE9QBnVb8Yr89f+rJEbHrXosSciVujpJjgPCYWZ4="},"tinymce/plugins/lists/plugin-52d9f2d934ac50304bdd9159bd3982ca5b39afdc23aaae86d1ac47ccf559c025.js":{"logical_path":"tinymce/plugins/lists/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":17665,"digest":"52d9f2d934ac50304bdd9159bd3982ca5b39afdc23aaae86d1ac47ccf559c025","integrity":"sha256-Utny2TSsUDBL3ZFZvTmCyls5r9wjqq6G0axHzPVZwCU="},"tinymce/plugins/media/plugin-49171347d2bc7f405eacee0b753912075a966708924af29ca75007f0c0b532a2.js":{"logical_path":"tinymce/plugins/media/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":18047,"digest":"49171347d2bc7f405eacee0b753912075a966708924af29ca75007f0c0b532a2","integrity":"sha256-SRcTR9K8f0BerO4LdTkSB1qWZwiSSvKcp1AH8MC1MqI="},"tinymce/plugins/nonbreaking/plugin-a63cb86503260a85efe7db0b1521c0d0a80cd27f46706713230938e0c44bd670.js":{"logical_path":"tinymce/plugins/nonbreaking/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2049,"digest":"a63cb86503260a85efe7db0b1521c0d0a80cd27f46706713230938e0c44bd670","integrity":"sha256-pjy4ZQMmCoXv59sLFSHA0KgM0n9GcGcTIwk44MRL1nA="},"tinymce/plugins/noneditable/plugin-e74020a6f58e8c258309f4536aeea2a896a795cb13d69696c388e4246c54578b.js":{"logical_path":"tinymce/plugins/noneditable/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2610,"digest":"e74020a6f58e8c258309f4536aeea2a896a795cb13d69696c388e4246c54578b","integrity":"sha256-50AgpvWOjCWDCfRTau6iqJanlcsT1paWw4jkJGxUV4s="},"tinymce/plugins/pagebreak/plugin-839ecfcf70f7d0365c2d1e3ef3a55595069b938c19aeede714bc31b61a67026b.js":{"logical_path":"tinymce/plugins/pagebreak/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2684,"digest":"839ecfcf70f7d0365c2d1e3ef3a55595069b938c19aeede714bc31b61a67026b","integrity":"sha256-g57Pz3D30DZcLR4+86VVlQabk4wZru3nFLwxthpnAms="},"tinymce/plugins/paste/plugin-931ce6f77c1daecc9e5c613b90cad50d5789099add967b7b13774defbd192b0f.js":{"logical_path":"tinymce/plugins/paste/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":24617,"digest":"931ce6f77c1daecc9e5c613b90cad50d5789099add967b7b13774defbd192b0f","integrity":"sha256-kxzm93wdrsyeXGE7kMrVDVeJCZrdlnt7E3dN770ZKw8="},"tinymce/plugins/preview/plugin-41472eb0321860529e83e84e54a86f32c5c0858a16c8e7738b838e31266447bc.js":{"logical_path":"tinymce/plugins/preview/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3346,"digest":"41472eb0321860529e83e84e54a86f32c5c0858a16c8e7738b838e31266447bc","integrity":"sha256-QUcusDIYYFKeg+hOVKhvMsXAhYoWyOdzi4OOMSZkR7w="},"tinymce/plugins/print/plugin-a7cd4beef6dde992d25d4d6720a5a2d9d15afca45e037d123a41a82ef431c78f.js":{"logical_path":"tinymce/plugins/print/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":1293,"digest":"a7cd4beef6dde992d25d4d6720a5a2d9d15afca45e037d123a41a82ef431c78f","integrity":"sha256-p81L7vbd6ZLSXU1nIKWi2dFa/KReA30SOkGoLvQxx48="},"tinymce/plugins/save/plugin-e48e177a9505d7a21fb22a62d400fb95c30aa3f9de119f5531eb360f7c52fe7b.js":{"logical_path":"tinymce/plugins/save/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2635,"digest":"e48e177a9505d7a21fb22a62d400fb95c30aa3f9de119f5531eb360f7c52fe7b","integrity":"sha256-5I4XepUF16Ifsipi1AD7lcMKo/neEZ9VMes2D3xS/ns="},"tinymce/plugins/searchreplace/plugin-43e62c6dc566523c4e4bf782d73819568072db159cefa29adddf5f8aa9c2d06b.js":{"logical_path":"tinymce/plugins/searchreplace/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":8571,"digest":"43e62c6dc566523c4e4bf782d73819568072db159cefa29adddf5f8aa9c2d06b","integrity":"sha256-Q+YsbcVmUjxOS/eC1zgZVoBy2xWc76Ka3d9fiqnC0Gs="},"tinymce/plugins/spellchecker/plugin-611b439b3cce8c78a716a66500a38fc7be57b09d9cd4bf3f3d72de0fe3a9a4dd.js":{"logical_path":"tinymce/plugins/spellchecker/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":12144,"digest":"611b439b3cce8c78a716a66500a38fc7be57b09d9cd4bf3f3d72de0fe3a9a4dd","integrity":"sha256-YRtDmzzOjHinFqZlAKOPx75XsJ2c1L8/PXLeD+OppN0="},"tinymce/plugins/tabfocus/plugin-419ef25b5f1aab6043e496e4f6132d3b0505ffa5398e3b66f7e8a8280268077d.js":{"logical_path":"tinymce/plugins/tabfocus/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":2645,"digest":"419ef25b5f1aab6043e496e4f6132d3b0505ffa5398e3b66f7e8a8280268077d","integrity":"sha256-QZ7yW18aq2BD5Jbk9hMtOwUF/6U5jjtm9+ioKAJoB30="},"tinymce/plugins/table/plugin-0d4057859445665d58e85d861f2bbf5f983dfa6014b99b6cca0a6561309deb94.js":{"logical_path":"tinymce/plugins/table/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":159001,"digest":"0d4057859445665d58e85d861f2bbf5f983dfa6014b99b6cca0a6561309deb94","integrity":"sha256-DUBXhZRFZl1Y6F2GHyu/X5g9+mAUuZtsygplYTCd65Q="},"tinymce/plugins/template/plugin-0ea66983b1cfb34cd2ea8e73ec305c1156174ef0e932132bee2dfa4b99cbb4f5.js":{"logical_path":"tinymce/plugins/template/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":7786,"digest":"0ea66983b1cfb34cd2ea8e73ec305c1156174ef0e932132bee2dfa4b99cbb4f5","integrity":"sha256-DqZpg7HPs0zS6o5z7DBcEVYXTvDpMhMr7i36S5nLtPU="},"tinymce/plugins/textcolor/plugin-c8cecbcd75555cc03593b9dedaf2b6ffb78dffc92974d2d1bf7f65b94ab61d30.js":{"logical_path":"tinymce/plugins/textcolor/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":6210,"digest":"c8cecbcd75555cc03593b9dedaf2b6ffb78dffc92974d2d1bf7f65b94ab61d30","integrity":"sha256-yM7LzXVVXMA1k7ne2vK2/7eN/8kpdNLRv39luUq2HTA="},"tinymce/plugins/textpattern/plugin-411ee2dc5fa1d8386fc59eae170f80369ed6d2d2990d609dbcfc656262c6620b.js":{"logical_path":"tinymce/plugins/textpattern/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":5819,"digest":"411ee2dc5fa1d8386fc59eae170f80369ed6d2d2990d609dbcfc656262c6620b","integrity":"sha256-QR7i3F+h2DhvxZ6uFw+ANp7W0tKZDWCdvPxlYmLGYgs="},"tinymce/plugins/toc/plugin-b7f229f800cabbbaea4e36a56981011cbddff446bd383ecbb28ddbd4b9cc55bd.js":{"logical_path":"tinymce/plugins/toc/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":4374,"digest":"b7f229f800cabbbaea4e36a56981011cbddff446bd383ecbb28ddbd4b9cc55bd","integrity":"sha256-t/Ip+ADKu7rqTjalaYEBHL3f9Ea9OD7Lso3b1LnMVb0="},"tinymce/plugins/visualblocks/plugin-58fa11272d279775e4b12858c1d2acc2e1b5feebe84b3db3ee7df855665d12e4.js":{"logical_path":"tinymce/plugins/visualblocks/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":3095,"digest":"58fa11272d279775e4b12858c1d2acc2e1b5feebe84b3db3ee7df855665d12e4","integrity":"sha256-WPoRJy0nl3XksShYwdKswuG1/uvoSz2z7n34VWZdEuQ="},"tinymce/plugins/visualchars/plugin-9963828126c769478acfc74773441472c043518d458c4777c0e766d3298dbcaf.js":{"logical_path":"tinymce/plugins/visualchars/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":10007,"digest":"9963828126c769478acfc74773441472c043518d458c4777c0e766d3298dbcaf","integrity":"sha256-mWOCgSbHaUeKz8dHc0QUcsBDUY1FjEd3wOdm0ymNvK8="},"tinymce/plugins/wordcount/plugin-049da43cf52b32d85ec1ea85bb6ea65ef08e31ff3a26ceac93885974094db7f1.js":{"logical_path":"tinymce/plugins/wordcount/plugin.js","mtime":"2017-12-25T19:51:42+01:00","size":12538,"digest":"049da43cf52b32d85ec1ea85bb6ea65ef08e31ff3a26ceac93885974094db7f1","integrity":"sha256-BJ2kPPUrMtheweqFu26mXvCOMf86Js6sk4hZdAlNt/E="},"tinymce/skins/lightgray/content.inline.min-58c28f0e832b8f0622b03e4d5faaada2cb2c481a1ec171de02de97fe84555b19.css":{"logical_path":"tinymce/skins/lightgray/content.inline.min.css","mtime":"2017-12-25T19:51:42+01:00","size":3327,"digest":"58c28f0e832b8f0622b03e4d5faaada2cb2c481a1ec171de02de97fe84555b19","integrity":"sha256-WMKPDoMrjwYisD5NX6qtosssSBoewXHeAt6X/oRVWxk="},"tinymce/skins/lightgray/content.min-9aaa337dc1206c756b48c9ea0444faac9402206186069dc7423e912a71460055.css":{"logical_path":"tinymce/skins/lightgray/content.min.css","mtime":"2017-12-25T19:51:42+01:00","size":3733,"digest":"9aaa337dc1206c756b48c9ea0444faac9402206186069dc7423e912a71460055","integrity":"sha256-mqozfcEgbHVrSMnqBET6rJQCIGGGBp3HQj6RKnFGAFU="},"tinymce/skins/lightgray/content.mobile.min-230c31f65356c7cb1799244a34f7a722c92a6d614e06e59d48db0ebccd7f2346.css":{"logical_path":"tinymce/skins/lightgray/content.mobile.min.css","mtime":"2017-12-25T19:51:42+01:00","size":235,"digest":"230c31f65356c7cb1799244a34f7a722c92a6d614e06e59d48db0ebccd7f2346","integrity":"sha256-Iwwx9lNWx8sXmSRKNPenIskqbWFOBuWdSNsOvM1/I0Y="},"tinymce/skins/lightgray/fonts/tinymce-mobile-e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213.woff":{"logical_path":"tinymce/skins/lightgray/fonts/tinymce-mobile.woff","mtime":"2017-12-25T19:51:42+01:00","size":4624,"digest":"e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213","integrity":"sha256-5kvxVqQy1j9bNLRWe1E9wNNRtJFhx/YI+4JXS/3Z0hM="},"tinymce/skins/lightgray/skin.min-0ba2274577ef3fe1e07c73ada6e6e6fb6e6db9dc0e2aeba6053e7395c66215e8.css":{"logical_path":"tinymce/skins/lightgray/skin.min.css","mtime":"2017-12-25T19:51:42+01:00","size":43094,"digest":"0ba2274577ef3fe1e07c73ada6e6e6fb6e6db9dc0e2aeba6053e7395c66215e8","integrity":"sha256-C6InRXfvP+HgfHOtpubm+25tudwOKuumBT5zlcZiFeg="},"tinymce/skins/lightgray/skin.mobile.min-fe907c53c1657dd3f3c3cc22926b2f6a342a345d2b2f1a7953e3fdceb2841d4c.css":{"logical_path":"tinymce/skins/lightgray/skin.mobile.min.css","mtime":"2017-12-25T19:51:42+01:00","size":27962,"digest":"fe907c53c1657dd3f3c3cc22926b2f6a342a345d2b2f1a7953e3fdceb2841d4c","integrity":"sha256-/pB8U8FlfdPzw8wikmsvajQqNF0rLxp5U+P9zrKEHUw="},"tinymce/themes/inlite/theme-16e3ffb72e6e35097ba84668d5abd271f62120ba315d95d852f9210621952e54.js":{"logical_path":"tinymce/themes/inlite/theme.js","mtime":"2017-12-25T19:51:42+01:00","size":154354,"digest":"16e3ffb72e6e35097ba84668d5abd271f62120ba315d95d852f9210621952e54","integrity":"sha256-FuP/ty5uNQl7qEZo1avScfYhILoxXZXYUvkhBiGVLlQ="},"tinymce/themes/mobile/theme-c3d08a70821c5f901e5b53dbf05548b0c7dc5424c8c42a260b3e5b496fbdb65c.js":{"logical_path":"tinymce/themes/mobile/theme.js","mtime":"2017-12-25T19:51:42+01:00","size":231954,"digest":"c3d08a70821c5f901e5b53dbf05548b0c7dc5424c8c42a260b3e5b496fbdb65c","integrity":"sha256-w9CKcIIcX5AeW1Pb8FVIsMfcVCTIxComCz5bSW+9tlw="},"tinymce/themes/modern/theme-c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c.js":{"logical_path":"tinymce/themes/modern/theme.js","mtime":"2017-12-25T19:51:42+01:00","size":152847,"digest":"c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c","integrity":"sha256-xkjE8yFj1V5rIxEzmjodKeA5t/ee1ScYVGY8wBPpBSw="}},"assets":{"active_admin.css":"active_admin-d4f38d29ff0b2b9b05ed4ecbcebd736e750ad4b29369bc58d35194f7e107eaae.css","active_admin/nested_menu_arrow.gif":"active_admin/nested_menu_arrow-15084d93c65c1964d7077700ea748bd2d70cfa2d4c19707c58a9c64e232dd442.gif","active_admin/nested_menu_arrow_dark.gif":"active_admin/nested_menu_arrow_dark-7c43b8e0a5f8823875f49a093c9d7a6b374f885b6f9cc248ae9cd7e6e9b29034.gif","active_admin/orderable.png":"active_admin/orderable-29374dbb55b0012d78a37c614d573bb3474f0779849b478a147d0f1845ca6617.png","active_admin/print.css":"active_admin/print-cf99cbf27fb92065a9eacd28e6fad48fa72cadaf6e0918790e8d35b11d8f99f6.css","active_admin.js":"active_admin-115a9ff718613239e12adb1f3bf498a1ccba1735051b69a5d1fbee5e495ff489.js","tinymce.js":"tinymce-e0a997125d47cb527bd10d048179b98997bbac47ebaca5bd3e7a7439ae29d0f0.js","application.css":"application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css","jquery-ui/ui-icons_444444_256x240.png":"jquery-ui/ui-icons_444444_256x240-31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d.png","jquery-ui/ui-icons_555555_256x240.png":"jquery-ui/ui-icons_555555_256x240-32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5.png","jquery-ui/ui-icons_ffffff_256x240.png":"jquery-ui/ui-icons_ffffff_256x240-350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a.png","jquery-ui/ui-icons_777620_256x240.png":"jquery-ui/ui-icons_777620_256x240-0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b.png","jquery-ui/ui-icons_cc0000_256x240.png":"jquery-ui/ui-icons_cc0000_256x240-40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69.png","jquery-ui/ui-icons_777777_256x240.png":"jquery-ui/ui-icons_777777_256x240-faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f.png","flags/4x3/ad.svg":"flags/4x3/ad-3fc30cc000942b4f3369bdf6ccb85b16f59f4e78f9c53d73252ab529da35ba0a.svg","flags/1x1/ad.svg":"flags/1x1/ad-db2c38d603b8eecc9085d6ac1261bbefd3bcd852d44bec476e5e115914bcb2fd.svg","flags/4x3/ae.svg":"flags/4x3/ae-7f41692ef179841ca6e9cae42c704113274707228ff3d2b1ee5169916db15b1e.svg","flags/1x1/ae.svg":"flags/1x1/ae-8c9b9b1f108511722e1f1b0f9a029edf808ff285406545f24e327052e0efa780.svg","flags/4x3/af.svg":"flags/4x3/af-e271fd8f2fcdd0adda22a0e699173ff4e4cc65adfe7f05652cb77375eea99a93.svg","flags/1x1/af.svg":"flags/1x1/af-2629bc2e10edd54c384650f9aab1c6dfaf7101fda43ba3af627f0ec226db5892.svg","flags/4x3/ag.svg":"flags/4x3/ag-91fee45d7e1bab658f840a721364dd6eff0b67f9135dc8445a1b3554c347c2e9.svg","flags/1x1/ag.svg":"flags/1x1/ag-476bf833d4e0789f71d7b0d24164734ed97627f36edd09cc75991bcfbb2aa7af.svg","flags/4x3/ai.svg":"flags/4x3/ai-0106851bba5120a0f2bca5e6187ea65c9846e696f5ca57631aa89371cdf98871.svg","flags/1x1/ai.svg":"flags/1x1/ai-50a3279d492c2932919c02880b69da7bb7948ce96988d8ccc9b16357f006165c.svg","flags/4x3/al.svg":"flags/4x3/al-f8bc9837446a4880d29088f18bfc014b4cde95d8edda1241be22b5724a74ea8d.svg","flags/1x1/al.svg":"flags/1x1/al-fb2c4d723ddbfb2c659ee2b3052d33347c130fb1024e2cb0ddd17f25b082542c.svg","flags/4x3/am.svg":"flags/4x3/am-aeabb81fbe6ac768ba7b95bb22e5a1791eb35ff83d0b5d6785c88ddc6835444e.svg","flags/1x1/am.svg":"flags/1x1/am-6fc2c9fb24a6a079960d619cc1fdaeee31cdb52d27c75bb9b065d9664d853c11.svg","flags/4x3/ao.svg":"flags/4x3/ao-34ea70b51c9069ef1a859935f07a64cfffab4e08438a9c746898da56b495d127.svg","flags/1x1/ao.svg":"flags/1x1/ao-1240d65f5dd9d8945701ed46611bd97f53f2cecf15b435cc54604eb79f4b97a8.svg","flags/4x3/aq.svg":"flags/4x3/aq-6e2cee0eae620cd3f1fe6be665fd216f9a54a2afe215441005904dfeca24c169.svg","flags/1x1/aq.svg":"flags/1x1/aq-73c87173b09f476af2367895c76cf65d159c0a0b2ec292c1f1f5b08b2e78f829.svg","flags/4x3/ar.svg":"flags/4x3/ar-71eca3c44a303392f2c8db443add184c4c79d9fa8a3e729be2528c8db53790b6.svg","flags/1x1/ar.svg":"flags/1x1/ar-0f75960e9ea2b2533e9112d4fc02154182f72460720c5a7d4dc21ef47758c369.svg","flags/4x3/as.svg":"flags/4x3/as-29ac7248b1c428a68d0e2b1cfca4fade7b0fcb38151bf980d35c3b0be63d3d91.svg","flags/1x1/as.svg":"flags/1x1/as-f516550a6b6cf7e277a1877cad9afe10f694ac32c92df7709690913fd59ecf20.svg","flags/4x3/at.svg":"flags/4x3/at-e6517cfc6605c0ffa13da8db795d6e4cd353f72434f8fe38a2ebab7ba685081b.svg","flags/1x1/at.svg":"flags/1x1/at-b9f9e8349460db6d35662b445a8a5fff96fccd904fff3411b711d31b2d7b7f16.svg","flags/4x3/au.svg":"flags/4x3/au-c929c02559051c3f51c0d93dd9df0d886b6c1efa083c0f101d2b3fd39706726e.svg","flags/1x1/au.svg":"flags/1x1/au-96828c63a52eff55282096c045a3822cde99a00bf20528810d31f27b27208593.svg","flags/4x3/aw.svg":"flags/4x3/aw-44597b0ede9ff7df0e659c464a51fdbc1a7f5cc5cd621d281302843c23a905bf.svg","flags/1x1/aw.svg":"flags/1x1/aw-2bd4b1890e233baeae0bcaaf1841803de35dd9c422f486588e48bf3506d69ae0.svg","flags/4x3/ax.svg":"flags/4x3/ax-95093e740b0b492f7cd96fe370fa2478f0d0148b89b424cd8436807234ade9dd.svg","flags/1x1/ax.svg":"flags/1x1/ax-99af962543005067e7239903eb6bc23226d30ce14a7c6408693dc9641193ddc3.svg","flags/4x3/az.svg":"flags/4x3/az-c0959e214bf9a3e94993cfc03f4884b15f6d8c4dd20842a5052a29a8495fd431.svg","flags/1x1/az.svg":"flags/1x1/az-3db731c28289795dc3bda91b3bab129d994a09b8ee0959d34f21a1f840f894de.svg","flags/4x3/ba.svg":"flags/4x3/ba-388ea99507a04cc5d4768bd708d984714aeebbe4177a1cf8ffe0b8331dd856d9.svg","flags/1x1/ba.svg":"flags/1x1/ba-b7d7ab49229704dff0192935c9fb7fb4ea6ba989ce4fee832a738a5d78b39d71.svg","flags/4x3/bb.svg":"flags/4x3/bb-6df74e1044b7f42c2c3b1082d46eb0198aa65a180459fdd950838cd2e6c00ee1.svg","flags/1x1/bb.svg":"flags/1x1/bb-eb10f33cbde25ab6ccaa49cbe3976b4f5ece2fa1d3d485394caa158f10b8b8c9.svg","flags/4x3/bd.svg":"flags/4x3/bd-6cc222c4343f0027697ddd9e8d48f2cf93d3f677b6460b530eabefd2410cfef3.svg","flags/1x1/bd.svg":"flags/1x1/bd-2dc72311aca457668c8bce4f3a22c1b76320e00be50a58fb4001ea39caf6725c.svg","flags/4x3/be.svg":"flags/4x3/be-2b7e73068f4f120ed0ccc3a9fbb8566c9574b206afd8373ed9050e2a971c4f99.svg","flags/1x1/be.svg":"flags/1x1/be-c4c9351d83a4db1f8c7c73dd6476569f0dfd82290ffd20275b7372908c2f2a7e.svg","flags/4x3/bf.svg":"flags/4x3/bf-56669967fef6bb607ea2fd26d32d922cf78f176115287e37e9cf0b8bbec677f0.svg","flags/1x1/bf.svg":"flags/1x1/bf-ffc3651e87b9ccc9374d5bc95617aad474bcaa35871c83ae91fa71eb8b46bab3.svg","flags/4x3/bg.svg":"flags/4x3/bg-ad796782d048f6ddc6715f7ea915a2c86716753579735ec071a106a7f3fc13b6.svg","flags/1x1/bg.svg":"flags/1x1/bg-962bd196cc8e4b702757e17a9002e867843c16415a47a52ecd97459278e5fa1f.svg","flags/4x3/bh.svg":"flags/4x3/bh-aeff05c6dfa41e89db539312faedc41198ba2f2d9bf5ad9f22992a0a5a4151e8.svg","flags/1x1/bh.svg":"flags/1x1/bh-12da0d548841b860a7aedbbc858df1278a4f56105ae643f9379f5c2a3caa294a.svg","flags/4x3/bi.svg":"flags/4x3/bi-7f43c6407a6f007fd70e7b43f9b34e870cc757736a9e2399c46381c8434d238f.svg","flags/1x1/bi.svg":"flags/1x1/bi-454adb690bfce8243896377b9c314ef8f447ec4d85dc677860f521a6c30c896e.svg","flags/4x3/bj.svg":"flags/4x3/bj-85ecb891b5ebbe5802bd23d41fa44f1c1dbf047aceba991e6006e377c53fa263.svg","flags/1x1/bj.svg":"flags/1x1/bj-861b63ba692ecf3e1705296e51ef4f80da47a2eff5cfa29a787bcbc4fc989a53.svg","flags/4x3/bl.svg":"flags/4x3/bl-2c832da5dfab278f90dcfd6265c08211802e94d9b6a5634df6dacdb750723312.svg","flags/1x1/bl.svg":"flags/1x1/bl-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/bm.svg":"flags/4x3/bm-05e6a9d863d77266cc3e2a74fddea640757e09b54d3032711f0d1890b5b61d3d.svg","flags/1x1/bm.svg":"flags/1x1/bm-0a16d9ab856676f9511627004ba4ee08ebe041533a33046c3f732ffb2793cf8a.svg","flags/4x3/bn.svg":"flags/4x3/bn-1560949666220d88ee037b03ce1ac0b95c1b91667f05cf2b8b06a043efb01253.svg","flags/1x1/bn.svg":"flags/1x1/bn-387ebb4b9e1b3796c94edd61402851eafb8b185d7061671b832c1879db69d6eb.svg","flags/4x3/bo.svg":"flags/4x3/bo-96c7f8e64029f530108baee22d8a07cad2787f41eeed0b647f800bb533c39c63.svg","flags/1x1/bo.svg":"flags/1x1/bo-ef679f07e201a91bc3e2152310eb597f731f7133d58be7fc0b1bbb3d8538c666.svg","flags/4x3/bq.svg":"flags/4x3/bq-687781ca2bff027ee1c2bf587d45147cbe81af412d8a4c52e89673535bfa6a6c.svg","flags/1x1/bq.svg":"flags/1x1/bq-4c8a202ed7a99c1515fad01c0b79234163b42cfdc813aee71c0d277b49aadaa5.svg","flags/4x3/br.svg":"flags/4x3/br-8370504ef87598decf706a50bc8b5deecfa80f965b4c3642d2207c9e0804be3a.svg","flags/1x1/br.svg":"flags/1x1/br-cce00e29adbdf110d4155153c8f21e36c46c34847baffafc33b806e121e320d7.svg","flags/4x3/bs.svg":"flags/4x3/bs-80764fdde4884571c2ce5c348231dfe2c57c9e81d4d0d8722ae649ef37a9888c.svg","flags/1x1/bs.svg":"flags/1x1/bs-0a06f669be5ce81e27f5d9ace25e2254113cad9c2964208b5cd136e8b173b6e8.svg","flags/4x3/bt.svg":"flags/4x3/bt-9d00de93c399a0ed1118946c0d662d997847480445bfbbba259e42f80b170be6.svg","flags/1x1/bt.svg":"flags/1x1/bt-32fb8022976e00163073b1f3ff2f62dda6915dd4270d2e09ae51babe67d2ce32.svg","flags/4x3/bv.svg":"flags/4x3/bv-e0fd8f945e245badbcc8deedd6c139e2e19d26b3aea7bf1b9714595a2b08def1.svg","flags/1x1/bv.svg":"flags/1x1/bv-dceefec7161747877af75d9c4b5bd8c53bfeb5cbbe94b41de9a2201321673653.svg","flags/4x3/bw.svg":"flags/4x3/bw-b5231bca6e8f2dd2371e3b4f776cb33af3889d2ad41c3791feb7cba3afe12992.svg","flags/1x1/bw.svg":"flags/1x1/bw-35bd0c7c542ab29aa65df0322f37befe54917cde0ec29a6358a8cbfcd3eb78a2.svg","flags/4x3/by.svg":"flags/4x3/by-0111fe7946228bd49fa5ffc1d04e1dbea12bb0483cee4bf146e23fcb5d7bd829.svg","flags/1x1/by.svg":"flags/1x1/by-3a64902f39b8bac7c042cadcd2ace69975498cc6254f60f31829ebbfe31c2ef5.svg","flags/4x3/bz.svg":"flags/4x3/bz-f6761e8e1132b192c6c2dddcb1d0239ed14e801b8902a7ee8fb0cb869a517eab.svg","flags/1x1/bz.svg":"flags/1x1/bz-2d1e5ec107a277b8e97fede80f512c23ebbf9c225a2c5450dc51c5fb03c9571b.svg","flags/4x3/ca.svg":"flags/4x3/ca-cf63f34a0cef8ed56b4cf1ba24fecc20cea252a9eb9e2c16acccf4eb80b32f49.svg","flags/1x1/ca.svg":"flags/1x1/ca-5c78fbcd8924e8f76111f1cc50317decd6b7c1761e57f19ad33f0b295d002138.svg","flags/4x3/cc.svg":"flags/4x3/cc-f5d8e042b0f7ee2be5ed555b4ea6a0586e69eeb9230701967903364c19e49006.svg","flags/1x1/cc.svg":"flags/1x1/cc-7dc42986b5859331d9f6c96ae7a97b378ff38e4480072cbecceae78e338891a0.svg","flags/4x3/cd.svg":"flags/4x3/cd-9d7d8b11e63073792e3d5e0327cc673101c65ae7545d721b8b1504c31a0c0078.svg","flags/1x1/cd.svg":"flags/1x1/cd-f42723b2e3b7815b2a4b970c5d8a8abea987cf16ff26dbab0c1a78f3ffa3d1fd.svg","flags/4x3/cf.svg":"flags/4x3/cf-902b209a0eaeb8f41f529b5c98240d4fa94dffd58ac3bdc2b6c574125897bb8c.svg","flags/1x1/cf.svg":"flags/1x1/cf-f9b65e234b309ba4f3b2261dcb605b257bd941a308d208b1eaa89af874c779ec.svg","flags/4x3/cg.svg":"flags/4x3/cg-f62e43d08581b8665ab9a7e61ab62cc6b3dd8e6fd0722c7d45c6ddc3f46ec5ab.svg","flags/1x1/cg.svg":"flags/1x1/cg-f2fbf08b1f5fd7e097600a9399d467cb9af8d24fd103a3eeb99f5cf58e6fc0b6.svg","flags/4x3/ch.svg":"flags/4x3/ch-830fe6654b170d461a76a7932b39d352ec30895d512c009a5c193c5a28289158.svg","flags/1x1/ch.svg":"flags/1x1/ch-9f95a95e181489d64144d4502991c00823cf19fefc029cb639199cb100863a0a.svg","flags/4x3/ci.svg":"flags/4x3/ci-3e6b86d6fc1a24b5635c258bbde180f8638e114be354d7379406d5718e46b70b.svg","flags/1x1/ci.svg":"flags/1x1/ci-816edfc3bfc44353f99572310ba67643f979b1681c2643ecc34255df1dbee05e.svg","flags/4x3/ck.svg":"flags/4x3/ck-cadf8156d64ddcff3d60079d017b12bb4e25867e58fa2618f42defa4f7bc8587.svg","flags/1x1/ck.svg":"flags/1x1/ck-450d3b83c32f220510bdbab3ec0fca14edf895e53db9e26e4cd00a3edfb3e224.svg","flags/4x3/cl.svg":"flags/4x3/cl-28ce953691b1c4b0c6d562370913b3ad645e29e56296c16762992e3c30f2a4a8.svg","flags/1x1/cl.svg":"flags/1x1/cl-ed5421f0ff3ba05785268eed2abd3abf76125ec832e519bc10a30db278c23662.svg","flags/4x3/cm.svg":"flags/4x3/cm-d22cb6519bfbf9fbae46b283f6d882f8d46713f18ba59969ae45c542ba2bc621.svg","flags/1x1/cm.svg":"flags/1x1/cm-4619b0400d175f6c0f686526cfdbfcc6f7c2fc7587449e05ab0385cc7d4e8bd4.svg","flags/4x3/cn.svg":"flags/4x3/cn-7af9da3dd810174340b79e6fe636bec183c71d7ce314ac4a5a815bfd388dea54.svg","flags/1x1/cn.svg":"flags/1x1/cn-22e04d44d7f85e6f5800bddc6a497e5722de8db2ad74c6c525c392bd7b8c6e09.svg","flags/4x3/co.svg":"flags/4x3/co-ef2a3c7e495d85d7df1b9bda27023cd558abe89402cad0ff42428c2c5b877551.svg","flags/1x1/co.svg":"flags/1x1/co-42915db89e2fa2f9f97c09ecafc188eb2ec4e51efa87685a01c25d2f0afddf45.svg","flags/4x3/cr.svg":"flags/4x3/cr-7853ef9dbb5832a6d2738b44afdecfcdaa80c56cb66c448b8a8657e236854c8d.svg","flags/1x1/cr.svg":"flags/1x1/cr-b86f916cc80cc14db90b66c652a2919a26baf2864451685af9c34d6310c3f8c6.svg","flags/4x3/cu.svg":"flags/4x3/cu-e3a3afa4a5c661ad431dc45eb501d7e1280b4a397bafa3956a9fc5bab8735f45.svg","flags/1x1/cu.svg":"flags/1x1/cu-9563bc3aa0b1ac659dddaa2534c37d338e1da3dfd3726a717fc85ca8449c83da.svg","flags/4x3/cv.svg":"flags/4x3/cv-d39c3ae09026623cebad38bbe41231aea9b9afacf7eca1d0abf6666e91dd8bbc.svg","flags/1x1/cv.svg":"flags/1x1/cv-78857e96ac5b49478a49578f422abe217af9ed7d90fa2d08ae72a67de4f6999e.svg","flags/4x3/cw.svg":"flags/4x3/cw-c65dd455b3c113d9088e563033c5f1ed3945d6dd88c8f13317fe297fd2291776.svg","flags/1x1/cw.svg":"flags/1x1/cw-61f38f9076443eb7ca682abc21e6ea5f170bd855813d7297d85602b76ca36171.svg","flags/4x3/cx.svg":"flags/4x3/cx-aecc7a8b4b84b9f00a63154b027cb8ec78bebcec33e756b5e95151efb43420f7.svg","flags/1x1/cx.svg":"flags/1x1/cx-c052a0033a120d56c108dc0a919c3fccb9d01a4b78f1f778e3f2973e96197868.svg","flags/4x3/cy.svg":"flags/4x3/cy-b8e0d56b75e0954429cb2253aaf289a83e3c72abd52b4132bdd4016f2bbd43c9.svg","flags/1x1/cy.svg":"flags/1x1/cy-34aa50b77e1b86f5305beec283996cabc45fef1950582b868addc40fd9a8438f.svg","flags/4x3/cz.svg":"flags/4x3/cz-c2a15f3c50b7920c7d82fd9fb21f77c44fb3883f0e34dcf197a23d92d9212290.svg","flags/1x1/cz.svg":"flags/1x1/cz-487367824632a5097e16d7ed1ffc7fe8e233f9e1af45522571e1d4da10de92c7.svg","flags/4x3/de.svg":"flags/4x3/de-32f54fb46c7fcaf2dfcf9172273456ea57f975efb228860def92481efe51c506.svg","flags/1x1/de.svg":"flags/1x1/de-2c94f333afeb14810030d786620fc32e65ba79af53b1037192383823996bb77f.svg","flags/4x3/dj.svg":"flags/4x3/dj-d84d938856e7b6bdf8d38413c84a6968f94dc2adb218f2a9fab3d703341efc33.svg","flags/1x1/dj.svg":"flags/1x1/dj-6960cafac7e0d593152b60988fd12f5d1bb95068bf055c638cb999459f932692.svg","flags/4x3/dk.svg":"flags/4x3/dk-fdd09296ac803a8cf4066ff5488821458a9788985e3cc09356d4c4ef81959ecf.svg","flags/1x1/dk.svg":"flags/1x1/dk-87924239a5ff1605582e1736f5ef17c9bd9d580d796d94b05ff668e2a52a223e.svg","flags/4x3/dm.svg":"flags/4x3/dm-dc3b5c9634f0751ebfec181b12a7c530673ced1001b62a9126ed5ae39ba57203.svg","flags/1x1/dm.svg":"flags/1x1/dm-c8018ea775b0add069f676bbf4b446ed19886c192aa742bb6a61c3602ca63211.svg","flags/4x3/do.svg":"flags/4x3/do-5e2d6816118f78fa4a362ee6a276dac655a4c99d57a9e53a52198f1624ed186a.svg","flags/1x1/do.svg":"flags/1x1/do-f9862ff8016b35d30d5c37ac2c585cdddf235e56ac9a7ae31a90c96963865f57.svg","flags/4x3/dz.svg":"flags/4x3/dz-8a14ddcb20a69c3265924fe2af141ea78c0af47ea07a88707c392a2793092cd4.svg","flags/1x1/dz.svg":"flags/1x1/dz-0e2ada15ba7882343f7512929d3cf981a23a91817fdda0be1ed6a093161b649e.svg","flags/4x3/ec.svg":"flags/4x3/ec-a4c3c62b4272f5000e1c8f563c45ce8305ec71f4e4e49ac477d81b5cb692d7e6.svg","flags/1x1/ec.svg":"flags/1x1/ec-c42aa1de56f2933fc6703e7a59ebc8b424c66f190697ee66814a137b56fa6969.svg","flags/4x3/ee.svg":"flags/4x3/ee-6148aad79adb1c847fedb9da5a7e9c9d47e99ef4c8f4853bb9800e738bddb19d.svg","flags/1x1/ee.svg":"flags/1x1/ee-9a87370a85922c5d103d9d21fe3e778b801a62cf40e1f0efe8d708c5fe3b3ac4.svg","flags/4x3/eg.svg":"flags/4x3/eg-3b2f122e512f0fc470666b35af4f677404d4b811cd795d5cf4e44a72ffd01285.svg","flags/1x1/eg.svg":"flags/1x1/eg-a050fc5953113bfa5e12867313b321df472eb86ad1e3d5362ebb27ac2edbd28b.svg","flags/4x3/eh.svg":"flags/4x3/eh-fea043048f74c728961fe981d7e5d50e286fef39f3e68659b699c6c357c202dd.svg","flags/1x1/eh.svg":"flags/1x1/eh-8ea23a1b6813465e739d6f5e2ca6727331fae96cd32c86041a1ba48926a14cfd.svg","flags/4x3/er.svg":"flags/4x3/er-b24dc54f7e94d0934d05faa7944e6039a56de8a5e4779a399046f047dbd1b949.svg","flags/1x1/er.svg":"flags/1x1/er-6921f9776ece4a1b1ec594ec5665076462cef2d0b41eba83a7bc840ecf88287d.svg","flags/4x3/es.svg":"flags/4x3/es-e36093927dc1fa109e4ddcd4baa65d53d233c23bcdd32796b96409b52c5adbc0.svg","flags/1x1/es.svg":"flags/1x1/es-16a6c048523ee57edd91e60e87aae136a96893b48828d932a24436bb219c00b9.svg","flags/4x3/et.svg":"flags/4x3/et-a3ef36d217667b7e8ebe910469c2eeef563f03d3ea5628ec7fea0f72650db28e.svg","flags/1x1/et.svg":"flags/1x1/et-f66f415e5d5b8b697ed7bb85f4ae3408f9cefaeed7ff0136c4c03da5c3601340.svg","flags/4x3/fi.svg":"flags/4x3/fi-a94779c54a538d2f57a421e6beb619f07cc9c2bda40817d236b686deb8eb3b4c.svg","flags/1x1/fi.svg":"flags/1x1/fi-865b1ae3ed34a0cf0928c6289411569add2065c7ea4fa6897f971c322d955b16.svg","flags/4x3/fj.svg":"flags/4x3/fj-97dd8f9b0d9df1cd965c8a85ecb6feb538acc83b470596ccd199f71dc3d2eff9.svg","flags/1x1/fj.svg":"flags/1x1/fj-f772a5a860faef823adad1b0dc8e848349d094f4fa3b37e48c87382bd443c861.svg","flags/4x3/fk.svg":"flags/4x3/fk-788901bf125ceebc6c23fa03c801420c787bbc4ce6aa4511ccaaba301e379886.svg","flags/1x1/fk.svg":"flags/1x1/fk-5d8df0034167cc75863d02bfdb6147da3a694102f7eea0d92e717a048437fc0f.svg","flags/4x3/fm.svg":"flags/4x3/fm-7167ec387c426a817bccbfec86c8f815b82b36504e1d480f4f9fa04177bdcba0.svg","flags/1x1/fm.svg":"flags/1x1/fm-d08e5959b5e3866cdf814f8d6ab594cb3ca84f0887a3adad3bff824ea0aca70a.svg","flags/4x3/fo.svg":"flags/4x3/fo-af6148d661d02a6580e8714a6271776b4b8bf3b656bfd5fd88acdd1aa170366a.svg","flags/1x1/fo.svg":"flags/1x1/fo-26d5af2770c46935170988cbad16ef9aad9be34b38ea92847e6646a516878598.svg","flags/4x3/fr.svg":"flags/4x3/fr-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg","flags/1x1/fr.svg":"flags/1x1/fr-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/ga.svg":"flags/4x3/ga-80f90062ef9aa4d236c81ec6c6c6e08058750794014bb93d8dbdc8e1684ca4fa.svg","flags/1x1/ga.svg":"flags/1x1/ga-a66094862d24f29704c190fe42ff50820923f3940ff417f3e1623e9089b57eb9.svg","flags/4x3/gb.svg":"flags/4x3/gb-d85f0f149b4390bed6624bc30ca2cbfa37d394f14474fcf81d63363ad363e284.svg","flags/1x1/gb.svg":"flags/1x1/gb-2f0cc6ed1e8e9a7e56cafd3500585d685ae0c51abacddc52f750fb4d23f60b04.svg","flags/4x3/gd.svg":"flags/4x3/gd-51a8d53466df4426bec5fb202dd8f35239324b9c8b5256d38fe411c4b79945cb.svg","flags/1x1/gd.svg":"flags/1x1/gd-9156f824a83004691a7a354e925bc1680b5cffe663bbfa37aa4609ff28148218.svg","flags/4x3/ge.svg":"flags/4x3/ge-4ef2c8e6f371a711c61ac54d8d201a80aab53767cacc5322fb848cd3e38b00e7.svg","flags/1x1/ge.svg":"flags/1x1/ge-a3af8272a5fb63372705825519543e53269282c4800b70e6a93ba69674524eee.svg","flags/4x3/gf.svg":"flags/4x3/gf-c7d5ee882949b708641f99ec02edcc6b3b2362d393cc3869342442225be7cd3d.svg","flags/1x1/gf.svg":"flags/1x1/gf-b297e376fc00d3d7bfafd081766dafc4590f4ac4b71f53bc2bbdf2c028547920.svg","flags/4x3/gg.svg":"flags/4x3/gg-e99b36723ffe04d7be392d612c76ef44e82bc84823d71793eb38e338116f0ee0.svg","flags/1x1/gg.svg":"flags/1x1/gg-3f764a4568626d43f89b2b200dcbfe68de3093be418716549ab7c5c33f433d37.svg","flags/4x3/gh.svg":"flags/4x3/gh-817c2eb8b3f7190647510371b2d38ad8e28e1348cb657e34778f970af5ca3868.svg","flags/1x1/gh.svg":"flags/1x1/gh-87a6486910cb62e58439da330c4270d1e2a0fd8e1ace80987c295971d15f9af3.svg","flags/4x3/gi.svg":"flags/4x3/gi-52bfb6cd7cbebf1da96dfc6bf708d3b7239984d36400181ca4ac020081ae41b5.svg","flags/1x1/gi.svg":"flags/1x1/gi-f7ebd8d36a5cb260392a92f10d8bc8d7cf11433fdce9474e08cc52a07dcd5258.svg","flags/4x3/gl.svg":"flags/4x3/gl-e031a722ec76e8262439e50a0dbba62f7b7bea020361f2bf4a9a49d6b59954a5.svg","flags/1x1/gl.svg":"flags/1x1/gl-847b3362e50c1d74aeb01a5ea55cfa2950597cbbfa2377bd7cb70e273d4c57fb.svg","flags/4x3/gm.svg":"flags/4x3/gm-a13d89d1cd66c77706dbaa380370ce3d62c0cf3219c287008759e823fd42a27c.svg","flags/1x1/gm.svg":"flags/1x1/gm-4a4490e2aea203b32862d6e58bd02efc45d07a401684795ecae68ddb97756387.svg","flags/4x3/gn.svg":"flags/4x3/gn-cfa24192de905cc4a07dffb54ea252304bcffd387ce2d6dedae89b654486f286.svg","flags/1x1/gn.svg":"flags/1x1/gn-b50eaffe8a6fd16c9cf2c2d51adea53250b089f04ea701b8d5d812877de6d084.svg","flags/4x3/gp.svg":"flags/4x3/gp-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg","flags/1x1/gp.svg":"flags/1x1/gp-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/gq.svg":"flags/4x3/gq-548afdaa6c448c6bec87c1e2148831c41f9a2f4f83922cf32e5a3904679d889d.svg","flags/1x1/gq.svg":"flags/1x1/gq-28c6e2820b326370a489d4f9efaf258432fdabecb67e610ddd752ed0f0e8a8ce.svg","flags/4x3/gr.svg":"flags/4x3/gr-e2aa8c913feebbed26a8fa0de5ac4aeb51545a4c0dee9bfda4ec5d9673f96386.svg","flags/1x1/gr.svg":"flags/1x1/gr-64dc4363c7c3b827adaa7cd51bb8a0f30bd0a547e86772c473d433b1a6033e2f.svg","flags/4x3/gs.svg":"flags/4x3/gs-83141fac364fa2871379c6b1cb8da9935a185bf9b0e5dafc6b6458fa13359589.svg","flags/1x1/gs.svg":"flags/1x1/gs-31c9e0016c7bd2cfed68cc4e6c2ca73123ce9391e8a50804e5c74101b72e07cc.svg","flags/4x3/gt.svg":"flags/4x3/gt-b4ca8c4ed71131c43ba14f3631a0ee92dababef325bd698ee0bac0da84980c85.svg","flags/1x1/gt.svg":"flags/1x1/gt-a7ce73eaabe1b659b733691076f8455051951432a1fac682f5896f8c4af6ff69.svg","flags/4x3/gu.svg":"flags/4x3/gu-a71a2e02c06f22984e424d15a410d9261ec9ddeeb3df112d5f46b66a09f5bd9a.svg","flags/1x1/gu.svg":"flags/1x1/gu-2156b3d721b79189d40c7f5b5de9e219f83a40b69e0a3855514a097fcdc2f2d2.svg","flags/4x3/gw.svg":"flags/4x3/gw-9eba06bd7c024dbd764b1bc1360120ed8a280d59075f81a50994930534cc42f2.svg","flags/1x1/gw.svg":"flags/1x1/gw-6c4ca99e9871a9cde81966aaf02aac0106e2210f9c64e94bdb5168c7abbbc0e6.svg","flags/4x3/gy.svg":"flags/4x3/gy-b6f25e30b463f760ea01c81ff88a3932bf6812e6b626fd7fbe711a4cbac246c6.svg","flags/1x1/gy.svg":"flags/1x1/gy-d82b2a81ce6cca3e7c5854a5bc1198224b6455eab7adf06d69822a3cf433a1d2.svg","flags/4x3/hk.svg":"flags/4x3/hk-b69c165653e2d112296b963d3369a7d8f656e77432c6c1c5ac1485db077c80a0.svg","flags/1x1/hk.svg":"flags/1x1/hk-09c50dc6f3b0d5bffbc85a2998c5c86da531a939cf48c07ddb644061ab0b2222.svg","flags/4x3/hm.svg":"flags/4x3/hm-faf74b1cde15843a42becf5d05a373f9af8d867d68c824e80d2c41b48c23ea57.svg","flags/1x1/hm.svg":"flags/1x1/hm-6cc1243d9638246c1bac7e52287dcfc6f9b00d142105fcfc9e8b7b3405d4852f.svg","flags/4x3/hn.svg":"flags/4x3/hn-3ad02422915a4ac6a81c3249610cbd42638ebe27d412a2d490bc63e75e1028ea.svg","flags/1x1/hn.svg":"flags/1x1/hn-f0be4d00b892418864d0e4cd3000ee2dc519dbb96d424cb42f55707f8999d44a.svg","flags/4x3/hr.svg":"flags/4x3/hr-6671992f1644503121dce7774bf2f7e2ab65da14124251d80b024d78fb34f6f0.svg","flags/1x1/hr.svg":"flags/1x1/hr-f086b6932d53408f2b57db5e038dc7b508af60a49670e187eed42714f1115b49.svg","flags/4x3/ht.svg":"flags/4x3/ht-0c3452573c61366d1e9d647d61675d2e9a309312e63c649f98d73fe37d2aab4f.svg","flags/1x1/ht.svg":"flags/1x1/ht-80c212d49effab9e944de758c08cc296833bc2a04b3098e8ee58266657522fdc.svg","flags/4x3/hu.svg":"flags/4x3/hu-b48c8253bec6b4e08f8954a2955fdbc2311d254b51358770d3eaec5fe0875965.svg","flags/1x1/hu.svg":"flags/1x1/hu-af59966ca652f5ba1d081af0c1c2343acb479d1a06e03d248bde266cb29aa931.svg","flags/4x3/id.svg":"flags/4x3/id-e02525ae7152d4bd10dcad2ffdf0bf5d08c6c67d3142bc78a7cdbcaf1fcd4a4a.svg","flags/1x1/id.svg":"flags/1x1/id-5b846f6ce4715ea50d4068d9941290229c1be67d619a978096eab2c612e9b297.svg","flags/4x3/ie.svg":"flags/4x3/ie-0e75a4c4027484997f14bd4c2529384ef6c621591908473ccbeda20381c05c93.svg","flags/1x1/ie.svg":"flags/1x1/ie-6446113a9abff1feba085706937ff83d73ba310c78153e8da3ca2d6f0c529510.svg","flags/4x3/il.svg":"flags/4x3/il-98c3c0d9628008ac3a947d8f10fcb01d8e2545dfb265e94e6a29910e1ba57a2d.svg","flags/1x1/il.svg":"flags/1x1/il-0f95bc7892bcf9eb3b6af9bf930e803b5121c45fa7261874ab4d7a8542c20c45.svg","flags/4x3/im.svg":"flags/4x3/im-0c402e364a705500028c46ccbd78a29944e91103b490607b366ae1d4f221ffc0.svg","flags/1x1/im.svg":"flags/1x1/im-718f45e1c60fd42db2a814bfaaa3a9be828f4dd0e4a4aea49e021f066087dece.svg","flags/4x3/in.svg":"flags/4x3/in-a6c958c4b5cb12e2392d81b11dd0fed5fd5d0a66c7decb3ad3c8d27175854d3c.svg","flags/1x1/in.svg":"flags/1x1/in-b4163420567e8e04fa58b79688af8d7bacf32ddf0e2b63ae2f1c5f0aacaaa696.svg","flags/4x3/io.svg":"flags/4x3/io-b951cf1fa71ddae941ee31dd018d2593bb8621ff92508bb311c7362c537a474c.svg","flags/1x1/io.svg":"flags/1x1/io-d9dfc871f0bca35430b17de2e55394b0145334aa2080e07856e21d6d2e007d8d.svg","flags/4x3/iq.svg":"flags/4x3/iq-6a74e49d2c3d0ff072086fba1a2fc8b948ca34891a3aca960f9daacec107bcc6.svg","flags/1x1/iq.svg":"flags/1x1/iq-95f5be79b6ab86e6338abd39ef8499af1517dba8ec3b266ea8e3c954601f0bbb.svg","flags/4x3/ir.svg":"flags/4x3/ir-5f9fdfd2d4cad535338f6de7927cc8094d02eaf06dd5122d3cba9e859c9ec4df.svg","flags/1x1/ir.svg":"flags/1x1/ir-f5367274525b1f050dfae895943620a2e711f63a5726b273b488721a4501465d.svg","flags/4x3/is.svg":"flags/4x3/is-15409efb6cec16b490b4abbbc03db415ef3448cb8cb281dd7cd1b2ba496d534d.svg","flags/1x1/is.svg":"flags/1x1/is-500c3ef83fe917ab9cad59b7e8e6d693d9e78876febc1882c4bb06c8876b7357.svg","flags/4x3/it.svg":"flags/4x3/it-a285a0e341ba9492a2b7478e8a7a13f7c76d3c6a581aafb965ea26e1c554f0f3.svg","flags/1x1/it.svg":"flags/1x1/it-eeb47e346a5f6124b34f8428c97fc7dab2726f8d36d62dec08df3ec7171353cd.svg","flags/4x3/je.svg":"flags/4x3/je-b611f3e0fb7a94f85fa7d5f6f7a7db839381d054eb92abe0856dda8218c40687.svg","flags/1x1/je.svg":"flags/1x1/je-39c0c1482c1c533366153edc873f5eae266fdbf591e2022a7f82c17ce2d676ef.svg","flags/4x3/jm.svg":"flags/4x3/jm-62fcbb8ed5b923b6aafe3990a24ad571485b4ac8db1bd7ed7b200cfadeeb8d7f.svg","flags/1x1/jm.svg":"flags/1x1/jm-b57cb61fb8eb67f0887afb7c779d6033e1c4c10242662093df69496aa58cc464.svg","flags/4x3/jo.svg":"flags/4x3/jo-8e1174e66beeec19016b2754e8bdae987f420fa937ba78efecd61c177d9d40dc.svg","flags/1x1/jo.svg":"flags/1x1/jo-47d2fc18e8af9194bcb249161a10383f89c11a73148b6dc77f4ab47a90294ae1.svg","flags/4x3/jp.svg":"flags/4x3/jp-1785964f1f3a4346ab8e1cbdc211399c5ced34a566c4725f3d23e8105413d6f4.svg","flags/1x1/jp.svg":"flags/1x1/jp-a71cace9d237527635ee960b4df645f202d630c46458cf7e7a7ac09659e4404f.svg","flags/4x3/ke.svg":"flags/4x3/ke-680e981e37f7f0497e148043390987748a5bc78f4c3af09cf58c61d42b2a4a24.svg","flags/1x1/ke.svg":"flags/1x1/ke-60ff7f8bf6b5da9182867b8200475cb0a87f80cc960643ee15c99bcdcf200654.svg","flags/4x3/kg.svg":"flags/4x3/kg-3a93d17f0ed778664ae760032710fd7235bc43090de3543ec50fb8d2dfd9b595.svg","flags/1x1/kg.svg":"flags/1x1/kg-165c50f348fe0d4d8f0bc9cbf2666acde0f3a81dfed3398b8a7db5a51e3348aa.svg","flags/4x3/kh.svg":"flags/4x3/kh-6f3eb3cb44cd8124f4b7cb0d9230ddab4f782ad10746c2e1fa73f54ca2fe4446.svg","flags/1x1/kh.svg":"flags/1x1/kh-9541bd094c9e79e8ebb77a8ba94b22ed079b0502b2d70769b89ac9d19d16781b.svg","flags/4x3/ki.svg":"flags/4x3/ki-a1b39a59ce5be52e1c6ca618ccc97f47d2a7b0d652bc2e5814c30a13d03842b8.svg","flags/1x1/ki.svg":"flags/1x1/ki-e9e5127171d893619b247b605865507b61019dee9e6ea589c5cd0c0e7d513f22.svg","flags/4x3/km.svg":"flags/4x3/km-2ad8132e636de92218e06cad237154128fd1e84dbed82610e138ea148a53c01a.svg","flags/1x1/km.svg":"flags/1x1/km-d9d978cca1790b3165a0d18e159a536b4a2405f12b0200b03cf721042d326089.svg","flags/4x3/kn.svg":"flags/4x3/kn-08b7f26ac06f65c797de647f61bb738a4212cfc9ceb53ef11d8db093b58386d1.svg","flags/1x1/kn.svg":"flags/1x1/kn-e632854084c163a1752b53117eb4f773e57eef231917db846fc8009541cfe4b9.svg","flags/4x3/kp.svg":"flags/4x3/kp-f073e224e1faff5a0bbcb51cd05288d1b13cb607dda42fc7702afe8cfb01d0b3.svg","flags/1x1/kp.svg":"flags/1x1/kp-504fc83119f2a2c34ac75051d3ce15edee6f93555d729d759ef15f5f5caab3d3.svg","flags/4x3/kr.svg":"flags/4x3/kr-dbe4354aefeb100e561ee6f6ea6cc46551c1722d1b75fc164b60b0592d9dc30d.svg","flags/1x1/kr.svg":"flags/1x1/kr-3aefdef6c6b72177aea924981a673bcc58c24b8c98cb00960e23250c07766b63.svg","flags/4x3/kw.svg":"flags/4x3/kw-fc682de5f565e3a918a9cce44a87a0cd8a40b93a555be3dc7c381ced74853021.svg","flags/1x1/kw.svg":"flags/1x1/kw-63c2078d09713c30c0b917fdaac63a1fdb9161ec4b8cf1e91d4a9a8730a5cb65.svg","flags/4x3/ky.svg":"flags/4x3/ky-77da018be33fa8aec69147e6107ff363bfc467ba857e7d47bd383984305cebab.svg","flags/1x1/ky.svg":"flags/1x1/ky-4a6b098e38d727959969a977668aefbdf6b9adcaef4cd922aac232d64a8a9d75.svg","flags/4x3/kz.svg":"flags/4x3/kz-ce3998065f1b6242d0a1755ffb590f15b2ff477b594b26b9a497f7181304bbe3.svg","flags/1x1/kz.svg":"flags/1x1/kz-795fd9bf32b68805f9e80f120db569eacbd5727fc523d7ff89943bdf9ef5b1e9.svg","flags/4x3/la.svg":"flags/4x3/la-dd2ead7123a2c4d2fda71d8a462319d30c6ff8e83c72cfd888230f6a670fdff4.svg","flags/1x1/la.svg":"flags/1x1/la-7ebc9f64aad0049a8167272ce06a7c1512c7d14080ff93a88e6b28e4050f33d3.svg","flags/4x3/lb.svg":"flags/4x3/lb-7afb0e27b8cec77e2c65c3467b68ab24d49879a4739ab4780154a7db4358f6fc.svg","flags/1x1/lb.svg":"flags/1x1/lb-6f50829425260779f08ad80ac9430796e64901b0dd74d010bdf2336f541eb47d.svg","flags/4x3/lc.svg":"flags/4x3/lc-9efcb3c88f9ff13bedcbd0c7f48c7fab604d3842ee559be3a11c6bc64e31a53c.svg","flags/1x1/lc.svg":"flags/1x1/lc-31d72d1034bf031934561da9615fc3db916bb08a210f434a981e053a7edfa339.svg","flags/4x3/li.svg":"flags/4x3/li-9eed98d7d4e07cba0a2aae80e31add4bbe663e959df8cafd607cef17daf4351a.svg","flags/1x1/li.svg":"flags/1x1/li-f655bf461c1690078c846528eb6d3ebe8d594b2539e3cc37f89204a754424c81.svg","flags/4x3/lk.svg":"flags/4x3/lk-3471b0585fb1e0ee350d6fe87e55ef07eef01e99444263b86ff005156dea1b73.svg","flags/1x1/lk.svg":"flags/1x1/lk-d3bb56415e6e2095a470cf4e2ed455c57cde204aa79362786aca785db35ecff8.svg","flags/4x3/lr.svg":"flags/4x3/lr-a39f30a6169c4a3f3ff8e0eb04862e7f941c5d7c8e489ff5e7e4cd8cd436f5e2.svg","flags/1x1/lr.svg":"flags/1x1/lr-731191ad65bf784386cabac12693722d16aeb2e97d6456cc33488f805067aca8.svg","flags/4x3/ls.svg":"flags/4x3/ls-1e4f7ec2600e30b515cd12b509c376c3014d760731d89f87ae9a962fe249b3d4.svg","flags/1x1/ls.svg":"flags/1x1/ls-ba2a8327ab9b0e74f4f411ab989980cde309e86395736a1f77e17a0eefc85266.svg","flags/4x3/lt.svg":"flags/4x3/lt-d6a367644254244a8219c2eaa525b43d261f5da4fb074b0e08cedeb343f737a1.svg","flags/1x1/lt.svg":"flags/1x1/lt-933670ec7627a78f72b60cfe7f49cd09b4afa58fb341857f76a5b7b612c12c97.svg","flags/4x3/lu.svg":"flags/4x3/lu-949c9e81217b58fe622d4d4d00903499b3e2249aa3f688401b78bd3ad977c740.svg","flags/1x1/lu.svg":"flags/1x1/lu-ab39ab3ddef396fcd816d4170f3f73ed89465ed37a180685c68b3833aa3f01a9.svg","flags/4x3/lv.svg":"flags/4x3/lv-b672e3ee7e344abaaf9128111a6543ad7897aa92084b74c42a2877aa1b8cf7a8.svg","flags/1x1/lv.svg":"flags/1x1/lv-55fc46607d153eb1d40d1b478ab6448117b79cdc3d9d973ea2beb44ee4d77316.svg","flags/4x3/ly.svg":"flags/4x3/ly-6f996771734c3f63c65d925a3d991f7d238734cc10e56b3160841fac2939e21a.svg","flags/1x1/ly.svg":"flags/1x1/ly-4e0bf9ff6856dcbba708b4fb176abd44cd385274badbb6e609b596a660109191.svg","flags/4x3/ma.svg":"flags/4x3/ma-70b305040cec175c749a22e6d1e0c1c96bd2164768f208a34d6c8a7ed5caa0ae.svg","flags/1x1/ma.svg":"flags/1x1/ma-919d8fa71ed3a3cadabade682f5326334f11d659245d51b31b40880689cbe275.svg","flags/4x3/mc.svg":"flags/4x3/mc-f0bd30faa57995276026f00e97f6d4ffd3c151e6d2c3d440331ac739965f3bc9.svg","flags/1x1/mc.svg":"flags/1x1/mc-6fcd8ec0404ec1e02e8f38934202004b443c39ffa369be045872c4c89b0674b3.svg","flags/4x3/md.svg":"flags/4x3/md-4bb12bafd1cae33ea4d420dc80301e573d39247323d0eca7c343650a414931ad.svg","flags/1x1/md.svg":"flags/1x1/md-76e3c791e11574492239b07821b43d8f5308e8b7b9ed7d72a5b189f06bb0a81d.svg","flags/4x3/me.svg":"flags/4x3/me-096ce4c309762cde78cb1fec7f1d9ab7c38e6270ddb5aaaf9d29ec63a160e276.svg","flags/1x1/me.svg":"flags/1x1/me-9f8dc8f8e7b38bfc2edd5a35d13818544d304c7834a315ffbfcccecf7a9e6ba6.svg","flags/4x3/mf.svg":"flags/4x3/mf-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg","flags/1x1/mf.svg":"flags/1x1/mf-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/mg.svg":"flags/4x3/mg-f8afb0a551765b27b0c173a623e30af523e907e665858c401e8246b2fa5c2052.svg","flags/1x1/mg.svg":"flags/1x1/mg-d5527653deeb8cd3c7d24082dab7c9dcd8218dd9c9043c832cb1436f1d8090ae.svg","flags/4x3/mh.svg":"flags/4x3/mh-4edc79226b41a72a4f0a8ca6d4f7f8f73e92972ae6b30c96a9dab4274a046165.svg","flags/1x1/mh.svg":"flags/1x1/mh-1bd8a38684a5d55aea8319d106fdc1e62a91424e36a8fb5a27f215cfadb98707.svg","flags/4x3/mk.svg":"flags/4x3/mk-2098f24dab54b22fbc7aff34c15009b4ae7012a6848cede09d6db9ed5caaffec.svg","flags/1x1/mk.svg":"flags/1x1/mk-1b083e708a18b40383921595134b167e0fa84a6f233934668481b902b518f089.svg","flags/4x3/ml.svg":"flags/4x3/ml-5cb117165c5ebebb07725430dce0fbd0bce2ad618967354eda44d9229e16c676.svg","flags/1x1/ml.svg":"flags/1x1/ml-cf94ba5bc9f5b9f3b15c187243a5fc60dd80a43715da7ae005dc13321f0d411b.svg","flags/4x3/mm.svg":"flags/4x3/mm-987d96563a6517ba568b2ad3e8dbcd77c01c0a6114b8497b214cf3e967ce27d1.svg","flags/1x1/mm.svg":"flags/1x1/mm-a78cffaf229320ef1cc28570ec3e91e9e188d8cff8cc01f14423b9c5383e87d2.svg","flags/4x3/mn.svg":"flags/4x3/mn-a3dc85a21b868793f084dd954c31e13c0cf993eef59102a102406c95d99e243d.svg","flags/1x1/mn.svg":"flags/1x1/mn-141a15f289b3e49d8e0c1a21b9015f14ebb9e55660ebc23deefa55a3fa6fc9b5.svg","flags/4x3/mo.svg":"flags/4x3/mo-f58284a9e6021d88f7756d6cbe408f79789a30113084ef6bbd8541e15008d684.svg","flags/1x1/mo.svg":"flags/1x1/mo-b871b2e0087b09318060384476b25c28de16acac946f5ecbb4e162660e6486c1.svg","flags/4x3/mp.svg":"flags/4x3/mp-d9f8b726babd7cba9e128eb81ce7e7d9adb81945f056072aaa3b5540c8299f9d.svg","flags/1x1/mp.svg":"flags/1x1/mp-41d27c2d802f8487a3343a962c11711e9ebf682bda766cceb72ccac2b37dbda0.svg","flags/4x3/mq.svg":"flags/4x3/mq-21e70a8c243dc97f486dadf01f0b3300a8310c719d5a650fe4d7512e7ee8169d.svg","flags/1x1/mq.svg":"flags/1x1/mq-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/mr.svg":"flags/4x3/mr-76898913a879ac1eadb03f5950843ea63fd9a0a998d1b9113c386012cf1c80e6.svg","flags/1x1/mr.svg":"flags/1x1/mr-5288f91d4c12b6fdca7129a8564638991028f730a170bb72be9fee1ac8d8f206.svg","flags/4x3/ms.svg":"flags/4x3/ms-add4964ba7fa5a4440d40902dabd49345476d13ddf6e20e7b06834ab30721b79.svg","flags/1x1/ms.svg":"flags/1x1/ms-47f49520f4ba965587509e45980be0ef29792830738cdae717e52616a11bc00b.svg","flags/4x3/mt.svg":"flags/4x3/mt-55b5c69335d7e2691e50443b34fc5b708309c99326fea6233dd3575c3402043a.svg","flags/1x1/mt.svg":"flags/1x1/mt-bbdc4f8e3dc66dc066d8ad0a264d751090794c53eee6be34f8df84ab389988a0.svg","flags/4x3/mu.svg":"flags/4x3/mu-d0d2fd85209d5ca5b9f90da3947f3142b96ae688536ed796f2bc912aef84c333.svg","flags/1x1/mu.svg":"flags/1x1/mu-3e18fa9a066e02636f5a119d445b4f0439c8b75bae4e2999c17a6105bb95bd5a.svg","flags/4x3/mv.svg":"flags/4x3/mv-595fccd022d985bf319bfee09ded164593e8206c364adc1fa3abbc68450c516a.svg","flags/1x1/mv.svg":"flags/1x1/mv-ba59c37e1fcf099ca68e7fa68fc30d5e75c4171aad18be54126fd214a0b0b6b5.svg","flags/4x3/mw.svg":"flags/4x3/mw-67c2a39590afb916054063262e67293e303a264b9f9219767c13feb988f47212.svg","flags/1x1/mw.svg":"flags/1x1/mw-b82e28e3e51b467c8db86b1dd9cae837204255320928eb5e5f6b8536c7b1b28e.svg","flags/4x3/mx.svg":"flags/4x3/mx-416fe6de02b7d9dfc0e479454d06fa7701631bf848c888365bc56978ea524bc5.svg","flags/1x1/mx.svg":"flags/1x1/mx-b9461685b2714abb039fbd65510729f7ab324940045465b1c74666721d721f7d.svg","flags/4x3/my.svg":"flags/4x3/my-c0f21e9c6679e1ae455392ded0b9e5d8aad5f5ee79589634ac89d88f0c548060.svg","flags/1x1/my.svg":"flags/1x1/my-868a1feec94ccf789db1040a953f25d3982056514195dcd961ff2d6b51b04431.svg","flags/4x3/mz.svg":"flags/4x3/mz-0c06b80f82ab675854d23444740910298f4b8e82b929112dbec4e1927342120f.svg","flags/1x1/mz.svg":"flags/1x1/mz-09a8632f1d20d400401b944af3c4b13e5d64052466bf9a59f6d2927d188150da.svg","flags/4x3/na.svg":"flags/4x3/na-43a5f5934fc004e64eadcfb7675114ed1eab3b7f1e9153886edb0b69e7581ce2.svg","flags/1x1/na.svg":"flags/1x1/na-549c5971f5c2a771c83113a4f9b7a9b5e69546d855e92559b49d6772ff6d3e82.svg","flags/4x3/nc.svg":"flags/4x3/nc-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/nc.svg":"flags/1x1/nc-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/ne.svg":"flags/4x3/ne-3be65335a772b7ba2c8916d0d60f12ed4cc2aebc302151ea23ced9c9a3c38ed4.svg","flags/1x1/ne.svg":"flags/1x1/ne-783c25c63f68afe3c462b326b7faec7cc1493f6a4c140bc62fd524604de09d27.svg","flags/4x3/nf.svg":"flags/4x3/nf-6ff37be9a0581fec55eef9e9871aa0d76d61c44007445184712ec6df3a04208a.svg","flags/1x1/nf.svg":"flags/1x1/nf-2f25b6485f62ce38b25bc9f6428d3e0dc0043d71221eac1f4c3d71bca91c2ea6.svg","flags/4x3/ng.svg":"flags/4x3/ng-22aaf5a93f277f26cbfb21f7b141476fc8853298cf423fe5c849f87c2813d4e1.svg","flags/1x1/ng.svg":"flags/1x1/ng-8753476807ab9e0c201397dbe6a884155d97e8766667d10071650d64fe277fb0.svg","flags/4x3/ni.svg":"flags/4x3/ni-295d07e91f9417b2ca8c7c918481874a7da7f9ac25035edf3a8d1d79b1230e32.svg","flags/1x1/ni.svg":"flags/1x1/ni-6786ef719864e51745934adc319ed0ed95fca75687ee6050d580435ee3f2b236.svg","flags/4x3/nl.svg":"flags/4x3/nl-8f7bff63589346e93733c01f1f18c5a11e8c94911253bcf852f173a933cd928e.svg","flags/1x1/nl.svg":"flags/1x1/nl-f46400354e3d489228eca5944d9e181114fe1f748fa22ac0a70fd06c557bec92.svg","flags/4x3/no.svg":"flags/4x3/no-ecdb24f870c1e6777529ec85e3ea8d989a75b5874ecde94fead0218f7c1b5605.svg","flags/1x1/no.svg":"flags/1x1/no-47a12b11ae8b0aca7f7e3d9084e9d3a6c0ef1ad979d22ba9258e6f9ddc3ab16a.svg","flags/4x3/np.svg":"flags/4x3/np-b32c3bad572c4f27b5eee9c1ca97a5f2ca1c2a5b720b67fd636c91064e5fbdd9.svg","flags/1x1/np.svg":"flags/1x1/np-1279e1d699c05de413b30172b7ed97c13bfaa2069abe788ecf8b127210778354.svg","flags/4x3/nr.svg":"flags/4x3/nr-3818437e2251e1f7310734098d13e2eee69a6b9cc310918d3287b345618e6fef.svg","flags/1x1/nr.svg":"flags/1x1/nr-9b9edbaf4e09989f53511c969520cc2c10f3a693cdb80441b2aeabff30ebb381.svg","flags/4x3/nu.svg":"flags/4x3/nu-3b27eef18754c7fb8def8deadc730f074b090c8b6e9101d008d529c1d8784e5e.svg","flags/1x1/nu.svg":"flags/1x1/nu-9f6f9a41e36004711e3ad2e31e3d0425ca698bf242a62b9665b6f41eeb999ac7.svg","flags/4x3/nz.svg":"flags/4x3/nz-9690c3a7cdea4d5d6b88546ad69244a772fd0649e75f6334695fce89f5c4f076.svg","flags/1x1/nz.svg":"flags/1x1/nz-e848215aaf4f9d5738b886ded97ff13b69c752888a27d1ac430116f7133a1c0e.svg","flags/4x3/om.svg":"flags/4x3/om-7b9135ecdcf42a3bb69c5bf685930d32f9be7c6daaf58d5a8d154e22b6079347.svg","flags/1x1/om.svg":"flags/1x1/om-665da86c6b715f3d5f36bba0e01539e574d7871437b03ecbe29a92e5e703e09a.svg","flags/4x3/pa.svg":"flags/4x3/pa-a5b55e50a411899195a8f2bf8f37bddd94a4436582568c9ddfbddc2c99d1ae2d.svg","flags/1x1/pa.svg":"flags/1x1/pa-6c5566a7ace4125d958ec45ade8ce61e2fc065bb7fdd99cf1d6988a01b6fa73a.svg","flags/4x3/pe.svg":"flags/4x3/pe-12966232fe9a3dcc296389dea282cc8aa400327298d25f2f01c4963d1b900d13.svg","flags/1x1/pe.svg":"flags/1x1/pe-449b3363ff9efe701e1f662ae71c31bb4b5952710b73346e2ae090a90c79488d.svg","flags/4x3/pf.svg":"flags/4x3/pf-db568d96a25e93ea2d51edb9ccb8a0ba15bbe46e1241e1bb4376a856290de4e8.svg","flags/1x1/pf.svg":"flags/1x1/pf-d6aacd56a7243b922bbbd26c94696f19a3dd242df5e5ede999e0319930bf8d64.svg","flags/4x3/pg.svg":"flags/4x3/pg-def242bd4b12703b11ddc016962c0ab5ac2252e6afb53647281af0ddf72b08b2.svg","flags/1x1/pg.svg":"flags/1x1/pg-0f89210b4effa3e2f248e9d22710191ec8a5f8cc00e24e7a493fcf6013af6985.svg","flags/4x3/ph.svg":"flags/4x3/ph-76da2cb2822b71a1e7f182cfe2b8744af8704640feceb476aadf1753611c124c.svg","flags/1x1/ph.svg":"flags/1x1/ph-896fe211ebf65c4aec42a1f115ad43894870bc661eb9f32fd97962f0c6a8b666.svg","flags/4x3/pk.svg":"flags/4x3/pk-d0f9243f586c99692f7d7d18a648095badef0c11bd98645924771c71283f6a51.svg","flags/1x1/pk.svg":"flags/1x1/pk-c32541b10dabe01538a811d9e1b600b91b1724239fe99325bc1156c4183127d9.svg","flags/4x3/pl.svg":"flags/4x3/pl-0fc0d2ef9f5b48e43bd93818263cc504c825346f09a73d22c6f84dcde8d651af.svg","flags/1x1/pl.svg":"flags/1x1/pl-44281da3343d3308aaa29a9e7d060a24b8d5bb949d07197e3771aa30793f5ffe.svg","flags/4x3/pm.svg":"flags/4x3/pm-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/pm.svg":"flags/1x1/pm-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/pn.svg":"flags/4x3/pn-b9639507463a2e238b7d0f4cd976455ad4108594cc526882ed83807c321ca6b8.svg","flags/1x1/pn.svg":"flags/1x1/pn-23189e2aa8792ba5d7bbfba6f21467ec9516f9b366ddddce193a7f26ddc18030.svg","flags/4x3/pr.svg":"flags/4x3/pr-3194786def8e2510554b4d46d2ac49a10bfd1fb26f0d6803864b5982b36c12bb.svg","flags/1x1/pr.svg":"flags/1x1/pr-fb6e6e3064fc00cb41a3752358ba09e006375d6139ed63a13e6b81b4c8c53511.svg","flags/4x3/ps.svg":"flags/4x3/ps-e75b0d2d81c169c45624faf1f51ed1b9bf9b7945d71ceddac505c464f47c639a.svg","flags/1x1/ps.svg":"flags/1x1/ps-5e45e6b195fa5aa5b3c8bdff0824ef3fb354d4f1d5a1a5c4d92a9d67a568db3b.svg","flags/4x3/pt.svg":"flags/4x3/pt-7056421a09bf65c1e96a0891db8b1d37b9ece7b39a7a8ecdfcbc837d0f773cfa.svg","flags/1x1/pt.svg":"flags/1x1/pt-4f2b0e37162ed4d197eb28886933009600109e827ac83664f57f3683adc9617a.svg","flags/4x3/pw.svg":"flags/4x3/pw-8991b8ae2bef2f0e81e79442947f1c68f843be48f652a4c3a2af5dab84d73170.svg","flags/1x1/pw.svg":"flags/1x1/pw-4c45576b7f0be5b37d463d126410bfbca0f9dcdd1539fc6866f9fc116baa3437.svg","flags/4x3/py.svg":"flags/4x3/py-c416c19abcc7629572203f00253c9272876e59a88eafa893fa4a534ed8977776.svg","flags/1x1/py.svg":"flags/1x1/py-adb6cfc575e9626cd8284964929c88830d0d6f7e5b0c135649eceb8bd9de1368.svg","flags/4x3/qa.svg":"flags/4x3/qa-821f667f3f99992cf08b05498cc1a0769dee9c4e36d2a2561d6cf7827255af1b.svg","flags/1x1/qa.svg":"flags/1x1/qa-b05242965c0835a82add68dbcfb4523bc5e53e191803eab2c0c8c8762f2fce80.svg","flags/4x3/re.svg":"flags/4x3/re-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/re.svg":"flags/1x1/re-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/ro.svg":"flags/4x3/ro-63c55736a245e5fa5e0484b4693d43e171941143fcbdb34d3aa8d4cfd6160c9d.svg","flags/1x1/ro.svg":"flags/1x1/ro-f5c83b26832bb94b4320340ada4351a695bff66bb1410f6007c87e8395290380.svg","flags/4x3/rs.svg":"flags/4x3/rs-a1bff9944ac65bce131f42964a45cfce50e334c6d52eeeea65f5f6179f8acf4d.svg","flags/1x1/rs.svg":"flags/1x1/rs-6af7605aa8aee1da6e0a75c750964b21b404011cd00f2df43ae55a827952251a.svg","flags/4x3/ru.svg":"flags/4x3/ru-2ba8996aa53f5eca5d1b0ea1a67d6d469659ac2523d1b394e3d6e25913bbbc15.svg","flags/1x1/ru.svg":"flags/1x1/ru-c8ecec77af983cd6ca10baaf2fa8f3dd67a6fa84f80cabdee10858910fdcc233.svg","flags/4x3/rw.svg":"flags/4x3/rw-0fa2c78359e9603d1cf21e4bb9355414ac3eed3635a25ba8f653d0498d61bd16.svg","flags/1x1/rw.svg":"flags/1x1/rw-61cce3e871326334478d73a379b202fc8548581abc02e39a898bc4fd16b2e0eb.svg","flags/4x3/sa.svg":"flags/4x3/sa-5aec890788f78356a42e38fe6ea2c30c4c82c99a3f05f654faae5918aae804c4.svg","flags/1x1/sa.svg":"flags/1x1/sa-57bf549298c1c3cb533120975d49b6cdb9c839addf278497d133236e666239f4.svg","flags/4x3/sb.svg":"flags/4x3/sb-3433de16f2b3f2a8373de87f879dd3b31ec8369256e23193947318976b51a182.svg","flags/1x1/sb.svg":"flags/1x1/sb-e5352ddacf8edb727ef8f68dbb0951f00ae84b96e9b3b224cdf0c3ee2d33e8db.svg","flags/4x3/sc.svg":"flags/4x3/sc-9c1764a913e0577cadb24d11b883978389a818e94b39f6ac5cf4993dd041d501.svg","flags/1x1/sc.svg":"flags/1x1/sc-c1abe18095ce0b84c2b21aa2453b916e00d8c0fd72fd5161f212e6bcf9c8ccd8.svg","flags/4x3/sd.svg":"flags/4x3/sd-df15037b269e643062988e5273f3cd5a379b18d0ff496bdac97e840deb0793bc.svg","flags/1x1/sd.svg":"flags/1x1/sd-baedc80da37d70ce8fa4d5619d85b4823435180311f0c2995717116e681c20d3.svg","flags/4x3/se.svg":"flags/4x3/se-73964261d5ec45c856c9f7b57f1be90f60c5e748596e494aafa5facd817c7118.svg","flags/1x1/se.svg":"flags/1x1/se-ea6d6caac7db4cfc8d68548f70afbf6ddbf072993e655bdb0b0860f724202e2b.svg","flags/4x3/sg.svg":"flags/4x3/sg-2c8851a3c456051d7510b78da650054ee411ecdb01508ab3aa8ddac220de984a.svg","flags/1x1/sg.svg":"flags/1x1/sg-81517add5de364935b2173fd1ed3db2fefc22e07a072d03fd4f91e8543ffcb22.svg","flags/4x3/sh.svg":"flags/4x3/sh-cdfa61ab262caf8d6b13cc66f1d0e1e935dadb144d93ad28fcd850e9164c33d9.svg","flags/1x1/sh.svg":"flags/1x1/sh-763ae01f8c0189641321a0de1085f0d1ceeb962d94bb989c6255dae4616fd14f.svg","flags/4x3/si.svg":"flags/4x3/si-81f600f18fae95b3e2a6813cc012e94bdfd67965eb7ce1676780bc7d04f4f203.svg","flags/1x1/si.svg":"flags/1x1/si-6481bc748939a46efccac3df22ccc34341cc006d871a7ff521769c562a5325df.svg","flags/4x3/sj.svg":"flags/4x3/sj-8c78bb614796386f416c677e7ee2984c9997d0789306a9861e0d3f85edf62608.svg","flags/1x1/sj.svg":"flags/1x1/sj-15448521086e54b5dc1b51bce3e8424a3282aaa539514a8d63fae537d400bc08.svg","flags/4x3/sk.svg":"flags/4x3/sk-271dd9219a226c5e9768072c3d0512b9ab07d1af59a3a5642eba620e3f53ea2c.svg","flags/1x1/sk.svg":"flags/1x1/sk-4ee51ed995ad80a8f9a335b5f36b00a830da6e7065ecda1e84e427cf19dda736.svg","flags/4x3/sl.svg":"flags/4x3/sl-3fd8765025c44c215906c9d33be69326118f5025b35a93636df059926053c84c.svg","flags/1x1/sl.svg":"flags/1x1/sl-ffbed472a2b3677e9339adfd150ffc76bbae85071cbf1b14f75c67b03fff29d8.svg","flags/4x3/sm.svg":"flags/4x3/sm-72df25d7ba785caa3201dc9ea30349a5bd3891de99e6d818bff2f34914264654.svg","flags/1x1/sm.svg":"flags/1x1/sm-afa36059e43d3014dfc9088d30e86449b8463d282611b99f8d496aca155075c2.svg","flags/4x3/sn.svg":"flags/4x3/sn-3465e8417cd4bd6d948ab2311442757688af8516c6aa7c4f73c48a9447087b8c.svg","flags/1x1/sn.svg":"flags/1x1/sn-dfbe30abf15b2937f1b2de375b832ef3fe11e78f3536df35232b2f7265c00d9e.svg","flags/4x3/so.svg":"flags/4x3/so-16f7af15587913f17fd988f914c55de175ed1d4b2282ba2fa52b414c7359b440.svg","flags/1x1/so.svg":"flags/1x1/so-bbf08e60fbda4e45791d985450f6dbcd9ea779f93c818973271845dd01fc8df6.svg","flags/4x3/sr.svg":"flags/4x3/sr-7718ec6fbe85ea55c72189bf0dc94b10f20a7948ab913903e5b8050af20e4f6f.svg","flags/1x1/sr.svg":"flags/1x1/sr-692dfcca46c35b618f0358ef0cc9b2ee7c27c839f98b12134318804f6498ceee.svg","flags/4x3/ss.svg":"flags/4x3/ss-aebe3fc1b10d93add9906690e262b1baf5338529a832ff954e329c897e014e9c.svg","flags/1x1/ss.svg":"flags/1x1/ss-1d0ebcb31f2c0fe874bd046253de4eec410239c2e0f41eb1cea1f312b51bc8a8.svg","flags/4x3/st.svg":"flags/4x3/st-b24fa19cb51844a3187239e3cbacf828f02e7b8ddf4b01e9ec3366e75966c5d6.svg","flags/1x1/st.svg":"flags/1x1/st-d4d96bc9009e10cec6a00ce0d6fae3746ddefce867f63503595110b2fd539d17.svg","flags/4x3/sv.svg":"flags/4x3/sv-cd0c1acd571abd1756fc4e7eea2369c0466265b1d170a7a3618a66800ddbb4c2.svg","flags/1x1/sv.svg":"flags/1x1/sv-e86857616aaa7fc022b68dafd4a58d4be7ddfcc6d5b2c3d5dad67b457d1e75c9.svg","flags/4x3/sx.svg":"flags/4x3/sx-7ed9e6d8c02b265181248986ccd927f6540a7d55b4ec82b60baef06face66ee1.svg","flags/1x1/sx.svg":"flags/1x1/sx-09ab7415791d37231c9fb79b51fc52583407d7721e6f401cc98fc1ab12d2b62d.svg","flags/4x3/sy.svg":"flags/4x3/sy-49bb1803affb9e4ee070fb6e333a445f6df15ac11db6abe0a62f1aa922fe3c16.svg","flags/1x1/sy.svg":"flags/1x1/sy-b52b5ed6037c8e0e0a3ecd13006b79027d5fac2059fdd54109b591e5c5ada752.svg","flags/4x3/sz.svg":"flags/4x3/sz-a545e703e03ec7f9e108fa348d9e222aba1d7514bad2786f9ca8c6c3063a0e68.svg","flags/1x1/sz.svg":"flags/1x1/sz-784ee11c6629bc411d3e274eea68a3739ddfaa4c3bd18e46e62262518ae0b93e.svg","flags/4x3/tc.svg":"flags/4x3/tc-a20d2d87632b3c19e16a599dd45f3918a5f2db3025867c5f1b279050af68f637.svg","flags/1x1/tc.svg":"flags/1x1/tc-4c7c0e4227d06fb697b8c5ec5f95382b1549342013ea80211f2942f81d472d5a.svg","flags/4x3/td.svg":"flags/4x3/td-1b92327abb7d3ba9b54361f6a38018979e57d5083990af57adac25102146b939.svg","flags/1x1/td.svg":"flags/1x1/td-977813c5dfc3b6b640d1390c04c469cf92e84827ca06ed7f4984a58782a059c5.svg","flags/4x3/tf.svg":"flags/4x3/tf-f45e133cfa8a01239d65e1693492ca1de1949f3660de77d802b41c9a9fc662e8.svg","flags/1x1/tf.svg":"flags/1x1/tf-53581d6af7751cf4c126459a2226fd19cd10040d25e33d1653ece9e57a1a0e2b.svg","flags/4x3/tg.svg":"flags/4x3/tg-de9fe13020d702ce964ff7d712c6b6a3a57c3933f56fbd0c783fe0309f0dbae3.svg","flags/1x1/tg.svg":"flags/1x1/tg-92f575529494b0ba885e47302167a14343c1fd78fef5008ec3aacde7f840fd23.svg","flags/4x3/th.svg":"flags/4x3/th-6211c6caabbc4fdd4ff054cb689406bc9cc7816c01d482a6222e873b0e8fc9b0.svg","flags/1x1/th.svg":"flags/1x1/th-b8a0cf7c820f9010ce12333bfa7f8713358dee291bc955fa7e5333fcf5fc8a07.svg","flags/4x3/tj.svg":"flags/4x3/tj-4bf387aa434be996fc00be6dbb457282e311ff6c7538a484f5cb4d99e45b0747.svg","flags/1x1/tj.svg":"flags/1x1/tj-b371ab0647e7dfba73251169fe1e3180058d6556aa7293b7b573eaf43add617d.svg","flags/4x3/tk.svg":"flags/4x3/tk-cef6e368398b0cbaa4ee0b943d02155c51f9e8ab5ba27b9562ccd629f9a72183.svg","flags/1x1/tk.svg":"flags/1x1/tk-1544aef42090102ba2e154b48f8c059dfddd5789fc5f12aa859939c41673a661.svg","flags/4x3/tl.svg":"flags/4x3/tl-cd74f59871cf5453b4e9454a4820e683c06dc8c9c84dae4c47af9264bed7ab22.svg","flags/1x1/tl.svg":"flags/1x1/tl-a7cd9977244579380914f288bf358ec8b1b0abec6b8dc99e65cc35afe41bc405.svg","flags/4x3/tm.svg":"flags/4x3/tm-3db83810be6239a1c7e594a0b11a4847a7d300cc54e12e4cf4c8a9558520dd67.svg","flags/1x1/tm.svg":"flags/1x1/tm-ade1696d2299d73cc6fa06304144055f9a02c1800846516c4e21baba2a05d4cf.svg","flags/4x3/tn.svg":"flags/4x3/tn-17e7bc4e9dad2da8f12c95c56de46b21890b9d1c725ba400fa7d8df17d59fd4d.svg","flags/1x1/tn.svg":"flags/1x1/tn-55604ef719cd538ba0e2541667d4c52b08f18efe91bb52ad0954802d38ea12f7.svg","flags/4x3/to.svg":"flags/4x3/to-db07012009b9d6ac0c8eca209a68c310d9371771cca8c6c4c2022b3db1ba39d9.svg","flags/1x1/to.svg":"flags/1x1/to-1ed20c5d05424776b5d3cc17487ed8311998cb69db89109a380d59722d4bc2bc.svg","flags/4x3/tr.svg":"flags/4x3/tr-b8b3b6850c4c0ffa840db30c814dce6cb86e00e78138bafe8c2c58d263fb4503.svg","flags/1x1/tr.svg":"flags/1x1/tr-be0c612d78c2662c4e9c0dc836b63c8a7a5cfff48afc533f81c2ba2423542f5e.svg","flags/4x3/tt.svg":"flags/4x3/tt-05d9799b6519267990dccbc997c620c6478e00a96a79841494707cc3d036a381.svg","flags/1x1/tt.svg":"flags/1x1/tt-4ab2fff1efee93f41060975098c5c11e043dc0853456c8c0c70cacd4ba92e8ed.svg","flags/4x3/tv.svg":"flags/4x3/tv-14be4bb5a1fe44a8d3d58bde3dca6c63ed2974554c2008b4a2441a096c9f1fea.svg","flags/1x1/tv.svg":"flags/1x1/tv-71e98b9502d12d655a169e8c89de6d5b2fcc957d67d0b7e93dd2be8ff9e6f2a8.svg","flags/4x3/tw.svg":"flags/4x3/tw-3b699e4e60f9765601c0f84bbf3f16f953f5a454a0cf62487a0eef358f456e66.svg","flags/1x1/tw.svg":"flags/1x1/tw-62cd36c5fc2aff70bbd11312601821ca09729e9e246e32d895e0f4a2017ac0b6.svg","flags/4x3/tz.svg":"flags/4x3/tz-f219bcd0e3536ea3653178e0281620ebfe4c5b3b461c2c79fdf2b2a852de372e.svg","flags/1x1/tz.svg":"flags/1x1/tz-2829d5fc4fcdf2e6a149f63ea6b5a5f1af7b6b08fec523ec217ab5a6d9fb7e77.svg","flags/4x3/ua.svg":"flags/4x3/ua-07199c03990a6b4f285e421d928ab4dba2dfdfdb3e40dd9bfa207c86bc0f3c9d.svg","flags/1x1/ua.svg":"flags/1x1/ua-7c939efc452c13b0f8f489f3dfd37d3eba97c0f577c97f0b6673968af62a3207.svg","flags/4x3/ug.svg":"flags/4x3/ug-48c6cbeae1a865915dd5a06f56bdd576e9ed9ce5085b627ef31f3757c0937a5d.svg","flags/1x1/ug.svg":"flags/1x1/ug-da6257aa7e40121a6e8e574bf201701910bbd838cbc8d76030397c0f34ae906b.svg","flags/4x3/um.svg":"flags/4x3/um-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg","flags/1x1/um.svg":"flags/1x1/um-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg","flags/4x3/us.svg":"flags/4x3/us-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg","flags/1x1/us.svg":"flags/1x1/us-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg","flags/4x3/uy.svg":"flags/4x3/uy-3fc569672f687b4f08581179bea609b616d4b5c7d9524df918134fbcdfce6f9f.svg","flags/1x1/uy.svg":"flags/1x1/uy-90def9dd4890c96d1b6355d0bbcebe2a6f25e2bb3bbdc29c4fbba8a5fc601254.svg","flags/4x3/uz.svg":"flags/4x3/uz-e3f628aff038df64725d75a863bc636ae9da4a16f58850ad86470cc012e3a40f.svg","flags/1x1/uz.svg":"flags/1x1/uz-db8cba32635e9c36565f28fbd6b17e1e5afe26ce0af8560eeda3f9d815ecc749.svg","flags/4x3/va.svg":"flags/4x3/va-c8b81b061cbe7a9b0b5f376e10f1a863b4609c742dbb5663ef923b80d43984a2.svg","flags/1x1/va.svg":"flags/1x1/va-d267dbb1213d75780a8d41a34f9eba098a66973c1c2e7d974257f24b4be9df1c.svg","flags/4x3/vc.svg":"flags/4x3/vc-a578edb2904169d050107b4c02051531e4164120c4ac0ad19faabd41fccdd821.svg","flags/1x1/vc.svg":"flags/1x1/vc-85bbaa2c82ed6a9e077e73501bbf071956c761a897d1c4e1bbe061ad5ca9c0ed.svg","flags/4x3/ve.svg":"flags/4x3/ve-77718854ace7f0a8d8a087e331112e4b20f76e9ca7eeb9af41bacccef09bc9b4.svg","flags/1x1/ve.svg":"flags/1x1/ve-27cf5f75e9b842c417f62e3c3c502acafb67db674d5a1eba8709371c186f0fe9.svg","flags/4x3/vg.svg":"flags/4x3/vg-cefdd08a49ab6cf0ce32bf42cb7a72513dfd0a1619bac86ebedee3a86fa35c80.svg","flags/1x1/vg.svg":"flags/1x1/vg-45357a28f1dc16c13df5cfc44454ff28f082b90a4747898d27575650bc93cb1e.svg","flags/4x3/vi.svg":"flags/4x3/vi-a83bcb200832191afa4091bf2c275289aa37f664027dfce6db6b0f7109fe3b6a.svg","flags/1x1/vi.svg":"flags/1x1/vi-cf017aea4123b31f1cf60087c4742b6d57a4213bece5b3f760e16a84a811a74c.svg","flags/4x3/vn.svg":"flags/4x3/vn-16730ca8238b081b7376fc3829eaac4ddd61a5b423c24c9f07c9a02848c4827f.svg","flags/1x1/vn.svg":"flags/1x1/vn-fa15ba0b7d997046ffb7f2469f1254f7119503f2e95b35467151a947ff9b45d6.svg","flags/4x3/vu.svg":"flags/4x3/vu-4e084d69e403d0af11dfc47f622fb2ba88649b17b2038f6ebf533ce3c9907404.svg","flags/1x1/vu.svg":"flags/1x1/vu-3c93d045c0ec3c08c0e9af785016995cbd7a28ddf08ec9abfce0e39c4e842058.svg","flags/4x3/wf.svg":"flags/4x3/wf-039b39c2ab1d92470427e12e2310b2ad9d8a97a36a064b197858a083f5d7fd23.svg","flags/1x1/wf.svg":"flags/1x1/wf-94672c2e6f10547f0023b9f0fff3adfda4d60f91340f287767f1ce68e5a57a12.svg","flags/4x3/ws.svg":"flags/4x3/ws-f91aa288555a505b3e965c781de8207e2cb6e1d165603c80c54cfb111d277874.svg","flags/1x1/ws.svg":"flags/1x1/ws-e6b2a35c9702941a1fe9d84ab2bf8b28b4931b6fce24efb4ce63d3a8fb8c3b90.svg","flags/4x3/ye.svg":"flags/4x3/ye-f3c80f7f99e1f12a079fe0d96830005657aff1687da92391c0acb882b014ff8c.svg","flags/1x1/ye.svg":"flags/1x1/ye-a9b9b54ec295aed99c5439093242110193626524d336cc3115864e5ec0b787da.svg","flags/4x3/yt.svg":"flags/4x3/yt-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg","flags/1x1/yt.svg":"flags/1x1/yt-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg","flags/4x3/za.svg":"flags/4x3/za-57f1167ce07b3f345798c69ca8f159cb159f5dccb3c101616cc007ef1f2663d6.svg","flags/1x1/za.svg":"flags/1x1/za-79fe7bd792f8b520caaa2c3db12ab5138cf24867d344a38167580ab6243322b1.svg","flags/4x3/zm.svg":"flags/4x3/zm-9a1622c4151a7379ecc32434948be48ba5af564e136232d1eb6e2a4dfec3baa9.svg","flags/1x1/zm.svg":"flags/1x1/zm-7bc0c09a0b3fd9f0dd01481080be99465d71218ac0679fbb077086f24835433e.svg","flags/4x3/zw.svg":"flags/4x3/zw-2576570465c39038f092c242d89e300a0943c50c090c922bc3bd9c8af9161478.svg","flags/1x1/zw.svg":"flags/1x1/zw-4ee873fa4e174f8d150c672917c8f506b530edcca86288e4b7942c7c74a63caf.svg","flags/4x3/eu.svg":"flags/4x3/eu-ca89dc2597154e6887930fd8bdf47636f82dc13c02d9610a3da2d156f09265d0.svg","flags/1x1/eu.svg":"flags/1x1/eu-73d6f1f646500e1dc04ca798c0d192f9174268e3480a8b1d742004919b7463f9.svg","flags/4x3/gb-eng.svg":"flags/4x3/gb-eng-ec744a15618e0a99abee9e53b70985e4cbf2fc2b7051cf239d6dd19b302e4ae9.svg","flags/1x1/gb-eng.svg":"flags/1x1/gb-eng-b1650bba14f5fa14df73f964c3b3dfeca8e1d48c19f1f9b3fded729cc96cf39d.svg","flags/4x3/gb-nir.svg":"flags/4x3/gb-nir-0a09e794313d063a01d817f3ae931054dc9baddd38cfb9a0e4b3c9fa5852bc41.svg","flags/1x1/gb-nir.svg":"flags/1x1/gb-nir-c54214991841f1e32a4aaee502c6a7bde3ec3b43c0e74886d9bc7112f652035a.svg","flags/4x3/gb-sct.svg":"flags/4x3/gb-sct-c78f4e58aa162732c0a401eebe714a632ed03c5171a13bb98eb67365b338a0ab.svg","flags/1x1/gb-sct.svg":"flags/1x1/gb-sct-4983d57dfd37f55b40b22dddfeefef38d2113818914755ee830c61b97549aaf3.svg","flags/4x3/gb-wls.svg":"flags/4x3/gb-wls-963f0b8dfe114a50032ae1db25542a12d2032a30d88bbfd4698e30f50e752e31.svg","flags/1x1/gb-wls.svg":"flags/1x1/gb-wls-7d5a4120e3e0f7618bde0d4270b0c097f18472e6b1a285918d11538fb001cb60.svg","flags/4x3/un.svg":"flags/4x3/un-c75bef804cdbe6617032bfb0332f009c144b1317cb073e71deb5619fbedefcdb.svg","flags/1x1/un.svg":"flags/1x1/un-ccaaa4bfae7e430b8bd72ddfa6fb07f167c1001490fd247a37898f4632803b1e.svg","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","markers-soft.png":"markers-soft-e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739.png","markers-shadow.png":"markers-shadow-8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20.png","markers-soft@2x.png":"markers-soft@2x-c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf.png","markers-shadow@2x.png":"markers-shadow@2x-b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a.png","leaflet/dist/images/layers.png":"leaflet/dist/images/layers-1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6.png","leaflet/dist/images/layers-2x.png":"leaflet/dist/images/layers-2x-066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf.png","leaflet/dist/images/marker-icon.png":"leaflet/dist/images/marker-icon-574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437.png","regions/CA-QC.png":"regions/CA-QC-776d563b6a4ac4312cae9f0bfe630c20711346e8dbddd41040998eba79f4b588.png","modernizr.js":"modernizr-654222debe8018b12f1993ceddff30dc163a7d5008d79869c399d6d167321f97.js","agendadescommuns.png":"agendadescommuns-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png","alert.png":"alert-762ace9479328243a44061346b64c4d6b997e963c68dfc6bddd9e4d241192906.png","baby_gnu_adl.png":"baby_gnu_adl-232caf355c30740d5d9b30491887cd546b8849b33ca9bdb6cc71f8a47ea61815.png","baby_gnu_adl.svg":"baby_gnu_adl-97251005d3225cf1d58b8c497d6b7905dbc9560cc8acd50118fcce60d0a2679e.svg","communs.png":"communs-cd40e342024be0587f8e7a0e3902d32cf67009d349b67c00f687e0499fde9ff6.png","lef-small.png":"lef-small-160cf5b883add60c9c0f4361bd8425c75f6fb23b0e551a0b941fa0491c70e0c9.png","lef.png":"lef-9fcdd7ddd4d40de29c3809b59688c668b85f5628e219d4cd8a8810b72a64533b.png","priorite-logiciel-libre-je-soutiens-april_2_m.png":"priorite-logiciel-libre-je-soutiens-april_2_m-6442e454e96ed45cc1ebc40673a6c50bd286b9c28ea6a8b58572e94f7d6459fc.png","team.png":"team-cb04c7a311f7160c4eb6a281eae68be84f26991dde5d415bb4e205e6726ae275.png","application.js":"application-9b741d81e960c215cca53ea2b4e0bda53cfedf35d173e3075fa3aa0b1ed8ef0a.js","markers-matte.png":"markers-matte-497826545a90e09a240504d14530eba45823b19fd44175e09e27c47cd822ddb9.png","markers-matte@2x.png":"markers-matte@2x-948fc8c4426f04f60964ed20394247f45b0b60e575d02398b9b6810e7a29a823.png","markers-plain.png":"markers-plain-cf233423aa44e75ac0031e77b8ba571cd3331010517e1197e63fb7b06856c1ff.png","leaflet/dist/images/marker-icon-2x.png":"leaflet/dist/images/marker-icon-2x-2d77a2e4c2f08bbac41808324ef946b9a2fe61b6150480d011b72b379c3b238d.png","leaflet/dist/images/marker-shadow.png":"leaflet/dist/images/marker-shadow-264f5c640339f042dd729062cfc04c17f8ea0f29882b538e3848ed8f10edb4da.png","jquery-ui/ui-bg_flat_0_aaaaaa_40x100.png":"jquery-ui/ui-bg_flat_0_aaaaaa_40x100-ae65a7ae22c4c23115948fdeb5c05c9137dbd13ca2d426b3c4c3c4183451e410.png","tinymce/langs/ar.js":"tinymce/langs/ar-e47a394dbc461d20aa547fa0c2027a9dad45fe55e18adb0da309045be6ed4109.js","tinymce/langs/ar_SA.js":"tinymce/langs/ar_SA-24b62c76e99e114ae44480a67edbacf74f9fed0ff7afbeacce4966f1bc80333b.js","tinymce/langs/az.js":"tinymce/langs/az-d40cecd6eb423f910f528ae98dcdaba4c2449802621759437174cf8c8c0d5b25.js","tinymce/langs/be.js":"tinymce/langs/be-42e2884c0f2394afa1a17e31e702660eeea0d84618bbd18155cb0313c6eb5f69.js","tinymce/langs/bg_BG.js":"tinymce/langs/bg_BG-2fac9d785519d2791d42881fcc08c6a82e841575785690259d7f64e1b88d7db3.js","tinymce/langs/bn_BD.js":"tinymce/langs/bn_BD-ef48a9094445dfa624af0c35902f60b7949b30585b5e9bc760a225fe2c07cbd3.js","tinymce/langs/bs.js":"tinymce/langs/bs-eb66c6d6910a30b950d7a0e784027ed288e6e5a2c6db7741da3359f2067e2e0e.js","tinymce/langs/ca.js":"tinymce/langs/ca-77ab49d6420318ed7f5fd51b6856bc396c393095bd78ea91dad83e38e5859637.js","tinymce/langs/cs.js":"tinymce/langs/cs-3d7ecd619895e3e4c7e1db06f6526682ef88f22f6e8b50d7b45ed0ae7c206714.js","tinymce/langs/cs_CZ.js":"tinymce/langs/cs_CZ-4b0778d233e200dea350f8361129da2844e23d1c0f2d524aeffa6d34e581368d.js","tinymce/langs/cy.js":"tinymce/langs/cy-a847ff54657ccf76eec362cc14fbc63adb4c67f9b1de023b29d817aba4fec062.js","tinymce/langs/da.js":"tinymce/langs/da-a87f3ae1c442c3bb26b81569687e98072d038269360361ec9728f00d6b17c282.js","tinymce/langs/de.js":"tinymce/langs/de-a10c8f6f1e53da776e7026dffd54ea8ba527492b767e5b54ae5c3974f6953311.js","tinymce/langs/de_AT.js":"tinymce/langs/de_AT-a32eec12ce12b06fc2c8919d2372242e9596712c96dc9bcfff1fc8b7dc458627.js","tinymce/langs/dv.js":"tinymce/langs/dv-182756bf33409a8b76bc684d0a2ab86881718c360d1f1fb3fbc609ce3f5e3f49.js","tinymce/langs/el.js":"tinymce/langs/el-6bbdbf3ccb2b2f22f961eb6749b43fe401c84fd6d89cd3f76a538dc2d06bb071.js","tinymce/langs/en_CA.js":"tinymce/langs/en_CA-1a9457da814b0a1f15687a00f3ae4b38da0301445b52c29a423a38c943d9a431.js","tinymce/langs/en_GB.js":"tinymce/langs/en_GB-a0f7752ff9ddf3ed3d2cd24fee04fe585bca0babc4ce655560c923ad386c0c07.js","tinymce/langs/eo.js":"tinymce/langs/eo-cbac4d7ebcb0679845b852d9354e74586e78cf13eef82de1400cf6b465e203cd.js","tinymce/langs/es.js":"tinymce/langs/es-133cb5bd627c2a299544586bf365859b5a1c96c57d18c90e7853048434a809b6.js","tinymce/langs/es_MX.js":"tinymce/langs/es_MX-352fcdff567919ff09a2e19c56d8059d339bffdbd999bcc82aa6d8340c19bbb9.js","tinymce/langs/et.js":"tinymce/langs/et-2cfc3da0ff39a37f0bd3c896d49604028f231ff0e7d8ebbc30dbfd4b87125f06.js","tinymce/langs/eu.js":"tinymce/langs/eu-8698ae4de236fcd490d0f45d485dbd33d8e9de6eb3db51191e1b4f8ea96a4d06.js","tinymce/langs/fa.js":"tinymce/langs/fa-7eff96595e93d4b0df484dd90c14b7b412966157ed8293f54429e9418882bdb2.js","tinymce/langs/fa_IR.js":"tinymce/langs/fa_IR-2f9d33f16718ae9c1f3642905b58434ed2662fb66448c4d115b8491aa68e7904.js","tinymce/langs/fi.js":"tinymce/langs/fi-6ca2a93d045067a86e8ea973d0b89368054b15eb9b9625bf1ca871608a5cb77c.js","tinymce/langs/fo.js":"tinymce/langs/fo-340609cecd5571e4eacb8fe7bd1343c8553d96d12610fb77d9a812dc6d3635fd.js","tinymce/langs/fr_CH.js":"tinymce/langs/fr_CH-e0f43c0f20727368ff0767f3bf099bc23eed9fe3e81f8bbe514381e786526928.js","tinymce/langs/fr_FR.js":"tinymce/langs/fr_FR-2702de7be93bd1e0d7120ae3c9e637061565186c66886f155ffca0663df25b4c.js","tinymce/langs/ga.js":"tinymce/langs/ga-d2a3de6f28723d75b03f7f42fd3aedfd045d473425ee38f02350b56035383af1.js","tinymce/langs/gd.js":"tinymce/langs/gd-0453e8b97bf3b6cca4065712ec59f20343ad6131735b38547e865177a1c1c490.js","tinymce/langs/gl.js":"tinymce/langs/gl-1ff612222934f558870111f10934110c5656df3bb293c917e4eeceeb6605fcc5.js","tinymce/langs/he_IL.js":"tinymce/langs/he_IL-981f5250a4b8d404b37040ca5a35c30498cbeeb36e298d81bf1592b43fff7656.js","tinymce/langs/hi_IN.js":"tinymce/langs/hi_IN-695e0cdc22974fe45e0f35289f0249ddab87245165c9df765ec1b885ec55f0be.js","tinymce/langs/hr.js":"tinymce/langs/hr-f77f1da2736d13f9a9a86ebf596f592fcc748f2975a0b9904b512d630f2c1a17.js","tinymce/langs/hu_HU.js":"tinymce/langs/hu_HU-1e22021a4f9c61919aa024041af555eac277bfc08ccb8c07fd329b87090a15e5.js","tinymce/langs/hy.js":"tinymce/langs/hy-0d384f3f82cd76793d3e7428a2140ea97f40a943f25ef99a2e3709a3e02b0930.js","tinymce/langs/id.js":"tinymce/langs/id-e9fd018be745b5f14f4af47887420f98c590c607e01d57aca77ef5affe188523.js","tinymce/langs/is_IS.js":"tinymce/langs/is_IS-c6e8c3e7b0e6b447faec3d8d258928f97c84558b29882c056513fb71cf237bfa.js","tinymce/langs/it.js":"tinymce/langs/it-25b5546d48c80ad666b600e5be3a05718b80645721b191785c1fafe1853f4a46.js","tinymce/langs/ja.js":"tinymce/langs/ja-80f0e7414030c32617ff651da1affa0bc85ee514fc9bc81f46edfd8ce0053ac0.js","tinymce/langs/ka_GE.js":"tinymce/langs/ka_GE-3c6b82346a7070a8b6a15ae6e8faeecc5bfe63ad7e616b7de2e8ab8a75ec39c2.js","tinymce/langs/kab.js":"tinymce/langs/kab-3651d08aacd5bda15a04698f202bf616efbf13d3789aadd9ce4f93e430818c13.js","tinymce/langs/kk.js":"tinymce/langs/kk-0c1ba792ed9445c6512f310228f64d1cde7b5a98e0b212cca749dcb2d728fe86.js","tinymce/langs/km_KH.js":"tinymce/langs/km_KH-8bec84e4078db8c2a680260c073dfb486c85b61df62e14ca330d66d2ca2a85b5.js","tinymce/langs/ko.js":"tinymce/langs/ko-ca535bfa388701fb020d24bdfb3f1e3aab127005b54e943cb1bd60b723c8194d.js","tinymce/langs/ko_KR.js":"tinymce/langs/ko_KR-daa3ae950d70260bb0901a5349034952247905523bbc2bcbe527701b6aad8e28.js","tinymce/langs/ku.js":"tinymce/langs/ku-95e2ffe4f0112df658f10327c26f2cdddedc2e2ed769767366ae22a465c14725.js","tinymce/langs/ku_IQ.js":"tinymce/langs/ku_IQ-a212e8d41695989e56834facf72474e1934ef166c3fcaf7e255ef573a3c6e76c.js","tinymce/langs/lb.js":"tinymce/langs/lb-94992279091f1a0be927d5d858d3724037d8d81ee6b63cc9ddde84af6124cc04.js","tinymce/langs/lt.js":"tinymce/langs/lt-ae7cefbe2cb5420770b31eabf92605728135ab5d6a2d2cfca2d19809be67e6a8.js","tinymce/langs/lv.js":"tinymce/langs/lv-e468ed0c78466d1fff9f4957645606d8aa683cb5dc35931e047df97b8e4f5433.js","tinymce/langs/mk_MK.js":"tinymce/langs/mk_MK-55aadb5d7c82c940cfcf42f24423ef0471294c9b02994a6b22e1b4173baa7ec6.js","tinymce/langs/ml.js":"tinymce/langs/ml-685de0808683c02274dcbe9f8de023a4d72a49b040e7526a99e3d5c786ff71ae.js","tinymce/langs/ml_IN.js":"tinymce/langs/ml_IN-1ab433621d6257c7632718048bacc5ed98a302d33cf0438bbbb4200914e01aac.js","tinymce/langs/mn_MN.js":"tinymce/langs/mn_MN-b89f88cb9b0dd7c879e27532b2979c421c1e69648f65a4108a56060f1e1cb009.js","tinymce/langs/nb_NO.js":"tinymce/langs/nb_NO-602ee249e98a26ae24c1ee1311090c68a782050086a835f1e7bd46ebfe7879ef.js","tinymce/langs/nl.js":"tinymce/langs/nl-9c77e9404a27fd7e4bd162ad44538b72d2725b7fee7be7ca3ff801cf217c4968.js","tinymce/langs/pl.js":"tinymce/langs/pl-5cdd1586ec8fa67293f2175cd92edbd0392c4c77b24ed64cfdceccba8d99f152.js","tinymce/langs/pt_BR.js":"tinymce/langs/pt_BR-e3955318582d58bd241a62c3a81afe74e0ae7f31bdc92a562b75243701f114df.js","tinymce/langs/pt_PT.js":"tinymce/langs/pt_PT-1101d080ecd5da091c7ef70b23200adbd5136c5c32f0c79dae665a443d76c35d.js","tinymce/langs/ro.js":"tinymce/langs/ro-484799d182031efab087d749b024014fd06ed06c1e7712b8bf87f3a4a965c2e4.js","tinymce/langs/ru.js":"tinymce/langs/ru-bdd59cb662a7b4d61e770b07014d1791051312c87513ecc1891e80beba617171.js","tinymce/langs/ru_RU.js":"tinymce/langs/ru_RU-9f18ef14f3493cc586cc0b4827fd9e1c2ed3d5790ce536d94f87e2d6aac2a688.js","tinymce/langs/si_LK.js":"tinymce/langs/si_LK-5bfefe9b2fe82574d8ed839df18fd8ff65f1e1cd458b0a843cf1aadd1be704ea.js","tinymce/langs/sk.js":"tinymce/langs/sk-412fa7f982ad2733341203daa035c8ba10035262ca8f5f65e0a41507512209bd.js","tinymce/langs/sl_SI.js":"tinymce/langs/sl_SI-2bea4f3854a992ea840808019dc99467dc173b12454ea6016135234a741671d8.js","tinymce/langs/sr.js":"tinymce/langs/sr-e0b97453a0c1000b19f7ce37fcf86bcacbf9125d81076f60a77686820c7925c6.js","tinymce/langs/sv_SE.js":"tinymce/langs/sv_SE-fa561a7e49fdb42d5913337176fed6bc8a9997eb3ca8f20ecd9520d5391e17be.js","tinymce/langs/ta.js":"tinymce/langs/ta-0fd0e62250fc1a3626ac2111c5adb4194a6a898888bb224414f6dc8adf53d385.js","tinymce/langs/ta_IN.js":"tinymce/langs/ta_IN-32303f65d2378e8202b17b0920b79277a2580872e3a6bd9409aeceef90867dd0.js","tinymce/langs/tg.js":"tinymce/langs/tg-1618248bf0aeda614a37ced9fd28b6623ae24f8453368bfb8c483ce820a3cb34.js","tinymce/langs/th_TH.js":"tinymce/langs/th_TH-5279a379afc886c2a31e22aba9d7ee7a8e3edf4c0785f39aaa20ccd03d46b19a.js","tinymce/langs/tr.js":"tinymce/langs/tr-3765d4a8923ef22864747d9c825c3e0af401e1356e75a5458bed837d486b7673.js","tinymce/langs/tr_TR.js":"tinymce/langs/tr_TR-5c93f80b89e5dd2eb6972f37bf50b76d7705c61f28120b836704a91fa5c14399.js","tinymce/langs/tt.js":"tinymce/langs/tt-22e302672df0a77de14688f58dbedf82de7a26e9089c9535a2a3cd1c0ccd7903.js","tinymce/langs/ug.js":"tinymce/langs/ug-50232038bf7262c90be4f2919c74ff93792cdb82e6064d0f5c86f885b93271c5.js","tinymce/langs/uk.js":"tinymce/langs/uk-f6d7911714c422b178c0249df323cf7ec415a83195d751c7e4024590b1738c42.js","tinymce/langs/uk_UA.js":"tinymce/langs/uk_UA-bd8cd7ca66228d85f8a4cadb651c49981f26e007fa2a952856c8c3d3c1baa66a.js","tinymce/langs/vi.js":"tinymce/langs/vi-6aa451047e4df911c92e10178e6a70147534e438c64df7a88eee37b4a440726e.js","tinymce/langs/vi_VN.js":"tinymce/langs/vi_VN-aea52c2e9397f8a657d54d50a42b3c5be0ca79480555a4fa1e0f5d785c5f6561.js","tinymce/langs/zh_CN.js":"tinymce/langs/zh_CN-8622ec46e2980b6f5baf3b745c6b0187dd2a54ddecbbf69a21f0b3e72f84f6dc.js","tinymce/langs/zh_TW.js":"tinymce/langs/zh_TW-90723da3b889f2a4477d4aaf00ca3e75439998269b36b359ea4caa37e1defb4a.js","tinymce/preinit.js":"tinymce/preinit-84328a53e798df12f891eb49871773fd9f925439c8630e9e22423a82ef9e6f89.js","tinymce/tinymce.js":"tinymce/tinymce-cccbb9fb34a9d8d8634a3a9ae0080ca394081f2b98cd81c4c378c5a1d73fba21.js","tinymce/jquery.tinymce.js":"tinymce/jquery.tinymce-c9ec5ed0b9118216bc9aa1ad4a251afff33d2c60e62057737b026003ab34efb3.js","tinymce/langs/readme.md":"tinymce/langs/readme-5a8b6a04d57b5c88e3fb7f2a870b8e2d3a48ec03ce6474206c41df78c155b2de.md","tinymce/license.txt":"tinymce/license-47a9dcd2574891a5a465112fd9dfcebcc7e61844edec27fa936a64642008fe66.txt","tinymce/plugins/advlist/plugin.js":"tinymce/plugins/advlist/plugin-1470ecd481c44e215caf021f095382fb9960da96dc0986228f269dbba0067d4a.js","tinymce/plugins/anchor/plugin.js":"tinymce/plugins/anchor/plugin-c0c08d516edff61b4216b240af7f77487a035272794d0aef1c924a67129ac067.js","tinymce/plugins/autolink/plugin.js":"tinymce/plugins/autolink/plugin-a13df878211dfb03dda14031db66bbc8021b6b55e1da4447a96ee50ea0ba86e0.js","tinymce/plugins/autoresize/plugin.js":"tinymce/plugins/autoresize/plugin-4cb04cc171a4e3f3b3b69770c74c53ec2ac0a743c303c2f5072b7f7c0d71c187.js","tinymce/plugins/autosave/plugin.js":"tinymce/plugins/autosave/plugin-b471db0ebd9f584c62a614a85fa16ae06cadce14af85ee5b2e39b84d0c9ec05c.js","tinymce/plugins/bbcode/plugin.js":"tinymce/plugins/bbcode/plugin-b624047c40c5435b935c2591fbf0eb851ae7794d9350b611b10bb6b23aa4bd9c.js","tinymce/plugins/charmap/plugin.js":"tinymce/plugins/charmap/plugin-8f5abea75aec0a80dd6328f29da433574c8a9b025fea0a3b2cb8127605dda330.js","tinymce/plugins/code/plugin.js":"tinymce/plugins/code/plugin-41ed678cf1339c20afc948e499212d06bd502c3d4a94da1d37ad427ec525f123.js","tinymce/plugins/codesample/css/prism.css":"tinymce/plugins/codesample/css/prism-1988b66704b4d23e78c6c20c38a6856cbc1f0be96d6d60a3a0b12f4408f1057e.css","tinymce/plugins/codesample/plugin.js":"tinymce/plugins/codesample/plugin-a59fe13189ec82797e929ebf320e294669e73fc040d5a4505e3ab01f6b96daaa.js","tinymce/plugins/colorpicker/plugin.js":"tinymce/plugins/colorpicker/plugin-e48f5ad978732e6129285d3aa00dfaf5d7b670dc189629835ad888438963bc3d.js","tinymce/plugins/contextmenu/plugin.js":"tinymce/plugins/contextmenu/plugin-d9e7ddcde9ffdbdb2eec811e817b822662234b90d6046fba0ed5a77c5cc0c3d7.js","tinymce/plugins/directionality/plugin.js":"tinymce/plugins/directionality/plugin-d2e6f8a1c65b0c9e6484d356263e8afc3dc7d3c4c9bbf2bb2155599063f427e5.js","tinymce/plugins/emoticons/img/smiley-cool.gif":"tinymce/plugins/emoticons/img/smiley-cool-bb0e93a050a32df7913e4026b3c88a176998e0e3e073ba06e9b73f6c24227c9c.gif","tinymce/plugins/emoticons/img/smiley-cry.gif":"tinymce/plugins/emoticons/img/smiley-cry-a0c5f3e7a682449c973c9d9f7c46342081c46920686d2353f57aff91ab907f68.gif","tinymce/plugins/emoticons/img/smiley-embarassed.gif":"tinymce/plugins/emoticons/img/smiley-embarassed-d3cafcb50b335672cb5e9f4600ea9ea261dac7828dd28844d4927c393a25618f.gif","tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif":"tinymce/plugins/emoticons/img/smiley-foot-in-mouth-03fe04d3ed533423ac81f05146584b0c451be3d4a30e76687ceef283ed07071f.gif","tinymce/plugins/emoticons/img/smiley-frown.gif":"tinymce/plugins/emoticons/img/smiley-frown-1b984bf98931dd1debb54461eb9d83e985f2b2999fe14bcb556d6c0921bc83b0.gif","tinymce/plugins/emoticons/img/smiley-innocent.gif":"tinymce/plugins/emoticons/img/smiley-innocent-8db353ef102196f2c6ddf5c4666446de955d7b14fc0957c806c9dbfb48fb0c29.gif","tinymce/plugins/emoticons/img/smiley-kiss.gif":"tinymce/plugins/emoticons/img/smiley-kiss-3154c3665356c13ab10fefdbac1fe187fff978a0052037c99cdc4a97103413f2.gif","tinymce/plugins/emoticons/img/smiley-laughing.gif":"tinymce/plugins/emoticons/img/smiley-laughing-8f6adedcd091975ffead171867a6304d908bb6541a6ccb4919286ec6b7d4551e.gif","tinymce/plugins/emoticons/img/smiley-money-mouth.gif":"tinymce/plugins/emoticons/img/smiley-money-mouth-f0b9f4f22e237f5dbc851f900fed8d7eca4c954ae6fbc606c0cd8be431d0ac80.gif","tinymce/plugins/emoticons/img/smiley-sealed.gif":"tinymce/plugins/emoticons/img/smiley-sealed-9933b442636b6e537df7b564e2c3f7a2873526eea6b022a98eb1e468e5204c32.gif","tinymce/plugins/emoticons/img/smiley-smile.gif":"tinymce/plugins/emoticons/img/smiley-smile-fd89cd460ffcacb7e725e00c0275ef5b3924ce468248e5ff4fb43545571cfa65.gif","tinymce/plugins/emoticons/img/smiley-surprised.gif":"tinymce/plugins/emoticons/img/smiley-surprised-3871f356cb41976d7ae8a5f005e8739e4d014352a8adef9b33f773d81b6e6c01.gif","tinymce/plugins/emoticons/img/smiley-tongue-out.gif":"tinymce/plugins/emoticons/img/smiley-tongue-out-5843c85667a8226dc43be83749fd9fbbc5d20b1577de2b763915d99815d37d47.gif","tinymce/plugins/emoticons/img/smiley-undecided.gif":"tinymce/plugins/emoticons/img/smiley-undecided-d8b9bcbb433951ff3c4ca8dd959ac3844239b98e6d52218833e1485a91f67347.gif","tinymce/plugins/emoticons/img/smiley-wink.gif":"tinymce/plugins/emoticons/img/smiley-wink-2af75ad7b1c08488505513503e34b15f40005e04a2a9568f698f0945d2d8ba1f.gif","tinymce/plugins/emoticons/img/smiley-yell.gif":"tinymce/plugins/emoticons/img/smiley-yell-bba903fbcb46fce8c68b9e01863fd095b3b1d0e6aa72161f3a88d762a5f90a79.gif","tinymce/plugins/emoticons/plugin.js":"tinymce/plugins/emoticons/plugin-d57266d91f221127649a29316e2a6b33a89281d5e546b0688cf177d56144b62d.js","tinymce/plugins/fullpage/plugin.js":"tinymce/plugins/fullpage/plugin-04d845d28977b02b9669d861dc21188ca666de825803eef4e57c040d40249562.js","tinymce/plugins/fullscreen/plugin.js":"tinymce/plugins/fullscreen/plugin-f8bbdd50ed0196693f9d98d1e478cc4d18a65270cc1517eca5a03d6eeefd369a.js","tinymce/plugins/help/img/logo.png":"tinymce/plugins/help/img/logo-95b06f8538b11c4c30170075a09f93cf5871f74dd2541e95ad3d9da31976fcac.png","tinymce/plugins/help/plugin.js":"tinymce/plugins/help/plugin-18f46f77691cc2f94b36c711b01da5f867cfe14faf2fb84c9e8886782ce3de52.js","tinymce/plugins/hr/plugin.js":"tinymce/plugins/hr/plugin-9664dcccc57ea070459d3ba1aba0916f22c941d7a601f9d4cc91b9d29365b15a.js","tinymce/plugins/image/plugin.js":"tinymce/plugins/image/plugin-1f27e4ea86eb5aa38162dd5ba9dc2c4dd1ee8bd5d11f5583420979cf05d16f86.js","tinymce/plugins/imagetools/plugin.js":"tinymce/plugins/imagetools/plugin-c4dab69e83c305806965c9b31f0ea987b2e2a82a7cb893376775e06cf233a59c.js","tinymce/plugins/importcss/plugin.js":"tinymce/plugins/importcss/plugin-cbf47759816f889168075dc99299a2c0913572f8edcc2e1ef4b994b9b61cae30.js","tinymce/plugins/insertdatetime/plugin.js":"tinymce/plugins/insertdatetime/plugin-75e743483171dc0dc5b35e040cd1ff5d6ef7d4e2d609dc1ce68589420ccc07c2.js","tinymce/plugins/legacyoutput/plugin.js":"tinymce/plugins/legacyoutput/plugin-46d0010c4bcbf3c9f0a737f16a659768461a617884441096dae0102a2654a089.js","tinymce/plugins/link/plugin.js":"tinymce/plugins/link/plugin-bc112313d4019d56fc62bf3d7feac911b1eb5e8b1272256e8e926380f098599e.js","tinymce/plugins/lists/plugin.js":"tinymce/plugins/lists/plugin-52d9f2d934ac50304bdd9159bd3982ca5b39afdc23aaae86d1ac47ccf559c025.js","tinymce/plugins/media/plugin.js":"tinymce/plugins/media/plugin-49171347d2bc7f405eacee0b753912075a966708924af29ca75007f0c0b532a2.js","tinymce/plugins/nonbreaking/plugin.js":"tinymce/plugins/nonbreaking/plugin-a63cb86503260a85efe7db0b1521c0d0a80cd27f46706713230938e0c44bd670.js","tinymce/plugins/noneditable/plugin.js":"tinymce/plugins/noneditable/plugin-e74020a6f58e8c258309f4536aeea2a896a795cb13d69696c388e4246c54578b.js","tinymce/plugins/pagebreak/plugin.js":"tinymce/plugins/pagebreak/plugin-839ecfcf70f7d0365c2d1e3ef3a55595069b938c19aeede714bc31b61a67026b.js","tinymce/plugins/paste/plugin.js":"tinymce/plugins/paste/plugin-931ce6f77c1daecc9e5c613b90cad50d5789099add967b7b13774defbd192b0f.js","tinymce/plugins/preview/plugin.js":"tinymce/plugins/preview/plugin-41472eb0321860529e83e84e54a86f32c5c0858a16c8e7738b838e31266447bc.js","tinymce/plugins/print/plugin.js":"tinymce/plugins/print/plugin-a7cd4beef6dde992d25d4d6720a5a2d9d15afca45e037d123a41a82ef431c78f.js","tinymce/plugins/save/plugin.js":"tinymce/plugins/save/plugin-e48e177a9505d7a21fb22a62d400fb95c30aa3f9de119f5531eb360f7c52fe7b.js","tinymce/plugins/searchreplace/plugin.js":"tinymce/plugins/searchreplace/plugin-43e62c6dc566523c4e4bf782d73819568072db159cefa29adddf5f8aa9c2d06b.js","tinymce/plugins/spellchecker/plugin.js":"tinymce/plugins/spellchecker/plugin-611b439b3cce8c78a716a66500a38fc7be57b09d9cd4bf3f3d72de0fe3a9a4dd.js","tinymce/plugins/tabfocus/plugin.js":"tinymce/plugins/tabfocus/plugin-419ef25b5f1aab6043e496e4f6132d3b0505ffa5398e3b66f7e8a8280268077d.js","tinymce/plugins/table/plugin.js":"tinymce/plugins/table/plugin-0d4057859445665d58e85d861f2bbf5f983dfa6014b99b6cca0a6561309deb94.js","tinymce/plugins/template/plugin.js":"tinymce/plugins/template/plugin-0ea66983b1cfb34cd2ea8e73ec305c1156174ef0e932132bee2dfa4b99cbb4f5.js","tinymce/plugins/textcolor/plugin.js":"tinymce/plugins/textcolor/plugin-c8cecbcd75555cc03593b9dedaf2b6ffb78dffc92974d2d1bf7f65b94ab61d30.js","tinymce/plugins/textpattern/plugin.js":"tinymce/plugins/textpattern/plugin-411ee2dc5fa1d8386fc59eae170f80369ed6d2d2990d609dbcfc656262c6620b.js","tinymce/plugins/toc/plugin.js":"tinymce/plugins/toc/plugin-b7f229f800cabbbaea4e36a56981011cbddff446bd383ecbb28ddbd4b9cc55bd.js","tinymce/plugins/visualblocks/css/visualblocks.css":"tinymce/plugins/visualblocks/css/visualblocks-859e261c1d940c90994673ce593b60946710cc4f71371164db4ea695035ea593.css","tinymce/plugins/visualblocks/plugin.js":"tinymce/plugins/visualblocks/plugin-58fa11272d279775e4b12858c1d2acc2e1b5feebe84b3db3ee7df855665d12e4.js","tinymce/plugins/visualchars/plugin.js":"tinymce/plugins/visualchars/plugin-9963828126c769478acfc74773441472c043518d458c4777c0e766d3298dbcaf.js","tinymce/plugins/wordcount/plugin.js":"tinymce/plugins/wordcount/plugin-049da43cf52b32d85ec1ea85bb6ea65ef08e31ff3a26ceac93885974094db7f1.js","tinymce/skins/lightgray/content.inline.min.css":"tinymce/skins/lightgray/content.inline.min-58c28f0e832b8f0622b03e4d5faaada2cb2c481a1ec171de02de97fe84555b19.css","tinymce/skins/lightgray/content.min.css":"tinymce/skins/lightgray/content.min-9aaa337dc1206c756b48c9ea0444faac9402206186069dc7423e912a71460055.css","tinymce/skins/lightgray/fonts/tinymce-small.eot":"tinymce/skins/lightgray/fonts/tinymce-small-a10fc4343d95b716c16d77463d475be5c079599ea67e1cd2bd3a94d5e7f508f9.eot","tinymce/skins/lightgray/fonts/tinymce-small.svg":"tinymce/skins/lightgray/fonts/tinymce-small-e7773001446ab937e1d8d4bd5e8dbd9b31d112037353a14b319e36dd010ed8ee.svg","tinymce/skins/lightgray/fonts/tinymce-small.ttf":"tinymce/skins/lightgray/fonts/tinymce-small-2f657502906d6f5c3fc8df3a82969114ebe030addfdc061c60c974b0f515fd09.ttf","tinymce/skins/lightgray/fonts/tinymce-small.woff":"tinymce/skins/lightgray/fonts/tinymce-small-d3efbb678ca6de5632902bd93772746ba2f8e4e2322b953936e12694a183aa31.woff","tinymce/skins/lightgray/fonts/tinymce.eot":"tinymce/skins/lightgray/fonts/tinymce-2e9c4a68fde992476e0db9e44128cb1f2e898f0de0b80f552a8acb52bb7ca0db.eot","tinymce/skins/lightgray/fonts/tinymce.svg":"tinymce/skins/lightgray/fonts/tinymce-2094ddadc265c7f33570475fc78ef7adcdcb814e49060d17f5b4c4f8d1cb7ec6.svg","tinymce/skins/lightgray/fonts/tinymce.ttf":"tinymce/skins/lightgray/fonts/tinymce-477ea2d46c1a975dd492af4c10235fabfd09069595779cce00ea0381ca9b4a20.ttf","tinymce/skins/lightgray/fonts/tinymce.woff":"tinymce/skins/lightgray/fonts/tinymce-1ebc636bb24cbea637946ba8c22cbf4f35d8343ba9763045d2aee59e3714ae78.woff","tinymce/skins/lightgray/img/anchor.gif":"tinymce/skins/lightgray/img/anchor-2861666fd107d278d4449970615136d06d7f746be9bb19072cf9c8f30e565e1e.gif","tinymce/skins/lightgray/img/loader.gif":"tinymce/skins/lightgray/img/loader-eb7cfd3d959b2e09c170f532e29f8b825f9bc770b2279fde58e595617753e244.gif","tinymce/skins/lightgray/img/object.gif":"tinymce/skins/lightgray/img/object-e6a15e52bc4a17b085073ba8debd4708ead6ae3d4cbeb3880c65cb7afc489777.gif","tinymce/skins/lightgray/img/trans.gif":"tinymce/skins/lightgray/img/trans-9cf020d7c3bba7f5ab10cda54aabef934f906d4f9a3acf99e9e7dc6c98579635.gif","tinymce/skins/lightgray/skin.min.css":"tinymce/skins/lightgray/skin.min-0ba2274577ef3fe1e07c73ada6e6e6fb6e6db9dc0e2aeba6053e7395c66215e8.css","tinymce/themes/inlite/theme.js":"tinymce/themes/inlite/theme-16e3ffb72e6e35097ba84668d5abd271f62120ba315d95d852f9210621952e54.js","tinymce/themes/modern/theme.js":"tinymce/themes/modern/theme-c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c.js","tinymce/rails.js":"tinymce/rails-bf7fd5c952f25481010758dde6a2681498074f9509230f601b317356a6a54fca.js","tinymce/skins/lightgray/content.mobile.min.css":"tinymce/skins/lightgray/content.mobile.min-230c31f65356c7cb1799244a34f7a722c92a6d614e06e59d48db0ebccd7f2346.css","tinymce/skins/lightgray/fonts/tinymce-mobile.woff":"tinymce/skins/lightgray/fonts/tinymce-mobile-e64bf156a432d63f5b34b4567b513dc0d351b49161c7f608fb82574bfdd9d213.woff","tinymce/skins/lightgray/skin.mobile.min.css":"tinymce/skins/lightgray/skin.mobile.min-fe907c53c1657dd3f3c3cc22926b2f6a342a345d2b2f1a7953e3fdceb2841d4c.css","tinymce/themes/mobile/theme.js":"tinymce/themes/mobile/theme-c3d08a70821c5f901e5b53dbf05548b0c7dc5424c8c42a260b3e5b496fbdb65c.js"}}
\ No newline at end of file
diff --git a/public/assets/application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css b/public/assets/application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css
new file mode 100644
index 00000000..522a854c
--- /dev/null
+++ b/public/assets/application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css
@@ -0,0 +1,202 @@
+/*!
+ * jQuery UI CSS Framework 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/theming/
+ *
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/
+ */.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #c5c5c5}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#2b2b2b;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px #5e9ed6}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#003eff;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-checked{border:1px solid #dad55e;background:#fffa90}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(/assets/jquery-ui/ui-icons_444444_256x240-31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d.png)}.ui-widget-header .ui-icon{background-image:url(/assets/jquery-ui/ui-icons_444444_256x240-31d988765b4e6f56553c29588c500381dc3e6f0aa2980c8212202e5644aefd5d.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url(/assets/jquery-ui/ui-icons_555555_256x240-32175261daee76c82bb0edf0eea16a56421866fbc31e94f3c1d570aa114502f5.png)}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url(/assets/jquery-ui/ui-icons_ffffff_256x240-350df1b7131037de20e83c5c0f3a41a770d2ac48b5762ea772b3f4a8a7b9d47a.png)}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url(/assets/jquery-ui/ui-icons_777620_256x240-0b020fc6e696d88d296e7bb1f61f1eb2ad827848e2c7382a4c3e0999e702dd9b.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(/assets/jquery-ui/ui-icons_cc0000_256x240-40985a64b4d5dd213fba27fcd862a1bd1b337a97674f6ff0b9ec20abcee4bc69.png)}.ui-button .ui-icon{background-image:url(/assets/jquery-ui/ui-icons_777777_256x240-faf32007ae120c302213557626e660dd10e711c5dd4f1113d35f26dc05b78d2f.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:0.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{-webkit-box-shadow:0 0 5px #666;box-shadow:0 0 5px #666}/*!
+ * jQuery UI CSS Framework 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/theming/
+ */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default !important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}/*!
+ * jQuery UI Accordion 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/accordion/#theming
+ */.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}/*!
+ * jQuery UI Autocomplete 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/autocomplete/#theming
+ */.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}/*!
+ * jQuery UI Button 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/button/#theming
+ */.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}/*!
+ * jQuery UI Checkboxradio 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/checkboxradio/#theming
+ */.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}/*!
+ * jQuery UI Controlgroup 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/controlgroup/#theming
+ */.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup>.ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup>.ui-controlgroup-item:focus,.ui-controlgroup>.ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical>.ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label+.ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label+.ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}/*!
+ * jQuery UI Datepicker 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/datepicker/#theming
+ */.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}/*!
+ * jQuery UI Dialog 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/dialog/#theming
+ */.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}/*!
+ * jQuery UI Draggable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */.ui-draggable-handle{-ms-touch-action:none;touch-action:none}/*!
+ * jQuery UI Menu 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/menu/#theming
+ */.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}/*!
+ * jQuery UI Progressbar 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/progressbar/#theming
+ */.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}/*!
+ * jQuery UI Resizable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}/*!
+ * jQuery UI Selectable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}/*!
+ * jQuery UI Selectmenu 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/selectmenu/#theming
+ */.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}/*!
+ * jQuery UI Sortable 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */.ui-sortable-handle{-ms-touch-action:none;touch-action:none}/*!
+ * jQuery UI Slider 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/slider/#theming
+ */.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}/*!
+ * jQuery UI Spinner 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/spinner/#theming
+ */.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}/*!
+ * jQuery UI Tabs 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/tabs/#theming
+ */.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}/*!
+ * jQuery UI Tooltip 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/tooltip/#theming
+ */.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}/*!
+ * jQuery UI CSS Framework 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/theming/
+ *//*!
+ * jQuery UI CSS Framework 1.12.1
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/theming/
+ */div.tagsinput{border:1px solid #CCC;background:#FFF;padding:5px;width:300px;height:100px;overflow-y:auto}div.tagsinput span.tag{border:1px solid #a5d24a;-moz-border-radius:2px;-webkit-border-radius:2px;display:block;float:left;padding:5px;text-decoration:none;background:#cde69c;color:#638421;margin-right:5px;margin-bottom:5px;font-family:helvetica;font-size:13px}div.tagsinput span.tag a{font-weight:bold;color:#82ad2b;text-decoration:none;font-size:11px}div.tagsinput input{width:80px;margin:0px;font-family:helvetica;font-size:13px;border:1px solid transparent;padding:5px;background:transparent;color:#000;outline:0px;margin-right:5px;margin-bottom:5px}div.tagsinput div{display:block;float:left}.tags_clear{clear:both;width:100%;height:0px}.not_valid{background:#FBD8DB !important;color:#90111A !important}.flag-icon-background,.flag-icon{background-size:contain;background-position:50%;background-repeat:no-repeat}.flag-icon{position:relative;display:inline-block;width:1.3333333333em;line-height:1em}.flag-icon:before{content:'\00a0'}.flag-icon.flag-icon-squared{width:1em}.flag-icon-ad{background-image:url(/assets/flags/4x3/ad-3fc30cc000942b4f3369bdf6ccb85b16f59f4e78f9c53d73252ab529da35ba0a.svg)}.flag-icon-ad.flag-icon-squared{background-image:url(/assets/flags/1x1/ad-db2c38d603b8eecc9085d6ac1261bbefd3bcd852d44bec476e5e115914bcb2fd.svg)}.flag-icon-ae{background-image:url(/assets/flags/4x3/ae-7f41692ef179841ca6e9cae42c704113274707228ff3d2b1ee5169916db15b1e.svg)}.flag-icon-ae.flag-icon-squared{background-image:url(/assets/flags/1x1/ae-8c9b9b1f108511722e1f1b0f9a029edf808ff285406545f24e327052e0efa780.svg)}.flag-icon-af{background-image:url(/assets/flags/4x3/af-e271fd8f2fcdd0adda22a0e699173ff4e4cc65adfe7f05652cb77375eea99a93.svg)}.flag-icon-af.flag-icon-squared{background-image:url(/assets/flags/1x1/af-2629bc2e10edd54c384650f9aab1c6dfaf7101fda43ba3af627f0ec226db5892.svg)}.flag-icon-ag{background-image:url(/assets/flags/4x3/ag-91fee45d7e1bab658f840a721364dd6eff0b67f9135dc8445a1b3554c347c2e9.svg)}.flag-icon-ag.flag-icon-squared{background-image:url(/assets/flags/1x1/ag-476bf833d4e0789f71d7b0d24164734ed97627f36edd09cc75991bcfbb2aa7af.svg)}.flag-icon-ai{background-image:url(/assets/flags/4x3/ai-0106851bba5120a0f2bca5e6187ea65c9846e696f5ca57631aa89371cdf98871.svg)}.flag-icon-ai.flag-icon-squared{background-image:url(/assets/flags/1x1/ai-50a3279d492c2932919c02880b69da7bb7948ce96988d8ccc9b16357f006165c.svg)}.flag-icon-al{background-image:url(/assets/flags/4x3/al-f8bc9837446a4880d29088f18bfc014b4cde95d8edda1241be22b5724a74ea8d.svg)}.flag-icon-al.flag-icon-squared{background-image:url(/assets/flags/1x1/al-fb2c4d723ddbfb2c659ee2b3052d33347c130fb1024e2cb0ddd17f25b082542c.svg)}.flag-icon-am{background-image:url(/assets/flags/4x3/am-aeabb81fbe6ac768ba7b95bb22e5a1791eb35ff83d0b5d6785c88ddc6835444e.svg)}.flag-icon-am.flag-icon-squared{background-image:url(/assets/flags/1x1/am-6fc2c9fb24a6a079960d619cc1fdaeee31cdb52d27c75bb9b065d9664d853c11.svg)}.flag-icon-ao{background-image:url(/assets/flags/4x3/ao-34ea70b51c9069ef1a859935f07a64cfffab4e08438a9c746898da56b495d127.svg)}.flag-icon-ao.flag-icon-squared{background-image:url(/assets/flags/1x1/ao-1240d65f5dd9d8945701ed46611bd97f53f2cecf15b435cc54604eb79f4b97a8.svg)}.flag-icon-aq{background-image:url(/assets/flags/4x3/aq-6e2cee0eae620cd3f1fe6be665fd216f9a54a2afe215441005904dfeca24c169.svg)}.flag-icon-aq.flag-icon-squared{background-image:url(/assets/flags/1x1/aq-73c87173b09f476af2367895c76cf65d159c0a0b2ec292c1f1f5b08b2e78f829.svg)}.flag-icon-ar{background-image:url(/assets/flags/4x3/ar-71eca3c44a303392f2c8db443add184c4c79d9fa8a3e729be2528c8db53790b6.svg)}.flag-icon-ar.flag-icon-squared{background-image:url(/assets/flags/1x1/ar-0f75960e9ea2b2533e9112d4fc02154182f72460720c5a7d4dc21ef47758c369.svg)}.flag-icon-as{background-image:url(/assets/flags/4x3/as-29ac7248b1c428a68d0e2b1cfca4fade7b0fcb38151bf980d35c3b0be63d3d91.svg)}.flag-icon-as.flag-icon-squared{background-image:url(/assets/flags/1x1/as-f516550a6b6cf7e277a1877cad9afe10f694ac32c92df7709690913fd59ecf20.svg)}.flag-icon-at{background-image:url(/assets/flags/4x3/at-e6517cfc6605c0ffa13da8db795d6e4cd353f72434f8fe38a2ebab7ba685081b.svg)}.flag-icon-at.flag-icon-squared{background-image:url(/assets/flags/1x1/at-b9f9e8349460db6d35662b445a8a5fff96fccd904fff3411b711d31b2d7b7f16.svg)}.flag-icon-au{background-image:url(/assets/flags/4x3/au-c929c02559051c3f51c0d93dd9df0d886b6c1efa083c0f101d2b3fd39706726e.svg)}.flag-icon-au.flag-icon-squared{background-image:url(/assets/flags/1x1/au-96828c63a52eff55282096c045a3822cde99a00bf20528810d31f27b27208593.svg)}.flag-icon-aw{background-image:url(/assets/flags/4x3/aw-44597b0ede9ff7df0e659c464a51fdbc1a7f5cc5cd621d281302843c23a905bf.svg)}.flag-icon-aw.flag-icon-squared{background-image:url(/assets/flags/1x1/aw-2bd4b1890e233baeae0bcaaf1841803de35dd9c422f486588e48bf3506d69ae0.svg)}.flag-icon-ax{background-image:url(/assets/flags/4x3/ax-95093e740b0b492f7cd96fe370fa2478f0d0148b89b424cd8436807234ade9dd.svg)}.flag-icon-ax.flag-icon-squared{background-image:url(/assets/flags/1x1/ax-99af962543005067e7239903eb6bc23226d30ce14a7c6408693dc9641193ddc3.svg)}.flag-icon-az{background-image:url(/assets/flags/4x3/az-c0959e214bf9a3e94993cfc03f4884b15f6d8c4dd20842a5052a29a8495fd431.svg)}.flag-icon-az.flag-icon-squared{background-image:url(/assets/flags/1x1/az-3db731c28289795dc3bda91b3bab129d994a09b8ee0959d34f21a1f840f894de.svg)}.flag-icon-ba{background-image:url(/assets/flags/4x3/ba-388ea99507a04cc5d4768bd708d984714aeebbe4177a1cf8ffe0b8331dd856d9.svg)}.flag-icon-ba.flag-icon-squared{background-image:url(/assets/flags/1x1/ba-b7d7ab49229704dff0192935c9fb7fb4ea6ba989ce4fee832a738a5d78b39d71.svg)}.flag-icon-bb{background-image:url(/assets/flags/4x3/bb-6df74e1044b7f42c2c3b1082d46eb0198aa65a180459fdd950838cd2e6c00ee1.svg)}.flag-icon-bb.flag-icon-squared{background-image:url(/assets/flags/1x1/bb-eb10f33cbde25ab6ccaa49cbe3976b4f5ece2fa1d3d485394caa158f10b8b8c9.svg)}.flag-icon-bd{background-image:url(/assets/flags/4x3/bd-6cc222c4343f0027697ddd9e8d48f2cf93d3f677b6460b530eabefd2410cfef3.svg)}.flag-icon-bd.flag-icon-squared{background-image:url(/assets/flags/1x1/bd-2dc72311aca457668c8bce4f3a22c1b76320e00be50a58fb4001ea39caf6725c.svg)}.flag-icon-be{background-image:url(/assets/flags/4x3/be-2b7e73068f4f120ed0ccc3a9fbb8566c9574b206afd8373ed9050e2a971c4f99.svg)}.flag-icon-be.flag-icon-squared{background-image:url(/assets/flags/1x1/be-c4c9351d83a4db1f8c7c73dd6476569f0dfd82290ffd20275b7372908c2f2a7e.svg)}.flag-icon-bf{background-image:url(/assets/flags/4x3/bf-56669967fef6bb607ea2fd26d32d922cf78f176115287e37e9cf0b8bbec677f0.svg)}.flag-icon-bf.flag-icon-squared{background-image:url(/assets/flags/1x1/bf-ffc3651e87b9ccc9374d5bc95617aad474bcaa35871c83ae91fa71eb8b46bab3.svg)}.flag-icon-bg{background-image:url(/assets/flags/4x3/bg-ad796782d048f6ddc6715f7ea915a2c86716753579735ec071a106a7f3fc13b6.svg)}.flag-icon-bg.flag-icon-squared{background-image:url(/assets/flags/1x1/bg-962bd196cc8e4b702757e17a9002e867843c16415a47a52ecd97459278e5fa1f.svg)}.flag-icon-bh{background-image:url(/assets/flags/4x3/bh-aeff05c6dfa41e89db539312faedc41198ba2f2d9bf5ad9f22992a0a5a4151e8.svg)}.flag-icon-bh.flag-icon-squared{background-image:url(/assets/flags/1x1/bh-12da0d548841b860a7aedbbc858df1278a4f56105ae643f9379f5c2a3caa294a.svg)}.flag-icon-bi{background-image:url(/assets/flags/4x3/bi-7f43c6407a6f007fd70e7b43f9b34e870cc757736a9e2399c46381c8434d238f.svg)}.flag-icon-bi.flag-icon-squared{background-image:url(/assets/flags/1x1/bi-454adb690bfce8243896377b9c314ef8f447ec4d85dc677860f521a6c30c896e.svg)}.flag-icon-bj{background-image:url(/assets/flags/4x3/bj-85ecb891b5ebbe5802bd23d41fa44f1c1dbf047aceba991e6006e377c53fa263.svg)}.flag-icon-bj.flag-icon-squared{background-image:url(/assets/flags/1x1/bj-861b63ba692ecf3e1705296e51ef4f80da47a2eff5cfa29a787bcbc4fc989a53.svg)}.flag-icon-bl{background-image:url(/assets/flags/4x3/bl-2c832da5dfab278f90dcfd6265c08211802e94d9b6a5634df6dacdb750723312.svg)}.flag-icon-bl.flag-icon-squared{background-image:url(/assets/flags/1x1/bl-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-bm{background-image:url(/assets/flags/4x3/bm-05e6a9d863d77266cc3e2a74fddea640757e09b54d3032711f0d1890b5b61d3d.svg)}.flag-icon-bm.flag-icon-squared{background-image:url(/assets/flags/1x1/bm-0a16d9ab856676f9511627004ba4ee08ebe041533a33046c3f732ffb2793cf8a.svg)}.flag-icon-bn{background-image:url(/assets/flags/4x3/bn-1560949666220d88ee037b03ce1ac0b95c1b91667f05cf2b8b06a043efb01253.svg)}.flag-icon-bn.flag-icon-squared{background-image:url(/assets/flags/1x1/bn-387ebb4b9e1b3796c94edd61402851eafb8b185d7061671b832c1879db69d6eb.svg)}.flag-icon-bo{background-image:url(/assets/flags/4x3/bo-96c7f8e64029f530108baee22d8a07cad2787f41eeed0b647f800bb533c39c63.svg)}.flag-icon-bo.flag-icon-squared{background-image:url(/assets/flags/1x1/bo-ef679f07e201a91bc3e2152310eb597f731f7133d58be7fc0b1bbb3d8538c666.svg)}.flag-icon-bq{background-image:url(/assets/flags/4x3/bq-687781ca2bff027ee1c2bf587d45147cbe81af412d8a4c52e89673535bfa6a6c.svg)}.flag-icon-bq.flag-icon-squared{background-image:url(/assets/flags/1x1/bq-4c8a202ed7a99c1515fad01c0b79234163b42cfdc813aee71c0d277b49aadaa5.svg)}.flag-icon-br{background-image:url(/assets/flags/4x3/br-8370504ef87598decf706a50bc8b5deecfa80f965b4c3642d2207c9e0804be3a.svg)}.flag-icon-br.flag-icon-squared{background-image:url(/assets/flags/1x1/br-cce00e29adbdf110d4155153c8f21e36c46c34847baffafc33b806e121e320d7.svg)}.flag-icon-bs{background-image:url(/assets/flags/4x3/bs-80764fdde4884571c2ce5c348231dfe2c57c9e81d4d0d8722ae649ef37a9888c.svg)}.flag-icon-bs.flag-icon-squared{background-image:url(/assets/flags/1x1/bs-0a06f669be5ce81e27f5d9ace25e2254113cad9c2964208b5cd136e8b173b6e8.svg)}.flag-icon-bt{background-image:url(/assets/flags/4x3/bt-9d00de93c399a0ed1118946c0d662d997847480445bfbbba259e42f80b170be6.svg)}.flag-icon-bt.flag-icon-squared{background-image:url(/assets/flags/1x1/bt-32fb8022976e00163073b1f3ff2f62dda6915dd4270d2e09ae51babe67d2ce32.svg)}.flag-icon-bv{background-image:url(/assets/flags/4x3/bv-e0fd8f945e245badbcc8deedd6c139e2e19d26b3aea7bf1b9714595a2b08def1.svg)}.flag-icon-bv.flag-icon-squared{background-image:url(/assets/flags/1x1/bv-dceefec7161747877af75d9c4b5bd8c53bfeb5cbbe94b41de9a2201321673653.svg)}.flag-icon-bw{background-image:url(/assets/flags/4x3/bw-b5231bca6e8f2dd2371e3b4f776cb33af3889d2ad41c3791feb7cba3afe12992.svg)}.flag-icon-bw.flag-icon-squared{background-image:url(/assets/flags/1x1/bw-35bd0c7c542ab29aa65df0322f37befe54917cde0ec29a6358a8cbfcd3eb78a2.svg)}.flag-icon-by{background-image:url(/assets/flags/4x3/by-0111fe7946228bd49fa5ffc1d04e1dbea12bb0483cee4bf146e23fcb5d7bd829.svg)}.flag-icon-by.flag-icon-squared{background-image:url(/assets/flags/1x1/by-3a64902f39b8bac7c042cadcd2ace69975498cc6254f60f31829ebbfe31c2ef5.svg)}.flag-icon-bz{background-image:url(/assets/flags/4x3/bz-f6761e8e1132b192c6c2dddcb1d0239ed14e801b8902a7ee8fb0cb869a517eab.svg)}.flag-icon-bz.flag-icon-squared{background-image:url(/assets/flags/1x1/bz-2d1e5ec107a277b8e97fede80f512c23ebbf9c225a2c5450dc51c5fb03c9571b.svg)}.flag-icon-ca{background-image:url(/assets/flags/4x3/ca-cf63f34a0cef8ed56b4cf1ba24fecc20cea252a9eb9e2c16acccf4eb80b32f49.svg)}.flag-icon-ca.flag-icon-squared{background-image:url(/assets/flags/1x1/ca-5c78fbcd8924e8f76111f1cc50317decd6b7c1761e57f19ad33f0b295d002138.svg)}.flag-icon-cc{background-image:url(/assets/flags/4x3/cc-f5d8e042b0f7ee2be5ed555b4ea6a0586e69eeb9230701967903364c19e49006.svg)}.flag-icon-cc.flag-icon-squared{background-image:url(/assets/flags/1x1/cc-7dc42986b5859331d9f6c96ae7a97b378ff38e4480072cbecceae78e338891a0.svg)}.flag-icon-cd{background-image:url(/assets/flags/4x3/cd-9d7d8b11e63073792e3d5e0327cc673101c65ae7545d721b8b1504c31a0c0078.svg)}.flag-icon-cd.flag-icon-squared{background-image:url(/assets/flags/1x1/cd-f42723b2e3b7815b2a4b970c5d8a8abea987cf16ff26dbab0c1a78f3ffa3d1fd.svg)}.flag-icon-cf{background-image:url(/assets/flags/4x3/cf-902b209a0eaeb8f41f529b5c98240d4fa94dffd58ac3bdc2b6c574125897bb8c.svg)}.flag-icon-cf.flag-icon-squared{background-image:url(/assets/flags/1x1/cf-f9b65e234b309ba4f3b2261dcb605b257bd941a308d208b1eaa89af874c779ec.svg)}.flag-icon-cg{background-image:url(/assets/flags/4x3/cg-f62e43d08581b8665ab9a7e61ab62cc6b3dd8e6fd0722c7d45c6ddc3f46ec5ab.svg)}.flag-icon-cg.flag-icon-squared{background-image:url(/assets/flags/1x1/cg-f2fbf08b1f5fd7e097600a9399d467cb9af8d24fd103a3eeb99f5cf58e6fc0b6.svg)}.flag-icon-ch{background-image:url(/assets/flags/4x3/ch-830fe6654b170d461a76a7932b39d352ec30895d512c009a5c193c5a28289158.svg)}.flag-icon-ch.flag-icon-squared{background-image:url(/assets/flags/1x1/ch-9f95a95e181489d64144d4502991c00823cf19fefc029cb639199cb100863a0a.svg)}.flag-icon-ci{background-image:url(/assets/flags/4x3/ci-3e6b86d6fc1a24b5635c258bbde180f8638e114be354d7379406d5718e46b70b.svg)}.flag-icon-ci.flag-icon-squared{background-image:url(/assets/flags/1x1/ci-816edfc3bfc44353f99572310ba67643f979b1681c2643ecc34255df1dbee05e.svg)}.flag-icon-ck{background-image:url(/assets/flags/4x3/ck-cadf8156d64ddcff3d60079d017b12bb4e25867e58fa2618f42defa4f7bc8587.svg)}.flag-icon-ck.flag-icon-squared{background-image:url(/assets/flags/1x1/ck-450d3b83c32f220510bdbab3ec0fca14edf895e53db9e26e4cd00a3edfb3e224.svg)}.flag-icon-cl{background-image:url(/assets/flags/4x3/cl-28ce953691b1c4b0c6d562370913b3ad645e29e56296c16762992e3c30f2a4a8.svg)}.flag-icon-cl.flag-icon-squared{background-image:url(/assets/flags/1x1/cl-ed5421f0ff3ba05785268eed2abd3abf76125ec832e519bc10a30db278c23662.svg)}.flag-icon-cm{background-image:url(/assets/flags/4x3/cm-d22cb6519bfbf9fbae46b283f6d882f8d46713f18ba59969ae45c542ba2bc621.svg)}.flag-icon-cm.flag-icon-squared{background-image:url(/assets/flags/1x1/cm-4619b0400d175f6c0f686526cfdbfcc6f7c2fc7587449e05ab0385cc7d4e8bd4.svg)}.flag-icon-cn{background-image:url(/assets/flags/4x3/cn-7af9da3dd810174340b79e6fe636bec183c71d7ce314ac4a5a815bfd388dea54.svg)}.flag-icon-cn.flag-icon-squared{background-image:url(/assets/flags/1x1/cn-22e04d44d7f85e6f5800bddc6a497e5722de8db2ad74c6c525c392bd7b8c6e09.svg)}.flag-icon-co{background-image:url(/assets/flags/4x3/co-ef2a3c7e495d85d7df1b9bda27023cd558abe89402cad0ff42428c2c5b877551.svg)}.flag-icon-co.flag-icon-squared{background-image:url(/assets/flags/1x1/co-42915db89e2fa2f9f97c09ecafc188eb2ec4e51efa87685a01c25d2f0afddf45.svg)}.flag-icon-cr{background-image:url(/assets/flags/4x3/cr-7853ef9dbb5832a6d2738b44afdecfcdaa80c56cb66c448b8a8657e236854c8d.svg)}.flag-icon-cr.flag-icon-squared{background-image:url(/assets/flags/1x1/cr-b86f916cc80cc14db90b66c652a2919a26baf2864451685af9c34d6310c3f8c6.svg)}.flag-icon-cu{background-image:url(/assets/flags/4x3/cu-e3a3afa4a5c661ad431dc45eb501d7e1280b4a397bafa3956a9fc5bab8735f45.svg)}.flag-icon-cu.flag-icon-squared{background-image:url(/assets/flags/1x1/cu-9563bc3aa0b1ac659dddaa2534c37d338e1da3dfd3726a717fc85ca8449c83da.svg)}.flag-icon-cv{background-image:url(/assets/flags/4x3/cv-d39c3ae09026623cebad38bbe41231aea9b9afacf7eca1d0abf6666e91dd8bbc.svg)}.flag-icon-cv.flag-icon-squared{background-image:url(/assets/flags/1x1/cv-78857e96ac5b49478a49578f422abe217af9ed7d90fa2d08ae72a67de4f6999e.svg)}.flag-icon-cw{background-image:url(/assets/flags/4x3/cw-c65dd455b3c113d9088e563033c5f1ed3945d6dd88c8f13317fe297fd2291776.svg)}.flag-icon-cw.flag-icon-squared{background-image:url(/assets/flags/1x1/cw-61f38f9076443eb7ca682abc21e6ea5f170bd855813d7297d85602b76ca36171.svg)}.flag-icon-cx{background-image:url(/assets/flags/4x3/cx-aecc7a8b4b84b9f00a63154b027cb8ec78bebcec33e756b5e95151efb43420f7.svg)}.flag-icon-cx.flag-icon-squared{background-image:url(/assets/flags/1x1/cx-c052a0033a120d56c108dc0a919c3fccb9d01a4b78f1f778e3f2973e96197868.svg)}.flag-icon-cy{background-image:url(/assets/flags/4x3/cy-b8e0d56b75e0954429cb2253aaf289a83e3c72abd52b4132bdd4016f2bbd43c9.svg)}.flag-icon-cy.flag-icon-squared{background-image:url(/assets/flags/1x1/cy-34aa50b77e1b86f5305beec283996cabc45fef1950582b868addc40fd9a8438f.svg)}.flag-icon-cz{background-image:url(/assets/flags/4x3/cz-c2a15f3c50b7920c7d82fd9fb21f77c44fb3883f0e34dcf197a23d92d9212290.svg)}.flag-icon-cz.flag-icon-squared{background-image:url(/assets/flags/1x1/cz-487367824632a5097e16d7ed1ffc7fe8e233f9e1af45522571e1d4da10de92c7.svg)}.flag-icon-de{background-image:url(/assets/flags/4x3/de-32f54fb46c7fcaf2dfcf9172273456ea57f975efb228860def92481efe51c506.svg)}.flag-icon-de.flag-icon-squared{background-image:url(/assets/flags/1x1/de-2c94f333afeb14810030d786620fc32e65ba79af53b1037192383823996bb77f.svg)}.flag-icon-dj{background-image:url(/assets/flags/4x3/dj-d84d938856e7b6bdf8d38413c84a6968f94dc2adb218f2a9fab3d703341efc33.svg)}.flag-icon-dj.flag-icon-squared{background-image:url(/assets/flags/1x1/dj-6960cafac7e0d593152b60988fd12f5d1bb95068bf055c638cb999459f932692.svg)}.flag-icon-dk{background-image:url(/assets/flags/4x3/dk-fdd09296ac803a8cf4066ff5488821458a9788985e3cc09356d4c4ef81959ecf.svg)}.flag-icon-dk.flag-icon-squared{background-image:url(/assets/flags/1x1/dk-87924239a5ff1605582e1736f5ef17c9bd9d580d796d94b05ff668e2a52a223e.svg)}.flag-icon-dm{background-image:url(/assets/flags/4x3/dm-dc3b5c9634f0751ebfec181b12a7c530673ced1001b62a9126ed5ae39ba57203.svg)}.flag-icon-dm.flag-icon-squared{background-image:url(/assets/flags/1x1/dm-c8018ea775b0add069f676bbf4b446ed19886c192aa742bb6a61c3602ca63211.svg)}.flag-icon-do{background-image:url(/assets/flags/4x3/do-5e2d6816118f78fa4a362ee6a276dac655a4c99d57a9e53a52198f1624ed186a.svg)}.flag-icon-do.flag-icon-squared{background-image:url(/assets/flags/1x1/do-f9862ff8016b35d30d5c37ac2c585cdddf235e56ac9a7ae31a90c96963865f57.svg)}.flag-icon-dz{background-image:url(/assets/flags/4x3/dz-8a14ddcb20a69c3265924fe2af141ea78c0af47ea07a88707c392a2793092cd4.svg)}.flag-icon-dz.flag-icon-squared{background-image:url(/assets/flags/1x1/dz-0e2ada15ba7882343f7512929d3cf981a23a91817fdda0be1ed6a093161b649e.svg)}.flag-icon-ec{background-image:url(/assets/flags/4x3/ec-a4c3c62b4272f5000e1c8f563c45ce8305ec71f4e4e49ac477d81b5cb692d7e6.svg)}.flag-icon-ec.flag-icon-squared{background-image:url(/assets/flags/1x1/ec-c42aa1de56f2933fc6703e7a59ebc8b424c66f190697ee66814a137b56fa6969.svg)}.flag-icon-ee{background-image:url(/assets/flags/4x3/ee-6148aad79adb1c847fedb9da5a7e9c9d47e99ef4c8f4853bb9800e738bddb19d.svg)}.flag-icon-ee.flag-icon-squared{background-image:url(/assets/flags/1x1/ee-9a87370a85922c5d103d9d21fe3e778b801a62cf40e1f0efe8d708c5fe3b3ac4.svg)}.flag-icon-eg{background-image:url(/assets/flags/4x3/eg-3b2f122e512f0fc470666b35af4f677404d4b811cd795d5cf4e44a72ffd01285.svg)}.flag-icon-eg.flag-icon-squared{background-image:url(/assets/flags/1x1/eg-a050fc5953113bfa5e12867313b321df472eb86ad1e3d5362ebb27ac2edbd28b.svg)}.flag-icon-eh{background-image:url(/assets/flags/4x3/eh-fea043048f74c728961fe981d7e5d50e286fef39f3e68659b699c6c357c202dd.svg)}.flag-icon-eh.flag-icon-squared{background-image:url(/assets/flags/1x1/eh-8ea23a1b6813465e739d6f5e2ca6727331fae96cd32c86041a1ba48926a14cfd.svg)}.flag-icon-er{background-image:url(/assets/flags/4x3/er-b24dc54f7e94d0934d05faa7944e6039a56de8a5e4779a399046f047dbd1b949.svg)}.flag-icon-er.flag-icon-squared{background-image:url(/assets/flags/1x1/er-6921f9776ece4a1b1ec594ec5665076462cef2d0b41eba83a7bc840ecf88287d.svg)}.flag-icon-es{background-image:url(/assets/flags/4x3/es-e36093927dc1fa109e4ddcd4baa65d53d233c23bcdd32796b96409b52c5adbc0.svg)}.flag-icon-es.flag-icon-squared{background-image:url(/assets/flags/1x1/es-16a6c048523ee57edd91e60e87aae136a96893b48828d932a24436bb219c00b9.svg)}.flag-icon-et{background-image:url(/assets/flags/4x3/et-a3ef36d217667b7e8ebe910469c2eeef563f03d3ea5628ec7fea0f72650db28e.svg)}.flag-icon-et.flag-icon-squared{background-image:url(/assets/flags/1x1/et-f66f415e5d5b8b697ed7bb85f4ae3408f9cefaeed7ff0136c4c03da5c3601340.svg)}.flag-icon-fi{background-image:url(/assets/flags/4x3/fi-a94779c54a538d2f57a421e6beb619f07cc9c2bda40817d236b686deb8eb3b4c.svg)}.flag-icon-fi.flag-icon-squared{background-image:url(/assets/flags/1x1/fi-865b1ae3ed34a0cf0928c6289411569add2065c7ea4fa6897f971c322d955b16.svg)}.flag-icon-fj{background-image:url(/assets/flags/4x3/fj-97dd8f9b0d9df1cd965c8a85ecb6feb538acc83b470596ccd199f71dc3d2eff9.svg)}.flag-icon-fj.flag-icon-squared{background-image:url(/assets/flags/1x1/fj-f772a5a860faef823adad1b0dc8e848349d094f4fa3b37e48c87382bd443c861.svg)}.flag-icon-fk{background-image:url(/assets/flags/4x3/fk-788901bf125ceebc6c23fa03c801420c787bbc4ce6aa4511ccaaba301e379886.svg)}.flag-icon-fk.flag-icon-squared{background-image:url(/assets/flags/1x1/fk-5d8df0034167cc75863d02bfdb6147da3a694102f7eea0d92e717a048437fc0f.svg)}.flag-icon-fm{background-image:url(/assets/flags/4x3/fm-7167ec387c426a817bccbfec86c8f815b82b36504e1d480f4f9fa04177bdcba0.svg)}.flag-icon-fm.flag-icon-squared{background-image:url(/assets/flags/1x1/fm-d08e5959b5e3866cdf814f8d6ab594cb3ca84f0887a3adad3bff824ea0aca70a.svg)}.flag-icon-fo{background-image:url(/assets/flags/4x3/fo-af6148d661d02a6580e8714a6271776b4b8bf3b656bfd5fd88acdd1aa170366a.svg)}.flag-icon-fo.flag-icon-squared{background-image:url(/assets/flags/1x1/fo-26d5af2770c46935170988cbad16ef9aad9be34b38ea92847e6646a516878598.svg)}.flag-icon-fr{background-image:url(/assets/flags/4x3/fr-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg)}.flag-icon-fr.flag-icon-squared{background-image:url(/assets/flags/1x1/fr-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-ga{background-image:url(/assets/flags/4x3/ga-80f90062ef9aa4d236c81ec6c6c6e08058750794014bb93d8dbdc8e1684ca4fa.svg)}.flag-icon-ga.flag-icon-squared{background-image:url(/assets/flags/1x1/ga-a66094862d24f29704c190fe42ff50820923f3940ff417f3e1623e9089b57eb9.svg)}.flag-icon-gb{background-image:url(/assets/flags/4x3/gb-d85f0f149b4390bed6624bc30ca2cbfa37d394f14474fcf81d63363ad363e284.svg)}.flag-icon-gb.flag-icon-squared{background-image:url(/assets/flags/1x1/gb-2f0cc6ed1e8e9a7e56cafd3500585d685ae0c51abacddc52f750fb4d23f60b04.svg)}.flag-icon-gd{background-image:url(/assets/flags/4x3/gd-51a8d53466df4426bec5fb202dd8f35239324b9c8b5256d38fe411c4b79945cb.svg)}.flag-icon-gd.flag-icon-squared{background-image:url(/assets/flags/1x1/gd-9156f824a83004691a7a354e925bc1680b5cffe663bbfa37aa4609ff28148218.svg)}.flag-icon-ge{background-image:url(/assets/flags/4x3/ge-4ef2c8e6f371a711c61ac54d8d201a80aab53767cacc5322fb848cd3e38b00e7.svg)}.flag-icon-ge.flag-icon-squared{background-image:url(/assets/flags/1x1/ge-a3af8272a5fb63372705825519543e53269282c4800b70e6a93ba69674524eee.svg)}.flag-icon-gf{background-image:url(/assets/flags/4x3/gf-c7d5ee882949b708641f99ec02edcc6b3b2362d393cc3869342442225be7cd3d.svg)}.flag-icon-gf.flag-icon-squared{background-image:url(/assets/flags/1x1/gf-b297e376fc00d3d7bfafd081766dafc4590f4ac4b71f53bc2bbdf2c028547920.svg)}.flag-icon-gg{background-image:url(/assets/flags/4x3/gg-e99b36723ffe04d7be392d612c76ef44e82bc84823d71793eb38e338116f0ee0.svg)}.flag-icon-gg.flag-icon-squared{background-image:url(/assets/flags/1x1/gg-3f764a4568626d43f89b2b200dcbfe68de3093be418716549ab7c5c33f433d37.svg)}.flag-icon-gh{background-image:url(/assets/flags/4x3/gh-817c2eb8b3f7190647510371b2d38ad8e28e1348cb657e34778f970af5ca3868.svg)}.flag-icon-gh.flag-icon-squared{background-image:url(/assets/flags/1x1/gh-87a6486910cb62e58439da330c4270d1e2a0fd8e1ace80987c295971d15f9af3.svg)}.flag-icon-gi{background-image:url(/assets/flags/4x3/gi-52bfb6cd7cbebf1da96dfc6bf708d3b7239984d36400181ca4ac020081ae41b5.svg)}.flag-icon-gi.flag-icon-squared{background-image:url(/assets/flags/1x1/gi-f7ebd8d36a5cb260392a92f10d8bc8d7cf11433fdce9474e08cc52a07dcd5258.svg)}.flag-icon-gl{background-image:url(/assets/flags/4x3/gl-e031a722ec76e8262439e50a0dbba62f7b7bea020361f2bf4a9a49d6b59954a5.svg)}.flag-icon-gl.flag-icon-squared{background-image:url(/assets/flags/1x1/gl-847b3362e50c1d74aeb01a5ea55cfa2950597cbbfa2377bd7cb70e273d4c57fb.svg)}.flag-icon-gm{background-image:url(/assets/flags/4x3/gm-a13d89d1cd66c77706dbaa380370ce3d62c0cf3219c287008759e823fd42a27c.svg)}.flag-icon-gm.flag-icon-squared{background-image:url(/assets/flags/1x1/gm-4a4490e2aea203b32862d6e58bd02efc45d07a401684795ecae68ddb97756387.svg)}.flag-icon-gn{background-image:url(/assets/flags/4x3/gn-cfa24192de905cc4a07dffb54ea252304bcffd387ce2d6dedae89b654486f286.svg)}.flag-icon-gn.flag-icon-squared{background-image:url(/assets/flags/1x1/gn-b50eaffe8a6fd16c9cf2c2d51adea53250b089f04ea701b8d5d812877de6d084.svg)}.flag-icon-gp{background-image:url(/assets/flags/4x3/gp-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg)}.flag-icon-gp.flag-icon-squared{background-image:url(/assets/flags/1x1/gp-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-gq{background-image:url(/assets/flags/4x3/gq-548afdaa6c448c6bec87c1e2148831c41f9a2f4f83922cf32e5a3904679d889d.svg)}.flag-icon-gq.flag-icon-squared{background-image:url(/assets/flags/1x1/gq-28c6e2820b326370a489d4f9efaf258432fdabecb67e610ddd752ed0f0e8a8ce.svg)}.flag-icon-gr{background-image:url(/assets/flags/4x3/gr-e2aa8c913feebbed26a8fa0de5ac4aeb51545a4c0dee9bfda4ec5d9673f96386.svg)}.flag-icon-gr.flag-icon-squared{background-image:url(/assets/flags/1x1/gr-64dc4363c7c3b827adaa7cd51bb8a0f30bd0a547e86772c473d433b1a6033e2f.svg)}.flag-icon-gs{background-image:url(/assets/flags/4x3/gs-83141fac364fa2871379c6b1cb8da9935a185bf9b0e5dafc6b6458fa13359589.svg)}.flag-icon-gs.flag-icon-squared{background-image:url(/assets/flags/1x1/gs-31c9e0016c7bd2cfed68cc4e6c2ca73123ce9391e8a50804e5c74101b72e07cc.svg)}.flag-icon-gt{background-image:url(/assets/flags/4x3/gt-b4ca8c4ed71131c43ba14f3631a0ee92dababef325bd698ee0bac0da84980c85.svg)}.flag-icon-gt.flag-icon-squared{background-image:url(/assets/flags/1x1/gt-a7ce73eaabe1b659b733691076f8455051951432a1fac682f5896f8c4af6ff69.svg)}.flag-icon-gu{background-image:url(/assets/flags/4x3/gu-a71a2e02c06f22984e424d15a410d9261ec9ddeeb3df112d5f46b66a09f5bd9a.svg)}.flag-icon-gu.flag-icon-squared{background-image:url(/assets/flags/1x1/gu-2156b3d721b79189d40c7f5b5de9e219f83a40b69e0a3855514a097fcdc2f2d2.svg)}.flag-icon-gw{background-image:url(/assets/flags/4x3/gw-9eba06bd7c024dbd764b1bc1360120ed8a280d59075f81a50994930534cc42f2.svg)}.flag-icon-gw.flag-icon-squared{background-image:url(/assets/flags/1x1/gw-6c4ca99e9871a9cde81966aaf02aac0106e2210f9c64e94bdb5168c7abbbc0e6.svg)}.flag-icon-gy{background-image:url(/assets/flags/4x3/gy-b6f25e30b463f760ea01c81ff88a3932bf6812e6b626fd7fbe711a4cbac246c6.svg)}.flag-icon-gy.flag-icon-squared{background-image:url(/assets/flags/1x1/gy-d82b2a81ce6cca3e7c5854a5bc1198224b6455eab7adf06d69822a3cf433a1d2.svg)}.flag-icon-hk{background-image:url(/assets/flags/4x3/hk-b69c165653e2d112296b963d3369a7d8f656e77432c6c1c5ac1485db077c80a0.svg)}.flag-icon-hk.flag-icon-squared{background-image:url(/assets/flags/1x1/hk-09c50dc6f3b0d5bffbc85a2998c5c86da531a939cf48c07ddb644061ab0b2222.svg)}.flag-icon-hm{background-image:url(/assets/flags/4x3/hm-faf74b1cde15843a42becf5d05a373f9af8d867d68c824e80d2c41b48c23ea57.svg)}.flag-icon-hm.flag-icon-squared{background-image:url(/assets/flags/1x1/hm-6cc1243d9638246c1bac7e52287dcfc6f9b00d142105fcfc9e8b7b3405d4852f.svg)}.flag-icon-hn{background-image:url(/assets/flags/4x3/hn-3ad02422915a4ac6a81c3249610cbd42638ebe27d412a2d490bc63e75e1028ea.svg)}.flag-icon-hn.flag-icon-squared{background-image:url(/assets/flags/1x1/hn-f0be4d00b892418864d0e4cd3000ee2dc519dbb96d424cb42f55707f8999d44a.svg)}.flag-icon-hr{background-image:url(/assets/flags/4x3/hr-6671992f1644503121dce7774bf2f7e2ab65da14124251d80b024d78fb34f6f0.svg)}.flag-icon-hr.flag-icon-squared{background-image:url(/assets/flags/1x1/hr-f086b6932d53408f2b57db5e038dc7b508af60a49670e187eed42714f1115b49.svg)}.flag-icon-ht{background-image:url(/assets/flags/4x3/ht-0c3452573c61366d1e9d647d61675d2e9a309312e63c649f98d73fe37d2aab4f.svg)}.flag-icon-ht.flag-icon-squared{background-image:url(/assets/flags/1x1/ht-80c212d49effab9e944de758c08cc296833bc2a04b3098e8ee58266657522fdc.svg)}.flag-icon-hu{background-image:url(/assets/flags/4x3/hu-b48c8253bec6b4e08f8954a2955fdbc2311d254b51358770d3eaec5fe0875965.svg)}.flag-icon-hu.flag-icon-squared{background-image:url(/assets/flags/1x1/hu-af59966ca652f5ba1d081af0c1c2343acb479d1a06e03d248bde266cb29aa931.svg)}.flag-icon-id{background-image:url(/assets/flags/4x3/id-e02525ae7152d4bd10dcad2ffdf0bf5d08c6c67d3142bc78a7cdbcaf1fcd4a4a.svg)}.flag-icon-id.flag-icon-squared{background-image:url(/assets/flags/1x1/id-5b846f6ce4715ea50d4068d9941290229c1be67d619a978096eab2c612e9b297.svg)}.flag-icon-ie{background-image:url(/assets/flags/4x3/ie-0e75a4c4027484997f14bd4c2529384ef6c621591908473ccbeda20381c05c93.svg)}.flag-icon-ie.flag-icon-squared{background-image:url(/assets/flags/1x1/ie-6446113a9abff1feba085706937ff83d73ba310c78153e8da3ca2d6f0c529510.svg)}.flag-icon-il{background-image:url(/assets/flags/4x3/il-98c3c0d9628008ac3a947d8f10fcb01d8e2545dfb265e94e6a29910e1ba57a2d.svg)}.flag-icon-il.flag-icon-squared{background-image:url(/assets/flags/1x1/il-0f95bc7892bcf9eb3b6af9bf930e803b5121c45fa7261874ab4d7a8542c20c45.svg)}.flag-icon-im{background-image:url(/assets/flags/4x3/im-0c402e364a705500028c46ccbd78a29944e91103b490607b366ae1d4f221ffc0.svg)}.flag-icon-im.flag-icon-squared{background-image:url(/assets/flags/1x1/im-718f45e1c60fd42db2a814bfaaa3a9be828f4dd0e4a4aea49e021f066087dece.svg)}.flag-icon-in{background-image:url(/assets/flags/4x3/in-a6c958c4b5cb12e2392d81b11dd0fed5fd5d0a66c7decb3ad3c8d27175854d3c.svg)}.flag-icon-in.flag-icon-squared{background-image:url(/assets/flags/1x1/in-b4163420567e8e04fa58b79688af8d7bacf32ddf0e2b63ae2f1c5f0aacaaa696.svg)}.flag-icon-io{background-image:url(/assets/flags/4x3/io-b951cf1fa71ddae941ee31dd018d2593bb8621ff92508bb311c7362c537a474c.svg)}.flag-icon-io.flag-icon-squared{background-image:url(/assets/flags/1x1/io-d9dfc871f0bca35430b17de2e55394b0145334aa2080e07856e21d6d2e007d8d.svg)}.flag-icon-iq{background-image:url(/assets/flags/4x3/iq-6a74e49d2c3d0ff072086fba1a2fc8b948ca34891a3aca960f9daacec107bcc6.svg)}.flag-icon-iq.flag-icon-squared{background-image:url(/assets/flags/1x1/iq-95f5be79b6ab86e6338abd39ef8499af1517dba8ec3b266ea8e3c954601f0bbb.svg)}.flag-icon-ir{background-image:url(/assets/flags/4x3/ir-5f9fdfd2d4cad535338f6de7927cc8094d02eaf06dd5122d3cba9e859c9ec4df.svg)}.flag-icon-ir.flag-icon-squared{background-image:url(/assets/flags/1x1/ir-f5367274525b1f050dfae895943620a2e711f63a5726b273b488721a4501465d.svg)}.flag-icon-is{background-image:url(/assets/flags/4x3/is-15409efb6cec16b490b4abbbc03db415ef3448cb8cb281dd7cd1b2ba496d534d.svg)}.flag-icon-is.flag-icon-squared{background-image:url(/assets/flags/1x1/is-500c3ef83fe917ab9cad59b7e8e6d693d9e78876febc1882c4bb06c8876b7357.svg)}.flag-icon-it{background-image:url(/assets/flags/4x3/it-a285a0e341ba9492a2b7478e8a7a13f7c76d3c6a581aafb965ea26e1c554f0f3.svg)}.flag-icon-it.flag-icon-squared{background-image:url(/assets/flags/1x1/it-eeb47e346a5f6124b34f8428c97fc7dab2726f8d36d62dec08df3ec7171353cd.svg)}.flag-icon-je{background-image:url(/assets/flags/4x3/je-b611f3e0fb7a94f85fa7d5f6f7a7db839381d054eb92abe0856dda8218c40687.svg)}.flag-icon-je.flag-icon-squared{background-image:url(/assets/flags/1x1/je-39c0c1482c1c533366153edc873f5eae266fdbf591e2022a7f82c17ce2d676ef.svg)}.flag-icon-jm{background-image:url(/assets/flags/4x3/jm-62fcbb8ed5b923b6aafe3990a24ad571485b4ac8db1bd7ed7b200cfadeeb8d7f.svg)}.flag-icon-jm.flag-icon-squared{background-image:url(/assets/flags/1x1/jm-b57cb61fb8eb67f0887afb7c779d6033e1c4c10242662093df69496aa58cc464.svg)}.flag-icon-jo{background-image:url(/assets/flags/4x3/jo-8e1174e66beeec19016b2754e8bdae987f420fa937ba78efecd61c177d9d40dc.svg)}.flag-icon-jo.flag-icon-squared{background-image:url(/assets/flags/1x1/jo-47d2fc18e8af9194bcb249161a10383f89c11a73148b6dc77f4ab47a90294ae1.svg)}.flag-icon-jp{background-image:url(/assets/flags/4x3/jp-1785964f1f3a4346ab8e1cbdc211399c5ced34a566c4725f3d23e8105413d6f4.svg)}.flag-icon-jp.flag-icon-squared{background-image:url(/assets/flags/1x1/jp-a71cace9d237527635ee960b4df645f202d630c46458cf7e7a7ac09659e4404f.svg)}.flag-icon-ke{background-image:url(/assets/flags/4x3/ke-680e981e37f7f0497e148043390987748a5bc78f4c3af09cf58c61d42b2a4a24.svg)}.flag-icon-ke.flag-icon-squared{background-image:url(/assets/flags/1x1/ke-60ff7f8bf6b5da9182867b8200475cb0a87f80cc960643ee15c99bcdcf200654.svg)}.flag-icon-kg{background-image:url(/assets/flags/4x3/kg-3a93d17f0ed778664ae760032710fd7235bc43090de3543ec50fb8d2dfd9b595.svg)}.flag-icon-kg.flag-icon-squared{background-image:url(/assets/flags/1x1/kg-165c50f348fe0d4d8f0bc9cbf2666acde0f3a81dfed3398b8a7db5a51e3348aa.svg)}.flag-icon-kh{background-image:url(/assets/flags/4x3/kh-6f3eb3cb44cd8124f4b7cb0d9230ddab4f782ad10746c2e1fa73f54ca2fe4446.svg)}.flag-icon-kh.flag-icon-squared{background-image:url(/assets/flags/1x1/kh-9541bd094c9e79e8ebb77a8ba94b22ed079b0502b2d70769b89ac9d19d16781b.svg)}.flag-icon-ki{background-image:url(/assets/flags/4x3/ki-a1b39a59ce5be52e1c6ca618ccc97f47d2a7b0d652bc2e5814c30a13d03842b8.svg)}.flag-icon-ki.flag-icon-squared{background-image:url(/assets/flags/1x1/ki-e9e5127171d893619b247b605865507b61019dee9e6ea589c5cd0c0e7d513f22.svg)}.flag-icon-km{background-image:url(/assets/flags/4x3/km-2ad8132e636de92218e06cad237154128fd1e84dbed82610e138ea148a53c01a.svg)}.flag-icon-km.flag-icon-squared{background-image:url(/assets/flags/1x1/km-d9d978cca1790b3165a0d18e159a536b4a2405f12b0200b03cf721042d326089.svg)}.flag-icon-kn{background-image:url(/assets/flags/4x3/kn-08b7f26ac06f65c797de647f61bb738a4212cfc9ceb53ef11d8db093b58386d1.svg)}.flag-icon-kn.flag-icon-squared{background-image:url(/assets/flags/1x1/kn-e632854084c163a1752b53117eb4f773e57eef231917db846fc8009541cfe4b9.svg)}.flag-icon-kp{background-image:url(/assets/flags/4x3/kp-f073e224e1faff5a0bbcb51cd05288d1b13cb607dda42fc7702afe8cfb01d0b3.svg)}.flag-icon-kp.flag-icon-squared{background-image:url(/assets/flags/1x1/kp-504fc83119f2a2c34ac75051d3ce15edee6f93555d729d759ef15f5f5caab3d3.svg)}.flag-icon-kr{background-image:url(/assets/flags/4x3/kr-dbe4354aefeb100e561ee6f6ea6cc46551c1722d1b75fc164b60b0592d9dc30d.svg)}.flag-icon-kr.flag-icon-squared{background-image:url(/assets/flags/1x1/kr-3aefdef6c6b72177aea924981a673bcc58c24b8c98cb00960e23250c07766b63.svg)}.flag-icon-kw{background-image:url(/assets/flags/4x3/kw-fc682de5f565e3a918a9cce44a87a0cd8a40b93a555be3dc7c381ced74853021.svg)}.flag-icon-kw.flag-icon-squared{background-image:url(/assets/flags/1x1/kw-63c2078d09713c30c0b917fdaac63a1fdb9161ec4b8cf1e91d4a9a8730a5cb65.svg)}.flag-icon-ky{background-image:url(/assets/flags/4x3/ky-77da018be33fa8aec69147e6107ff363bfc467ba857e7d47bd383984305cebab.svg)}.flag-icon-ky.flag-icon-squared{background-image:url(/assets/flags/1x1/ky-4a6b098e38d727959969a977668aefbdf6b9adcaef4cd922aac232d64a8a9d75.svg)}.flag-icon-kz{background-image:url(/assets/flags/4x3/kz-ce3998065f1b6242d0a1755ffb590f15b2ff477b594b26b9a497f7181304bbe3.svg)}.flag-icon-kz.flag-icon-squared{background-image:url(/assets/flags/1x1/kz-795fd9bf32b68805f9e80f120db569eacbd5727fc523d7ff89943bdf9ef5b1e9.svg)}.flag-icon-la{background-image:url(/assets/flags/4x3/la-dd2ead7123a2c4d2fda71d8a462319d30c6ff8e83c72cfd888230f6a670fdff4.svg)}.flag-icon-la.flag-icon-squared{background-image:url(/assets/flags/1x1/la-7ebc9f64aad0049a8167272ce06a7c1512c7d14080ff93a88e6b28e4050f33d3.svg)}.flag-icon-lb{background-image:url(/assets/flags/4x3/lb-7afb0e27b8cec77e2c65c3467b68ab24d49879a4739ab4780154a7db4358f6fc.svg)}.flag-icon-lb.flag-icon-squared{background-image:url(/assets/flags/1x1/lb-6f50829425260779f08ad80ac9430796e64901b0dd74d010bdf2336f541eb47d.svg)}.flag-icon-lc{background-image:url(/assets/flags/4x3/lc-9efcb3c88f9ff13bedcbd0c7f48c7fab604d3842ee559be3a11c6bc64e31a53c.svg)}.flag-icon-lc.flag-icon-squared{background-image:url(/assets/flags/1x1/lc-31d72d1034bf031934561da9615fc3db916bb08a210f434a981e053a7edfa339.svg)}.flag-icon-li{background-image:url(/assets/flags/4x3/li-9eed98d7d4e07cba0a2aae80e31add4bbe663e959df8cafd607cef17daf4351a.svg)}.flag-icon-li.flag-icon-squared{background-image:url(/assets/flags/1x1/li-f655bf461c1690078c846528eb6d3ebe8d594b2539e3cc37f89204a754424c81.svg)}.flag-icon-lk{background-image:url(/assets/flags/4x3/lk-3471b0585fb1e0ee350d6fe87e55ef07eef01e99444263b86ff005156dea1b73.svg)}.flag-icon-lk.flag-icon-squared{background-image:url(/assets/flags/1x1/lk-d3bb56415e6e2095a470cf4e2ed455c57cde204aa79362786aca785db35ecff8.svg)}.flag-icon-lr{background-image:url(/assets/flags/4x3/lr-a39f30a6169c4a3f3ff8e0eb04862e7f941c5d7c8e489ff5e7e4cd8cd436f5e2.svg)}.flag-icon-lr.flag-icon-squared{background-image:url(/assets/flags/1x1/lr-731191ad65bf784386cabac12693722d16aeb2e97d6456cc33488f805067aca8.svg)}.flag-icon-ls{background-image:url(/assets/flags/4x3/ls-1e4f7ec2600e30b515cd12b509c376c3014d760731d89f87ae9a962fe249b3d4.svg)}.flag-icon-ls.flag-icon-squared{background-image:url(/assets/flags/1x1/ls-ba2a8327ab9b0e74f4f411ab989980cde309e86395736a1f77e17a0eefc85266.svg)}.flag-icon-lt{background-image:url(/assets/flags/4x3/lt-d6a367644254244a8219c2eaa525b43d261f5da4fb074b0e08cedeb343f737a1.svg)}.flag-icon-lt.flag-icon-squared{background-image:url(/assets/flags/1x1/lt-933670ec7627a78f72b60cfe7f49cd09b4afa58fb341857f76a5b7b612c12c97.svg)}.flag-icon-lu{background-image:url(/assets/flags/4x3/lu-949c9e81217b58fe622d4d4d00903499b3e2249aa3f688401b78bd3ad977c740.svg)}.flag-icon-lu.flag-icon-squared{background-image:url(/assets/flags/1x1/lu-ab39ab3ddef396fcd816d4170f3f73ed89465ed37a180685c68b3833aa3f01a9.svg)}.flag-icon-lv{background-image:url(/assets/flags/4x3/lv-b672e3ee7e344abaaf9128111a6543ad7897aa92084b74c42a2877aa1b8cf7a8.svg)}.flag-icon-lv.flag-icon-squared{background-image:url(/assets/flags/1x1/lv-55fc46607d153eb1d40d1b478ab6448117b79cdc3d9d973ea2beb44ee4d77316.svg)}.flag-icon-ly{background-image:url(/assets/flags/4x3/ly-6f996771734c3f63c65d925a3d991f7d238734cc10e56b3160841fac2939e21a.svg)}.flag-icon-ly.flag-icon-squared{background-image:url(/assets/flags/1x1/ly-4e0bf9ff6856dcbba708b4fb176abd44cd385274badbb6e609b596a660109191.svg)}.flag-icon-ma{background-image:url(/assets/flags/4x3/ma-70b305040cec175c749a22e6d1e0c1c96bd2164768f208a34d6c8a7ed5caa0ae.svg)}.flag-icon-ma.flag-icon-squared{background-image:url(/assets/flags/1x1/ma-919d8fa71ed3a3cadabade682f5326334f11d659245d51b31b40880689cbe275.svg)}.flag-icon-mc{background-image:url(/assets/flags/4x3/mc-f0bd30faa57995276026f00e97f6d4ffd3c151e6d2c3d440331ac739965f3bc9.svg)}.flag-icon-mc.flag-icon-squared{background-image:url(/assets/flags/1x1/mc-6fcd8ec0404ec1e02e8f38934202004b443c39ffa369be045872c4c89b0674b3.svg)}.flag-icon-md{background-image:url(/assets/flags/4x3/md-4bb12bafd1cae33ea4d420dc80301e573d39247323d0eca7c343650a414931ad.svg)}.flag-icon-md.flag-icon-squared{background-image:url(/assets/flags/1x1/md-76e3c791e11574492239b07821b43d8f5308e8b7b9ed7d72a5b189f06bb0a81d.svg)}.flag-icon-me{background-image:url(/assets/flags/4x3/me-096ce4c309762cde78cb1fec7f1d9ab7c38e6270ddb5aaaf9d29ec63a160e276.svg)}.flag-icon-me.flag-icon-squared{background-image:url(/assets/flags/1x1/me-9f8dc8f8e7b38bfc2edd5a35d13818544d304c7834a315ffbfcccecf7a9e6ba6.svg)}.flag-icon-mf{background-image:url(/assets/flags/4x3/mf-4e8c446e032572a2e74d1fdccec9a3ae93d66dc24952ed2f1fe5bdab6fef5702.svg)}.flag-icon-mf.flag-icon-squared{background-image:url(/assets/flags/1x1/mf-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-mg{background-image:url(/assets/flags/4x3/mg-f8afb0a551765b27b0c173a623e30af523e907e665858c401e8246b2fa5c2052.svg)}.flag-icon-mg.flag-icon-squared{background-image:url(/assets/flags/1x1/mg-d5527653deeb8cd3c7d24082dab7c9dcd8218dd9c9043c832cb1436f1d8090ae.svg)}.flag-icon-mh{background-image:url(/assets/flags/4x3/mh-4edc79226b41a72a4f0a8ca6d4f7f8f73e92972ae6b30c96a9dab4274a046165.svg)}.flag-icon-mh.flag-icon-squared{background-image:url(/assets/flags/1x1/mh-1bd8a38684a5d55aea8319d106fdc1e62a91424e36a8fb5a27f215cfadb98707.svg)}.flag-icon-mk{background-image:url(/assets/flags/4x3/mk-2098f24dab54b22fbc7aff34c15009b4ae7012a6848cede09d6db9ed5caaffec.svg)}.flag-icon-mk.flag-icon-squared{background-image:url(/assets/flags/1x1/mk-1b083e708a18b40383921595134b167e0fa84a6f233934668481b902b518f089.svg)}.flag-icon-ml{background-image:url(/assets/flags/4x3/ml-5cb117165c5ebebb07725430dce0fbd0bce2ad618967354eda44d9229e16c676.svg)}.flag-icon-ml.flag-icon-squared{background-image:url(/assets/flags/1x1/ml-cf94ba5bc9f5b9f3b15c187243a5fc60dd80a43715da7ae005dc13321f0d411b.svg)}.flag-icon-mm{background-image:url(/assets/flags/4x3/mm-987d96563a6517ba568b2ad3e8dbcd77c01c0a6114b8497b214cf3e967ce27d1.svg)}.flag-icon-mm.flag-icon-squared{background-image:url(/assets/flags/1x1/mm-a78cffaf229320ef1cc28570ec3e91e9e188d8cff8cc01f14423b9c5383e87d2.svg)}.flag-icon-mn{background-image:url(/assets/flags/4x3/mn-a3dc85a21b868793f084dd954c31e13c0cf993eef59102a102406c95d99e243d.svg)}.flag-icon-mn.flag-icon-squared{background-image:url(/assets/flags/1x1/mn-141a15f289b3e49d8e0c1a21b9015f14ebb9e55660ebc23deefa55a3fa6fc9b5.svg)}.flag-icon-mo{background-image:url(/assets/flags/4x3/mo-f58284a9e6021d88f7756d6cbe408f79789a30113084ef6bbd8541e15008d684.svg)}.flag-icon-mo.flag-icon-squared{background-image:url(/assets/flags/1x1/mo-b871b2e0087b09318060384476b25c28de16acac946f5ecbb4e162660e6486c1.svg)}.flag-icon-mp{background-image:url(/assets/flags/4x3/mp-d9f8b726babd7cba9e128eb81ce7e7d9adb81945f056072aaa3b5540c8299f9d.svg)}.flag-icon-mp.flag-icon-squared{background-image:url(/assets/flags/1x1/mp-41d27c2d802f8487a3343a962c11711e9ebf682bda766cceb72ccac2b37dbda0.svg)}.flag-icon-mq{background-image:url(/assets/flags/4x3/mq-21e70a8c243dc97f486dadf01f0b3300a8310c719d5a650fe4d7512e7ee8169d.svg)}.flag-icon-mq.flag-icon-squared{background-image:url(/assets/flags/1x1/mq-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-mr{background-image:url(/assets/flags/4x3/mr-76898913a879ac1eadb03f5950843ea63fd9a0a998d1b9113c386012cf1c80e6.svg)}.flag-icon-mr.flag-icon-squared{background-image:url(/assets/flags/1x1/mr-5288f91d4c12b6fdca7129a8564638991028f730a170bb72be9fee1ac8d8f206.svg)}.flag-icon-ms{background-image:url(/assets/flags/4x3/ms-add4964ba7fa5a4440d40902dabd49345476d13ddf6e20e7b06834ab30721b79.svg)}.flag-icon-ms.flag-icon-squared{background-image:url(/assets/flags/1x1/ms-47f49520f4ba965587509e45980be0ef29792830738cdae717e52616a11bc00b.svg)}.flag-icon-mt{background-image:url(/assets/flags/4x3/mt-55b5c69335d7e2691e50443b34fc5b708309c99326fea6233dd3575c3402043a.svg)}.flag-icon-mt.flag-icon-squared{background-image:url(/assets/flags/1x1/mt-bbdc4f8e3dc66dc066d8ad0a264d751090794c53eee6be34f8df84ab389988a0.svg)}.flag-icon-mu{background-image:url(/assets/flags/4x3/mu-d0d2fd85209d5ca5b9f90da3947f3142b96ae688536ed796f2bc912aef84c333.svg)}.flag-icon-mu.flag-icon-squared{background-image:url(/assets/flags/1x1/mu-3e18fa9a066e02636f5a119d445b4f0439c8b75bae4e2999c17a6105bb95bd5a.svg)}.flag-icon-mv{background-image:url(/assets/flags/4x3/mv-595fccd022d985bf319bfee09ded164593e8206c364adc1fa3abbc68450c516a.svg)}.flag-icon-mv.flag-icon-squared{background-image:url(/assets/flags/1x1/mv-ba59c37e1fcf099ca68e7fa68fc30d5e75c4171aad18be54126fd214a0b0b6b5.svg)}.flag-icon-mw{background-image:url(/assets/flags/4x3/mw-67c2a39590afb916054063262e67293e303a264b9f9219767c13feb988f47212.svg)}.flag-icon-mw.flag-icon-squared{background-image:url(/assets/flags/1x1/mw-b82e28e3e51b467c8db86b1dd9cae837204255320928eb5e5f6b8536c7b1b28e.svg)}.flag-icon-mx{background-image:url(/assets/flags/4x3/mx-416fe6de02b7d9dfc0e479454d06fa7701631bf848c888365bc56978ea524bc5.svg)}.flag-icon-mx.flag-icon-squared{background-image:url(/assets/flags/1x1/mx-b9461685b2714abb039fbd65510729f7ab324940045465b1c74666721d721f7d.svg)}.flag-icon-my{background-image:url(/assets/flags/4x3/my-c0f21e9c6679e1ae455392ded0b9e5d8aad5f5ee79589634ac89d88f0c548060.svg)}.flag-icon-my.flag-icon-squared{background-image:url(/assets/flags/1x1/my-868a1feec94ccf789db1040a953f25d3982056514195dcd961ff2d6b51b04431.svg)}.flag-icon-mz{background-image:url(/assets/flags/4x3/mz-0c06b80f82ab675854d23444740910298f4b8e82b929112dbec4e1927342120f.svg)}.flag-icon-mz.flag-icon-squared{background-image:url(/assets/flags/1x1/mz-09a8632f1d20d400401b944af3c4b13e5d64052466bf9a59f6d2927d188150da.svg)}.flag-icon-na{background-image:url(/assets/flags/4x3/na-43a5f5934fc004e64eadcfb7675114ed1eab3b7f1e9153886edb0b69e7581ce2.svg)}.flag-icon-na.flag-icon-squared{background-image:url(/assets/flags/1x1/na-549c5971f5c2a771c83113a4f9b7a9b5e69546d855e92559b49d6772ff6d3e82.svg)}.flag-icon-nc{background-image:url(/assets/flags/4x3/nc-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg)}.flag-icon-nc.flag-icon-squared{background-image:url(/assets/flags/1x1/nc-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-ne{background-image:url(/assets/flags/4x3/ne-3be65335a772b7ba2c8916d0d60f12ed4cc2aebc302151ea23ced9c9a3c38ed4.svg)}.flag-icon-ne.flag-icon-squared{background-image:url(/assets/flags/1x1/ne-783c25c63f68afe3c462b326b7faec7cc1493f6a4c140bc62fd524604de09d27.svg)}.flag-icon-nf{background-image:url(/assets/flags/4x3/nf-6ff37be9a0581fec55eef9e9871aa0d76d61c44007445184712ec6df3a04208a.svg)}.flag-icon-nf.flag-icon-squared{background-image:url(/assets/flags/1x1/nf-2f25b6485f62ce38b25bc9f6428d3e0dc0043d71221eac1f4c3d71bca91c2ea6.svg)}.flag-icon-ng{background-image:url(/assets/flags/4x3/ng-22aaf5a93f277f26cbfb21f7b141476fc8853298cf423fe5c849f87c2813d4e1.svg)}.flag-icon-ng.flag-icon-squared{background-image:url(/assets/flags/1x1/ng-8753476807ab9e0c201397dbe6a884155d97e8766667d10071650d64fe277fb0.svg)}.flag-icon-ni{background-image:url(/assets/flags/4x3/ni-295d07e91f9417b2ca8c7c918481874a7da7f9ac25035edf3a8d1d79b1230e32.svg)}.flag-icon-ni.flag-icon-squared{background-image:url(/assets/flags/1x1/ni-6786ef719864e51745934adc319ed0ed95fca75687ee6050d580435ee3f2b236.svg)}.flag-icon-nl{background-image:url(/assets/flags/4x3/nl-8f7bff63589346e93733c01f1f18c5a11e8c94911253bcf852f173a933cd928e.svg)}.flag-icon-nl.flag-icon-squared{background-image:url(/assets/flags/1x1/nl-f46400354e3d489228eca5944d9e181114fe1f748fa22ac0a70fd06c557bec92.svg)}.flag-icon-no{background-image:url(/assets/flags/4x3/no-ecdb24f870c1e6777529ec85e3ea8d989a75b5874ecde94fead0218f7c1b5605.svg)}.flag-icon-no.flag-icon-squared{background-image:url(/assets/flags/1x1/no-47a12b11ae8b0aca7f7e3d9084e9d3a6c0ef1ad979d22ba9258e6f9ddc3ab16a.svg)}.flag-icon-np{background-image:url(/assets/flags/4x3/np-b32c3bad572c4f27b5eee9c1ca97a5f2ca1c2a5b720b67fd636c91064e5fbdd9.svg)}.flag-icon-np.flag-icon-squared{background-image:url(/assets/flags/1x1/np-1279e1d699c05de413b30172b7ed97c13bfaa2069abe788ecf8b127210778354.svg)}.flag-icon-nr{background-image:url(/assets/flags/4x3/nr-3818437e2251e1f7310734098d13e2eee69a6b9cc310918d3287b345618e6fef.svg)}.flag-icon-nr.flag-icon-squared{background-image:url(/assets/flags/1x1/nr-9b9edbaf4e09989f53511c969520cc2c10f3a693cdb80441b2aeabff30ebb381.svg)}.flag-icon-nu{background-image:url(/assets/flags/4x3/nu-3b27eef18754c7fb8def8deadc730f074b090c8b6e9101d008d529c1d8784e5e.svg)}.flag-icon-nu.flag-icon-squared{background-image:url(/assets/flags/1x1/nu-9f6f9a41e36004711e3ad2e31e3d0425ca698bf242a62b9665b6f41eeb999ac7.svg)}.flag-icon-nz{background-image:url(/assets/flags/4x3/nz-9690c3a7cdea4d5d6b88546ad69244a772fd0649e75f6334695fce89f5c4f076.svg)}.flag-icon-nz.flag-icon-squared{background-image:url(/assets/flags/1x1/nz-e848215aaf4f9d5738b886ded97ff13b69c752888a27d1ac430116f7133a1c0e.svg)}.flag-icon-om{background-image:url(/assets/flags/4x3/om-7b9135ecdcf42a3bb69c5bf685930d32f9be7c6daaf58d5a8d154e22b6079347.svg)}.flag-icon-om.flag-icon-squared{background-image:url(/assets/flags/1x1/om-665da86c6b715f3d5f36bba0e01539e574d7871437b03ecbe29a92e5e703e09a.svg)}.flag-icon-pa{background-image:url(/assets/flags/4x3/pa-a5b55e50a411899195a8f2bf8f37bddd94a4436582568c9ddfbddc2c99d1ae2d.svg)}.flag-icon-pa.flag-icon-squared{background-image:url(/assets/flags/1x1/pa-6c5566a7ace4125d958ec45ade8ce61e2fc065bb7fdd99cf1d6988a01b6fa73a.svg)}.flag-icon-pe{background-image:url(/assets/flags/4x3/pe-12966232fe9a3dcc296389dea282cc8aa400327298d25f2f01c4963d1b900d13.svg)}.flag-icon-pe.flag-icon-squared{background-image:url(/assets/flags/1x1/pe-449b3363ff9efe701e1f662ae71c31bb4b5952710b73346e2ae090a90c79488d.svg)}.flag-icon-pf{background-image:url(/assets/flags/4x3/pf-db568d96a25e93ea2d51edb9ccb8a0ba15bbe46e1241e1bb4376a856290de4e8.svg)}.flag-icon-pf.flag-icon-squared{background-image:url(/assets/flags/1x1/pf-d6aacd56a7243b922bbbd26c94696f19a3dd242df5e5ede999e0319930bf8d64.svg)}.flag-icon-pg{background-image:url(/assets/flags/4x3/pg-def242bd4b12703b11ddc016962c0ab5ac2252e6afb53647281af0ddf72b08b2.svg)}.flag-icon-pg.flag-icon-squared{background-image:url(/assets/flags/1x1/pg-0f89210b4effa3e2f248e9d22710191ec8a5f8cc00e24e7a493fcf6013af6985.svg)}.flag-icon-ph{background-image:url(/assets/flags/4x3/ph-76da2cb2822b71a1e7f182cfe2b8744af8704640feceb476aadf1753611c124c.svg)}.flag-icon-ph.flag-icon-squared{background-image:url(/assets/flags/1x1/ph-896fe211ebf65c4aec42a1f115ad43894870bc661eb9f32fd97962f0c6a8b666.svg)}.flag-icon-pk{background-image:url(/assets/flags/4x3/pk-d0f9243f586c99692f7d7d18a648095badef0c11bd98645924771c71283f6a51.svg)}.flag-icon-pk.flag-icon-squared{background-image:url(/assets/flags/1x1/pk-c32541b10dabe01538a811d9e1b600b91b1724239fe99325bc1156c4183127d9.svg)}.flag-icon-pl{background-image:url(/assets/flags/4x3/pl-0fc0d2ef9f5b48e43bd93818263cc504c825346f09a73d22c6f84dcde8d651af.svg)}.flag-icon-pl.flag-icon-squared{background-image:url(/assets/flags/1x1/pl-44281da3343d3308aaa29a9e7d060a24b8d5bb949d07197e3771aa30793f5ffe.svg)}.flag-icon-pm{background-image:url(/assets/flags/4x3/pm-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg)}.flag-icon-pm.flag-icon-squared{background-image:url(/assets/flags/1x1/pm-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-pn{background-image:url(/assets/flags/4x3/pn-b9639507463a2e238b7d0f4cd976455ad4108594cc526882ed83807c321ca6b8.svg)}.flag-icon-pn.flag-icon-squared{background-image:url(/assets/flags/1x1/pn-23189e2aa8792ba5d7bbfba6f21467ec9516f9b366ddddce193a7f26ddc18030.svg)}.flag-icon-pr{background-image:url(/assets/flags/4x3/pr-3194786def8e2510554b4d46d2ac49a10bfd1fb26f0d6803864b5982b36c12bb.svg)}.flag-icon-pr.flag-icon-squared{background-image:url(/assets/flags/1x1/pr-fb6e6e3064fc00cb41a3752358ba09e006375d6139ed63a13e6b81b4c8c53511.svg)}.flag-icon-ps{background-image:url(/assets/flags/4x3/ps-e75b0d2d81c169c45624faf1f51ed1b9bf9b7945d71ceddac505c464f47c639a.svg)}.flag-icon-ps.flag-icon-squared{background-image:url(/assets/flags/1x1/ps-5e45e6b195fa5aa5b3c8bdff0824ef3fb354d4f1d5a1a5c4d92a9d67a568db3b.svg)}.flag-icon-pt{background-image:url(/assets/flags/4x3/pt-7056421a09bf65c1e96a0891db8b1d37b9ece7b39a7a8ecdfcbc837d0f773cfa.svg)}.flag-icon-pt.flag-icon-squared{background-image:url(/assets/flags/1x1/pt-4f2b0e37162ed4d197eb28886933009600109e827ac83664f57f3683adc9617a.svg)}.flag-icon-pw{background-image:url(/assets/flags/4x3/pw-8991b8ae2bef2f0e81e79442947f1c68f843be48f652a4c3a2af5dab84d73170.svg)}.flag-icon-pw.flag-icon-squared{background-image:url(/assets/flags/1x1/pw-4c45576b7f0be5b37d463d126410bfbca0f9dcdd1539fc6866f9fc116baa3437.svg)}.flag-icon-py{background-image:url(/assets/flags/4x3/py-c416c19abcc7629572203f00253c9272876e59a88eafa893fa4a534ed8977776.svg)}.flag-icon-py.flag-icon-squared{background-image:url(/assets/flags/1x1/py-adb6cfc575e9626cd8284964929c88830d0d6f7e5b0c135649eceb8bd9de1368.svg)}.flag-icon-qa{background-image:url(/assets/flags/4x3/qa-821f667f3f99992cf08b05498cc1a0769dee9c4e36d2a2561d6cf7827255af1b.svg)}.flag-icon-qa.flag-icon-squared{background-image:url(/assets/flags/1x1/qa-b05242965c0835a82add68dbcfb4523bc5e53e191803eab2c0c8c8762f2fce80.svg)}.flag-icon-re{background-image:url(/assets/flags/4x3/re-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg)}.flag-icon-re.flag-icon-squared{background-image:url(/assets/flags/1x1/re-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-ro{background-image:url(/assets/flags/4x3/ro-63c55736a245e5fa5e0484b4693d43e171941143fcbdb34d3aa8d4cfd6160c9d.svg)}.flag-icon-ro.flag-icon-squared{background-image:url(/assets/flags/1x1/ro-f5c83b26832bb94b4320340ada4351a695bff66bb1410f6007c87e8395290380.svg)}.flag-icon-rs{background-image:url(/assets/flags/4x3/rs-a1bff9944ac65bce131f42964a45cfce50e334c6d52eeeea65f5f6179f8acf4d.svg)}.flag-icon-rs.flag-icon-squared{background-image:url(/assets/flags/1x1/rs-6af7605aa8aee1da6e0a75c750964b21b404011cd00f2df43ae55a827952251a.svg)}.flag-icon-ru{background-image:url(/assets/flags/4x3/ru-2ba8996aa53f5eca5d1b0ea1a67d6d469659ac2523d1b394e3d6e25913bbbc15.svg)}.flag-icon-ru.flag-icon-squared{background-image:url(/assets/flags/1x1/ru-c8ecec77af983cd6ca10baaf2fa8f3dd67a6fa84f80cabdee10858910fdcc233.svg)}.flag-icon-rw{background-image:url(/assets/flags/4x3/rw-0fa2c78359e9603d1cf21e4bb9355414ac3eed3635a25ba8f653d0498d61bd16.svg)}.flag-icon-rw.flag-icon-squared{background-image:url(/assets/flags/1x1/rw-61cce3e871326334478d73a379b202fc8548581abc02e39a898bc4fd16b2e0eb.svg)}.flag-icon-sa{background-image:url(/assets/flags/4x3/sa-5aec890788f78356a42e38fe6ea2c30c4c82c99a3f05f654faae5918aae804c4.svg)}.flag-icon-sa.flag-icon-squared{background-image:url(/assets/flags/1x1/sa-57bf549298c1c3cb533120975d49b6cdb9c839addf278497d133236e666239f4.svg)}.flag-icon-sb{background-image:url(/assets/flags/4x3/sb-3433de16f2b3f2a8373de87f879dd3b31ec8369256e23193947318976b51a182.svg)}.flag-icon-sb.flag-icon-squared{background-image:url(/assets/flags/1x1/sb-e5352ddacf8edb727ef8f68dbb0951f00ae84b96e9b3b224cdf0c3ee2d33e8db.svg)}.flag-icon-sc{background-image:url(/assets/flags/4x3/sc-9c1764a913e0577cadb24d11b883978389a818e94b39f6ac5cf4993dd041d501.svg)}.flag-icon-sc.flag-icon-squared{background-image:url(/assets/flags/1x1/sc-c1abe18095ce0b84c2b21aa2453b916e00d8c0fd72fd5161f212e6bcf9c8ccd8.svg)}.flag-icon-sd{background-image:url(/assets/flags/4x3/sd-df15037b269e643062988e5273f3cd5a379b18d0ff496bdac97e840deb0793bc.svg)}.flag-icon-sd.flag-icon-squared{background-image:url(/assets/flags/1x1/sd-baedc80da37d70ce8fa4d5619d85b4823435180311f0c2995717116e681c20d3.svg)}.flag-icon-se{background-image:url(/assets/flags/4x3/se-73964261d5ec45c856c9f7b57f1be90f60c5e748596e494aafa5facd817c7118.svg)}.flag-icon-se.flag-icon-squared{background-image:url(/assets/flags/1x1/se-ea6d6caac7db4cfc8d68548f70afbf6ddbf072993e655bdb0b0860f724202e2b.svg)}.flag-icon-sg{background-image:url(/assets/flags/4x3/sg-2c8851a3c456051d7510b78da650054ee411ecdb01508ab3aa8ddac220de984a.svg)}.flag-icon-sg.flag-icon-squared{background-image:url(/assets/flags/1x1/sg-81517add5de364935b2173fd1ed3db2fefc22e07a072d03fd4f91e8543ffcb22.svg)}.flag-icon-sh{background-image:url(/assets/flags/4x3/sh-cdfa61ab262caf8d6b13cc66f1d0e1e935dadb144d93ad28fcd850e9164c33d9.svg)}.flag-icon-sh.flag-icon-squared{background-image:url(/assets/flags/1x1/sh-763ae01f8c0189641321a0de1085f0d1ceeb962d94bb989c6255dae4616fd14f.svg)}.flag-icon-si{background-image:url(/assets/flags/4x3/si-81f600f18fae95b3e2a6813cc012e94bdfd67965eb7ce1676780bc7d04f4f203.svg)}.flag-icon-si.flag-icon-squared{background-image:url(/assets/flags/1x1/si-6481bc748939a46efccac3df22ccc34341cc006d871a7ff521769c562a5325df.svg)}.flag-icon-sj{background-image:url(/assets/flags/4x3/sj-8c78bb614796386f416c677e7ee2984c9997d0789306a9861e0d3f85edf62608.svg)}.flag-icon-sj.flag-icon-squared{background-image:url(/assets/flags/1x1/sj-15448521086e54b5dc1b51bce3e8424a3282aaa539514a8d63fae537d400bc08.svg)}.flag-icon-sk{background-image:url(/assets/flags/4x3/sk-271dd9219a226c5e9768072c3d0512b9ab07d1af59a3a5642eba620e3f53ea2c.svg)}.flag-icon-sk.flag-icon-squared{background-image:url(/assets/flags/1x1/sk-4ee51ed995ad80a8f9a335b5f36b00a830da6e7065ecda1e84e427cf19dda736.svg)}.flag-icon-sl{background-image:url(/assets/flags/4x3/sl-3fd8765025c44c215906c9d33be69326118f5025b35a93636df059926053c84c.svg)}.flag-icon-sl.flag-icon-squared{background-image:url(/assets/flags/1x1/sl-ffbed472a2b3677e9339adfd150ffc76bbae85071cbf1b14f75c67b03fff29d8.svg)}.flag-icon-sm{background-image:url(/assets/flags/4x3/sm-72df25d7ba785caa3201dc9ea30349a5bd3891de99e6d818bff2f34914264654.svg)}.flag-icon-sm.flag-icon-squared{background-image:url(/assets/flags/1x1/sm-afa36059e43d3014dfc9088d30e86449b8463d282611b99f8d496aca155075c2.svg)}.flag-icon-sn{background-image:url(/assets/flags/4x3/sn-3465e8417cd4bd6d948ab2311442757688af8516c6aa7c4f73c48a9447087b8c.svg)}.flag-icon-sn.flag-icon-squared{background-image:url(/assets/flags/1x1/sn-dfbe30abf15b2937f1b2de375b832ef3fe11e78f3536df35232b2f7265c00d9e.svg)}.flag-icon-so{background-image:url(/assets/flags/4x3/so-16f7af15587913f17fd988f914c55de175ed1d4b2282ba2fa52b414c7359b440.svg)}.flag-icon-so.flag-icon-squared{background-image:url(/assets/flags/1x1/so-bbf08e60fbda4e45791d985450f6dbcd9ea779f93c818973271845dd01fc8df6.svg)}.flag-icon-sr{background-image:url(/assets/flags/4x3/sr-7718ec6fbe85ea55c72189bf0dc94b10f20a7948ab913903e5b8050af20e4f6f.svg)}.flag-icon-sr.flag-icon-squared{background-image:url(/assets/flags/1x1/sr-692dfcca46c35b618f0358ef0cc9b2ee7c27c839f98b12134318804f6498ceee.svg)}.flag-icon-ss{background-image:url(/assets/flags/4x3/ss-aebe3fc1b10d93add9906690e262b1baf5338529a832ff954e329c897e014e9c.svg)}.flag-icon-ss.flag-icon-squared{background-image:url(/assets/flags/1x1/ss-1d0ebcb31f2c0fe874bd046253de4eec410239c2e0f41eb1cea1f312b51bc8a8.svg)}.flag-icon-st{background-image:url(/assets/flags/4x3/st-b24fa19cb51844a3187239e3cbacf828f02e7b8ddf4b01e9ec3366e75966c5d6.svg)}.flag-icon-st.flag-icon-squared{background-image:url(/assets/flags/1x1/st-d4d96bc9009e10cec6a00ce0d6fae3746ddefce867f63503595110b2fd539d17.svg)}.flag-icon-sv{background-image:url(/assets/flags/4x3/sv-cd0c1acd571abd1756fc4e7eea2369c0466265b1d170a7a3618a66800ddbb4c2.svg)}.flag-icon-sv.flag-icon-squared{background-image:url(/assets/flags/1x1/sv-e86857616aaa7fc022b68dafd4a58d4be7ddfcc6d5b2c3d5dad67b457d1e75c9.svg)}.flag-icon-sx{background-image:url(/assets/flags/4x3/sx-7ed9e6d8c02b265181248986ccd927f6540a7d55b4ec82b60baef06face66ee1.svg)}.flag-icon-sx.flag-icon-squared{background-image:url(/assets/flags/1x1/sx-09ab7415791d37231c9fb79b51fc52583407d7721e6f401cc98fc1ab12d2b62d.svg)}.flag-icon-sy{background-image:url(/assets/flags/4x3/sy-49bb1803affb9e4ee070fb6e333a445f6df15ac11db6abe0a62f1aa922fe3c16.svg)}.flag-icon-sy.flag-icon-squared{background-image:url(/assets/flags/1x1/sy-b52b5ed6037c8e0e0a3ecd13006b79027d5fac2059fdd54109b591e5c5ada752.svg)}.flag-icon-sz{background-image:url(/assets/flags/4x3/sz-a545e703e03ec7f9e108fa348d9e222aba1d7514bad2786f9ca8c6c3063a0e68.svg)}.flag-icon-sz.flag-icon-squared{background-image:url(/assets/flags/1x1/sz-784ee11c6629bc411d3e274eea68a3739ddfaa4c3bd18e46e62262518ae0b93e.svg)}.flag-icon-tc{background-image:url(/assets/flags/4x3/tc-a20d2d87632b3c19e16a599dd45f3918a5f2db3025867c5f1b279050af68f637.svg)}.flag-icon-tc.flag-icon-squared{background-image:url(/assets/flags/1x1/tc-4c7c0e4227d06fb697b8c5ec5f95382b1549342013ea80211f2942f81d472d5a.svg)}.flag-icon-td{background-image:url(/assets/flags/4x3/td-1b92327abb7d3ba9b54361f6a38018979e57d5083990af57adac25102146b939.svg)}.flag-icon-td.flag-icon-squared{background-image:url(/assets/flags/1x1/td-977813c5dfc3b6b640d1390c04c469cf92e84827ca06ed7f4984a58782a059c5.svg)}.flag-icon-tf{background-image:url(/assets/flags/4x3/tf-f45e133cfa8a01239d65e1693492ca1de1949f3660de77d802b41c9a9fc662e8.svg)}.flag-icon-tf.flag-icon-squared{background-image:url(/assets/flags/1x1/tf-53581d6af7751cf4c126459a2226fd19cd10040d25e33d1653ece9e57a1a0e2b.svg)}.flag-icon-tg{background-image:url(/assets/flags/4x3/tg-de9fe13020d702ce964ff7d712c6b6a3a57c3933f56fbd0c783fe0309f0dbae3.svg)}.flag-icon-tg.flag-icon-squared{background-image:url(/assets/flags/1x1/tg-92f575529494b0ba885e47302167a14343c1fd78fef5008ec3aacde7f840fd23.svg)}.flag-icon-th{background-image:url(/assets/flags/4x3/th-6211c6caabbc4fdd4ff054cb689406bc9cc7816c01d482a6222e873b0e8fc9b0.svg)}.flag-icon-th.flag-icon-squared{background-image:url(/assets/flags/1x1/th-b8a0cf7c820f9010ce12333bfa7f8713358dee291bc955fa7e5333fcf5fc8a07.svg)}.flag-icon-tj{background-image:url(/assets/flags/4x3/tj-4bf387aa434be996fc00be6dbb457282e311ff6c7538a484f5cb4d99e45b0747.svg)}.flag-icon-tj.flag-icon-squared{background-image:url(/assets/flags/1x1/tj-b371ab0647e7dfba73251169fe1e3180058d6556aa7293b7b573eaf43add617d.svg)}.flag-icon-tk{background-image:url(/assets/flags/4x3/tk-cef6e368398b0cbaa4ee0b943d02155c51f9e8ab5ba27b9562ccd629f9a72183.svg)}.flag-icon-tk.flag-icon-squared{background-image:url(/assets/flags/1x1/tk-1544aef42090102ba2e154b48f8c059dfddd5789fc5f12aa859939c41673a661.svg)}.flag-icon-tl{background-image:url(/assets/flags/4x3/tl-cd74f59871cf5453b4e9454a4820e683c06dc8c9c84dae4c47af9264bed7ab22.svg)}.flag-icon-tl.flag-icon-squared{background-image:url(/assets/flags/1x1/tl-a7cd9977244579380914f288bf358ec8b1b0abec6b8dc99e65cc35afe41bc405.svg)}.flag-icon-tm{background-image:url(/assets/flags/4x3/tm-3db83810be6239a1c7e594a0b11a4847a7d300cc54e12e4cf4c8a9558520dd67.svg)}.flag-icon-tm.flag-icon-squared{background-image:url(/assets/flags/1x1/tm-ade1696d2299d73cc6fa06304144055f9a02c1800846516c4e21baba2a05d4cf.svg)}.flag-icon-tn{background-image:url(/assets/flags/4x3/tn-17e7bc4e9dad2da8f12c95c56de46b21890b9d1c725ba400fa7d8df17d59fd4d.svg)}.flag-icon-tn.flag-icon-squared{background-image:url(/assets/flags/1x1/tn-55604ef719cd538ba0e2541667d4c52b08f18efe91bb52ad0954802d38ea12f7.svg)}.flag-icon-to{background-image:url(/assets/flags/4x3/to-db07012009b9d6ac0c8eca209a68c310d9371771cca8c6c4c2022b3db1ba39d9.svg)}.flag-icon-to.flag-icon-squared{background-image:url(/assets/flags/1x1/to-1ed20c5d05424776b5d3cc17487ed8311998cb69db89109a380d59722d4bc2bc.svg)}.flag-icon-tr{background-image:url(/assets/flags/4x3/tr-b8b3b6850c4c0ffa840db30c814dce6cb86e00e78138bafe8c2c58d263fb4503.svg)}.flag-icon-tr.flag-icon-squared{background-image:url(/assets/flags/1x1/tr-be0c612d78c2662c4e9c0dc836b63c8a7a5cfff48afc533f81c2ba2423542f5e.svg)}.flag-icon-tt{background-image:url(/assets/flags/4x3/tt-05d9799b6519267990dccbc997c620c6478e00a96a79841494707cc3d036a381.svg)}.flag-icon-tt.flag-icon-squared{background-image:url(/assets/flags/1x1/tt-4ab2fff1efee93f41060975098c5c11e043dc0853456c8c0c70cacd4ba92e8ed.svg)}.flag-icon-tv{background-image:url(/assets/flags/4x3/tv-14be4bb5a1fe44a8d3d58bde3dca6c63ed2974554c2008b4a2441a096c9f1fea.svg)}.flag-icon-tv.flag-icon-squared{background-image:url(/assets/flags/1x1/tv-71e98b9502d12d655a169e8c89de6d5b2fcc957d67d0b7e93dd2be8ff9e6f2a8.svg)}.flag-icon-tw{background-image:url(/assets/flags/4x3/tw-3b699e4e60f9765601c0f84bbf3f16f953f5a454a0cf62487a0eef358f456e66.svg)}.flag-icon-tw.flag-icon-squared{background-image:url(/assets/flags/1x1/tw-62cd36c5fc2aff70bbd11312601821ca09729e9e246e32d895e0f4a2017ac0b6.svg)}.flag-icon-tz{background-image:url(/assets/flags/4x3/tz-f219bcd0e3536ea3653178e0281620ebfe4c5b3b461c2c79fdf2b2a852de372e.svg)}.flag-icon-tz.flag-icon-squared{background-image:url(/assets/flags/1x1/tz-2829d5fc4fcdf2e6a149f63ea6b5a5f1af7b6b08fec523ec217ab5a6d9fb7e77.svg)}.flag-icon-ua{background-image:url(/assets/flags/4x3/ua-07199c03990a6b4f285e421d928ab4dba2dfdfdb3e40dd9bfa207c86bc0f3c9d.svg)}.flag-icon-ua.flag-icon-squared{background-image:url(/assets/flags/1x1/ua-7c939efc452c13b0f8f489f3dfd37d3eba97c0f577c97f0b6673968af62a3207.svg)}.flag-icon-ug{background-image:url(/assets/flags/4x3/ug-48c6cbeae1a865915dd5a06f56bdd576e9ed9ce5085b627ef31f3757c0937a5d.svg)}.flag-icon-ug.flag-icon-squared{background-image:url(/assets/flags/1x1/ug-da6257aa7e40121a6e8e574bf201701910bbd838cbc8d76030397c0f34ae906b.svg)}.flag-icon-um{background-image:url(/assets/flags/4x3/um-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg)}.flag-icon-um.flag-icon-squared{background-image:url(/assets/flags/1x1/um-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg)}.flag-icon-us{background-image:url(/assets/flags/4x3/us-6d053f4d6e1412745749fc8d981833d6d7f8f19b72042d1a65e3356ca29a7ef7.svg)}.flag-icon-us.flag-icon-squared{background-image:url(/assets/flags/1x1/us-5bcf5d41aa6d5fdbfc920a014fc77d6cdbdf37bdb4e67dbfe68ed161bae4a435.svg)}.flag-icon-uy{background-image:url(/assets/flags/4x3/uy-3fc569672f687b4f08581179bea609b616d4b5c7d9524df918134fbcdfce6f9f.svg)}.flag-icon-uy.flag-icon-squared{background-image:url(/assets/flags/1x1/uy-90def9dd4890c96d1b6355d0bbcebe2a6f25e2bb3bbdc29c4fbba8a5fc601254.svg)}.flag-icon-uz{background-image:url(/assets/flags/4x3/uz-e3f628aff038df64725d75a863bc636ae9da4a16f58850ad86470cc012e3a40f.svg)}.flag-icon-uz.flag-icon-squared{background-image:url(/assets/flags/1x1/uz-db8cba32635e9c36565f28fbd6b17e1e5afe26ce0af8560eeda3f9d815ecc749.svg)}.flag-icon-va{background-image:url(/assets/flags/4x3/va-c8b81b061cbe7a9b0b5f376e10f1a863b4609c742dbb5663ef923b80d43984a2.svg)}.flag-icon-va.flag-icon-squared{background-image:url(/assets/flags/1x1/va-d267dbb1213d75780a8d41a34f9eba098a66973c1c2e7d974257f24b4be9df1c.svg)}.flag-icon-vc{background-image:url(/assets/flags/4x3/vc-a578edb2904169d050107b4c02051531e4164120c4ac0ad19faabd41fccdd821.svg)}.flag-icon-vc.flag-icon-squared{background-image:url(/assets/flags/1x1/vc-85bbaa2c82ed6a9e077e73501bbf071956c761a897d1c4e1bbe061ad5ca9c0ed.svg)}.flag-icon-ve{background-image:url(/assets/flags/4x3/ve-77718854ace7f0a8d8a087e331112e4b20f76e9ca7eeb9af41bacccef09bc9b4.svg)}.flag-icon-ve.flag-icon-squared{background-image:url(/assets/flags/1x1/ve-27cf5f75e9b842c417f62e3c3c502acafb67db674d5a1eba8709371c186f0fe9.svg)}.flag-icon-vg{background-image:url(/assets/flags/4x3/vg-cefdd08a49ab6cf0ce32bf42cb7a72513dfd0a1619bac86ebedee3a86fa35c80.svg)}.flag-icon-vg.flag-icon-squared{background-image:url(/assets/flags/1x1/vg-45357a28f1dc16c13df5cfc44454ff28f082b90a4747898d27575650bc93cb1e.svg)}.flag-icon-vi{background-image:url(/assets/flags/4x3/vi-a83bcb200832191afa4091bf2c275289aa37f664027dfce6db6b0f7109fe3b6a.svg)}.flag-icon-vi.flag-icon-squared{background-image:url(/assets/flags/1x1/vi-cf017aea4123b31f1cf60087c4742b6d57a4213bece5b3f760e16a84a811a74c.svg)}.flag-icon-vn{background-image:url(/assets/flags/4x3/vn-16730ca8238b081b7376fc3829eaac4ddd61a5b423c24c9f07c9a02848c4827f.svg)}.flag-icon-vn.flag-icon-squared{background-image:url(/assets/flags/1x1/vn-fa15ba0b7d997046ffb7f2469f1254f7119503f2e95b35467151a947ff9b45d6.svg)}.flag-icon-vu{background-image:url(/assets/flags/4x3/vu-4e084d69e403d0af11dfc47f622fb2ba88649b17b2038f6ebf533ce3c9907404.svg)}.flag-icon-vu.flag-icon-squared{background-image:url(/assets/flags/1x1/vu-3c93d045c0ec3c08c0e9af785016995cbd7a28ddf08ec9abfce0e39c4e842058.svg)}.flag-icon-wf{background-image:url(/assets/flags/4x3/wf-039b39c2ab1d92470427e12e2310b2ad9d8a97a36a064b197858a083f5d7fd23.svg)}.flag-icon-wf.flag-icon-squared{background-image:url(/assets/flags/1x1/wf-94672c2e6f10547f0023b9f0fff3adfda4d60f91340f287767f1ce68e5a57a12.svg)}.flag-icon-ws{background-image:url(/assets/flags/4x3/ws-f91aa288555a505b3e965c781de8207e2cb6e1d165603c80c54cfb111d277874.svg)}.flag-icon-ws.flag-icon-squared{background-image:url(/assets/flags/1x1/ws-e6b2a35c9702941a1fe9d84ab2bf8b28b4931b6fce24efb4ce63d3a8fb8c3b90.svg)}.flag-icon-ye{background-image:url(/assets/flags/4x3/ye-f3c80f7f99e1f12a079fe0d96830005657aff1687da92391c0acb882b014ff8c.svg)}.flag-icon-ye.flag-icon-squared{background-image:url(/assets/flags/1x1/ye-a9b9b54ec295aed99c5439093242110193626524d336cc3115864e5ec0b787da.svg)}.flag-icon-yt{background-image:url(/assets/flags/4x3/yt-6f91d266c0c965f2340ea49a958bfc7445d76dd9abf7095091543cd8dafe0554.svg)}.flag-icon-yt.flag-icon-squared{background-image:url(/assets/flags/1x1/yt-ffec76f7c40ad72aa9f7d2ebbaabeb8eaf85984528d988b016c7224db8522da9.svg)}.flag-icon-za{background-image:url(/assets/flags/4x3/za-57f1167ce07b3f345798c69ca8f159cb159f5dccb3c101616cc007ef1f2663d6.svg)}.flag-icon-za.flag-icon-squared{background-image:url(/assets/flags/1x1/za-79fe7bd792f8b520caaa2c3db12ab5138cf24867d344a38167580ab6243322b1.svg)}.flag-icon-zm{background-image:url(/assets/flags/4x3/zm-9a1622c4151a7379ecc32434948be48ba5af564e136232d1eb6e2a4dfec3baa9.svg)}.flag-icon-zm.flag-icon-squared{background-image:url(/assets/flags/1x1/zm-7bc0c09a0b3fd9f0dd01481080be99465d71218ac0679fbb077086f24835433e.svg)}.flag-icon-zw{background-image:url(/assets/flags/4x3/zw-2576570465c39038f092c242d89e300a0943c50c090c922bc3bd9c8af9161478.svg)}.flag-icon-zw.flag-icon-squared{background-image:url(/assets/flags/1x1/zw-4ee873fa4e174f8d150c672917c8f506b530edcca86288e4b7942c7c74a63caf.svg)}.flag-icon-eu{background-image:url(/assets/flags/4x3/eu-ca89dc2597154e6887930fd8bdf47636f82dc13c02d9610a3da2d156f09265d0.svg)}.flag-icon-eu.flag-icon-squared{background-image:url(/assets/flags/1x1/eu-73d6f1f646500e1dc04ca798c0d192f9174268e3480a8b1d742004919b7463f9.svg)}.flag-icon-gb-eng{background-image:url(/assets/flags/4x3/gb-eng-ec744a15618e0a99abee9e53b70985e4cbf2fc2b7051cf239d6dd19b302e4ae9.svg)}.flag-icon-gb-eng.flag-icon-squared{background-image:url(/assets/flags/1x1/gb-eng-b1650bba14f5fa14df73f964c3b3dfeca8e1d48c19f1f9b3fded729cc96cf39d.svg)}.flag-icon-gb-nir{background-image:url(/assets/flags/4x3/gb-nir-0a09e794313d063a01d817f3ae931054dc9baddd38cfb9a0e4b3c9fa5852bc41.svg)}.flag-icon-gb-nir.flag-icon-squared{background-image:url(/assets/flags/1x1/gb-nir-c54214991841f1e32a4aaee502c6a7bde3ec3b43c0e74886d9bc7112f652035a.svg)}.flag-icon-gb-sct{background-image:url(/assets/flags/4x3/gb-sct-c78f4e58aa162732c0a401eebe714a632ed03c5171a13bb98eb67365b338a0ab.svg)}.flag-icon-gb-sct.flag-icon-squared{background-image:url(/assets/flags/1x1/gb-sct-4983d57dfd37f55b40b22dddfeefef38d2113818914755ee830c61b97549aaf3.svg)}.flag-icon-gb-wls{background-image:url(/assets/flags/4x3/gb-wls-963f0b8dfe114a50032ae1db25542a12d2032a30d88bbfd4698e30f50e752e31.svg)}.flag-icon-gb-wls.flag-icon-squared{background-image:url(/assets/flags/1x1/gb-wls-7d5a4120e3e0f7618bde0d4270b0c097f18472e6b1a285918d11538fb001cb60.svg)}.flag-icon-un{background-image:url(/assets/flags/4x3/un-c75bef804cdbe6617032bfb0332f009c144b1317cb073e71deb5619fbedefcdb.svg)}.flag-icon-un.flag-icon-squared{background-image:url(/assets/flags/1x1/un-ccaaa4bfae7e430b8bd72ddfa6fb07f167c1001490fd247a37898f4632803b1e.svg)}.finePre,.city:after,span.label:after{margin-left:0.25em}.finePost{margin-right:0.25em}body.agendadescommuns{font-family:georgia, serif}body.agendadescommuns header.top{padding-left:120px;padding-right:120px;background-image:url(agendadescommuns.png);background-repeat:no-repeat;background-position:20px top}body.agendadescommuns header.top img.logo{display:none}body.agendadescommuns ul.countries,body.agendadescommuns form#orga_search,body.agendadescommuns a#banner{display:none}body.agendadescommuns .city{text-transform:uppercase}body.agendadescommuns.events.index table tr .day_number{color:#727070}body.agendadescommuns.events.index table tr td.current-month.past,body.agendadescommuns.events.index table tr td.current-month.past .day_number{color:#FFFAEB;background-color:#7494B5}body.agendadescommuns.events.index table tr td.current-month.today{border-color:#FFFAEB;background-color:#DBEDFF}body.agendadescommuns.events.index table tr td.current-month.future{color:#444;border-color:#EAE4D3;background-color:#F0E8D1}/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0");src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0#iefix") format("embedded-opentype"),url("/assets/font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2?v=4.7.0") format("woff2"),url("/assets/font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff?v=4.7.0") format("woff"),url("/assets/font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf?v=4.7.0") format("truetype"),url("/assets/font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:0.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.awesome-marker{background:url(/assets/markers-soft-e78784e4ed70aaffddd73c315fab590233cc4e7b72388d7dd47a14796fc7c739.png) no-repeat 0 0;width:35px;height:46px;position:absolute;left:0;top:0;display:block;text-align:center}.awesome-marker-shadow{background:url(/assets/markers-shadow-8703a2262710f5e3d29e65d2acdf90d6512e159e119d27b8234731d8a6208a20.png) no-repeat 0 0;width:36px;height:16px}@media (min--moz-device-pixel-ratio: 1.5), (-o-min-device-pixel-ratio: 3 / 2), (-webkit-min-device-pixel-ratio: 1.5), (min-device-pixel-ratio: 1.5), (min-resolution: 1.5dppx){.awesome-marker{background-image:url(/assets/markers-soft@2x-c1e77253a8bfbe30cec24885d7046f443b76ebb66f4c961f77083b03f4a5cbaf.png);background-size:720px 46px}.awesome-marker-shadow{background-image:url(/assets/markers-shadow@2x-b21a536be27313fb504f69f5899ff0b1245b276571769ac08d6c32c35676e47a.png);background-size:35px 16px}}.awesome-marker i{color:#333;margin-top:10px;display:inline-block;font-size:14px}.awesome-marker .icon-white{color:#fff}.awesome-marker-icon-red{background-position:0 0}.awesome-marker-icon-darkred{background-position:-180px 0}.awesome-marker-icon-lightred{background-position:-360px 0}.awesome-marker-icon-orange{background-position:-36px 0}.awesome-marker-icon-beige{background-position:-396px 0}.awesome-marker-icon-green{background-position:-72px 0}.awesome-marker-icon-darkgreen{background-position:-252px 0}.awesome-marker-icon-lightgreen{background-position:-432px 0}.awesome-marker-icon-blue{background-position:-108px 0}.awesome-marker-icon-darkblue{background-position:-216px 0}.awesome-marker-icon-lightblue{background-position:-468px 0}.awesome-marker-icon-purple{background-position:-144px 0}.awesome-marker-icon-darkpurple{background-position:-288px 0}.awesome-marker-icon-pink{background-position:-504px 0}.awesome-marker-icon-cadetblue{background-position:-324px 0}.awesome-marker-icon-white{background-position:-574px 0}.awesome-marker-icon-gray{background-position:-648px 0}.awesome-marker-icon-lightgray{background-position:-612px 0}.awesome-marker-icon-black{background-position:-682px 0}*{height:auto;padding:0;max-width:100%;box-sizing:border-box;margin-left:auto;margin-right:auto}html{color:black;height:100%;text-align:center;font-family:sans-serif;background-color:#9CC5EE}html.iframe{background-color:transparent}html.iframe body{border:none;margin:0;padding:0;background-color:transparent}html.iframe body>header,html.iframe body>footer,html.iframe body h2,html.iframe body nav,html.iframe body .region_filter,html.iframe body .orga_search,html.iframe body .formats,html.iframe body #banner{display:none}html.iframe body ul{margin:0}body{border:1px solid #68A6E5;margin:0.2%;padding:1%;position:relative;background-color:white}body header *,body main *,body footer *{transition-duration:0.5s}a:link,a:visited{color:#258;text-decoration:none}a:hover,a:active,a:focus{color:#2E97FF}#flash-messages .flash{color:white;border:solid 1px #007ba0;margin:1em auto;padding:0.5em 1.1em;max-width:50em;font-size:larger;text-align:justify;box-shadow:0 0 0.3em gray;border-radius:3px;background-color:#008cba}#flash-messages .flash.notice{border-color:#3a945b;background-color:#43ac6a}#flash-messages .flash.alert{border-color:#de2b0f;background-color:#f04124}h3.warning{color:white;margin:0;padding:1em;display:inline-block;text-align:center;background-color:orange;box-shadow:0 0 0.3em gray;border-radius:1em}header.top{text-align:left;margin-bottom:2em}header.top img.logo{float:left;margin-right:2%}header.top h1{margin-top:0;margin-bottom:0.2em}header.top h2{font-size:inherit;font-style:italic;font-weight:normal;margin-top:0}main,body.mce-content-body{position:relative}main h1,body.mce-content-body h1{margin:10px auto 5px auto;letter-spacing:2px}main h3,body.mce-content-body h3{text-align:left}main ul,main ol,body.mce-content-body ul,body.mce-content-body ol{text-align:left;padding-left:1em;list-style-position:inside}main p,body.mce-content-body p{text-align:left}main p.label,body.mce-content-body p.label{text-align:center}main p span.label:after,body.mce-content-body p span.label:after{content:":"}main hr,body.mce-content-body hr{margin:10px 20px}aside{float:right;width:16em;border:1px solid #96CFFF;margin:0 1.2em;z-index:10;padding:5px;position:relative;font-size:smaller;box-shadow:4px 4px 1em gray;margin-right:-4em;border-radius:1em;background-color:#D6ECFF}aside h1{font-weight:normal;border-bottom:1px black solid;padding-bottom:0.3em}aside h2{margin:0;font-size:larger}aside h2 a{padding:0.5em 0;display:block}fieldset{width:60em;border:none;margin:1em auto;padding:2%;box-shadow:1px 1px 5px gray;border-radius:0.4em}fieldset legend{color:#666;padding:0 1em;font-size:larger;background-color:white}fieldset h2{margin-top:0}footer.bottom nav{clear:both}footer.bottom nav a{padding:1.8%;display:inline-block;font-weight:bolder}footer.bottom nav a:hover{text-shadow:0 0 1em lightgray}#loading{top:45%;left:45%;color:gray;display:none;position:fixed;font-size:10vw;text-shadow:0 0 4px gray;vertical-align:baseline}.pagination span{display:none}.pagination span.next{display:block}body.digests main{padding:1em;max-width:60em;box-shadow:1px 1px 5px gray;border-radius:0.4em}body.digests main h2{margin:0;padding:0;font-size:larger;text-align:left}body.digests main .description p,body.digests main .second_part p{white-space:pre-line}body.digests main textarea{width:40em;height:20em}header.calendar-header{font-size:1.5em;margin-top:0.4em;font-weight:bolder}header.calendar-header a{font-weight:normal}header.calendar-header a:first-child,header.calendar-header a:last-child{margin:0 0.3em}em.locality.fa{color:gray}span.city:after,strong.city:after,em.city:after{content:":"}p.full_address span:after{content:","}p.full_address span:last-child:after{content:""}.calendar-header,.month{text-transform:capitalize}body.events.index table{width:100%;max-width:100%;table-layout:fixed}body.events.index table tr th{padding-bottom:0.35em;text-transform:capitalize}body.events.index table tr td{height:4.8em;border:1px solid #89B7E5;padding:1px;position:relative;vertical-align:top;background-color:#A1C3E7}body.events.index table tr td.past .event{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}body.events.index table tr td.today{border:1px solid #FFB578;background-color:#FFE0C7}body.events.index table tr td.today .day_number{color:#531}body.events.index table tr td.today .event a:link,body.events.index table tr td.today .event a:visited{color:#730}body.events.index table tr td.future{border-color:#96cfff;background-color:#C6E5FF}body.events.index table tr td.prev-month,body.events.index table tr td.next-month{border:none;background-color:#ededed}body.events.index table tr td.prev-month li,body.events.index table tr td.next-month li{color:#555}body.events.index table tr td.prev-month .event a:link,body.events.index table tr td.prev-month .event a:visited,body.events.index table tr td.next-month .event a:link,body.events.index table tr td.next-month .event a:visited{color:#444}body.events.index table tr td .day_number{float:left;color:#111;font-size:0.6em;font-weight:bolder;letter-spacing:2px}body.events.index table tr td:hover .day_number{color:black}body.events.index table tr td ul{clear:left;margin:0;padding:0}body.events.index table tr td ul li{color:#444;margin:0;padding:0}body.events.index table tr td ul li em.fa.fa-globe{color:red;font-size:smaller}body.events.index table tr td ul .event{padding-left:0.2em}body.events.index table tr td ul .event img{vertical-align:middle}body.events.index table tr td ul .event a:link,body.events.index table tr td ul .event a:visited{color:#111;font-size:smaller}body.events.index table tr td ul .event a:link:hover,body.events.index table tr td ul .event a:visited:hover{color:black;text-decoration:underline}.links{float:right}a#banner{float:left}body.events.show main,body.orgas.show main,body.tags.show main,body.pages main{padding:1em;max-width:60em;box-shadow:1px 1px 5px gray;border-radius:0.4em}body.events.show main h2,body.orgas.show main h2,body.tags.show main h2,body.pages main h2{margin-top:1em}#advises{border:1px solid #FFB578;padding-left:10px;padding-right:10px;margin-bottom:1.2em;background-color:#ffe0c7}#advises h1{font-size:1.9em;font-weight:normal}#advises a{color:#8F4900}.description img,body.mce-content-body img{margin-left:1%;margin-right:1%}article.event{box-shadow:-1em 1em 1em -1em gray;margin-left:1em;padding-left:1em;padding-bottom:0.4em;border-bottom-left-radius:1em}/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0");src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0#iefix") format("embedded-opentype"),url("/assets/font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2?v=4.7.0") format("woff2"),url("/assets/font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff?v=4.7.0") format("woff"),url("/assets/font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf?v=4.7.0") format("truetype"),url("/assets/font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:0.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}body.mce-content-body{margin:0;border:none;padding:1px 1%;font-size:inherit;min-height:100%}.mce-menubar,.mce-panel{border:none !important}.helper p{color:gray;text-align:right;margin-top:0;margin-bottom:0}.field{color:#666;border:none;display:flex;flex-wrap:wrap;box-shadow:0 0 2px darkgray;border-radius:4px}.field>label,.field .field_with_errors>label{width:10em;margin:0;padding:0.5em;text-align:right}.field input,.field textarea,.field .mce-tinymce,.field div.tagsinput,.field .field_with_errors:last-child{flex-grow:1}.field select{margin-left:0;margin-right:0}.field .field_with_errors:first-child{width:10em}.field .field_with_errors>*{width:100%;display:block}input,textarea,select,a.button,.actions>button,.mce-tinymce,div.tagsinput,.ui-autocomplete-input{border:solid 0.25em transparent;outline:none;padding:0.25em;font-size:inherit;font-family:inherit;background-color:transparent}input:focus,textarea:focus,select:focus,a.button:focus,.actions>button:focus,.mce-tinymce:focus,div.tagsinput:focus,.ui-autocomplete-input:focus{border-color:#F0F8FF}input[type=radio],textarea[type=radio],select[type=radio],a.button[type=radio],.actions>button[type=radio],.mce-tinymce[type=radio],div.tagsinput[type=radio],.ui-autocomplete-input[type=radio]{box-shadow:none}input[type=radio]+label,textarea[type=radio]+label,select[type=radio]+label,a.button[type=radio]+label,.actions>button[type=radio]+label,.mce-tinymce[type=radio]+label,div.tagsinput[type=radio]+label,.ui-autocomplete-input[type=radio]+label{border:none}input[type=submit],input.button,textarea[type=submit],textarea.button,select[type=submit],select.button,a.button[type=submit],a.button.button,.actions>button[type=submit],.actions>button.button,.mce-tinymce[type=submit],.mce-tinymce.button,div.tagsinput[type=submit],div.tagsinput.button,.ui-autocomplete-input[type=submit],.ui-autocomplete-input.button{cursor:pointer;margin:3px 0.4em;font-size:larger;box-shadow:0 0 2px darkgray;font-weight:bolder;letter-spacing:2px;background-color:#9CC5EE}.mce-tinymce{box-shadow:none !important}.mce-top-part:before{box-shadow:0 1px lightgray !important}.field_with_errors{display:inline}.field_with_errors input,.field_with_errors textarea,.field_with_errors select,.field_with_errors a.button{background-color:pink}.radios{margin-left:0}.radios [type=radio]{display:none}.radios label{color:#258;cursor:pointer;padding:0.5em 0;display:inline-block}.radios label:hover{color:#222;box-shadow:0 0 0 4px lightgray}.radios [type=radio]:checked+label{color:black;box-shadow:0 0 0 6px lightgray}.actions{text-align:center}.actions input{font-size:x-large}.field.required>label:after,.field.required .field_with_errors>label:after{color:darkred;content:"*";font-size:smaller}.field>label:before,.field .field_with_errors>label:before,.field th:before,.field th a:before{margin-right:0.4em;display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.field.login label:before{content:""}.field.password label:before{content:""}.field.title label:before{content:""}.field.start_time label:before{content:""}.field.end_time label:before{content:""}.field.repeat label:before{content:""}.field.rule>label:before{content:""}.field.description label:before{content:""}.field.place_name label:before{content:""}.field.address label:before{content:""}.field.city label:before,.field th.city a:before{content:""}.field.department label:before,.field th.department a:before{content:""}.field.region>label:before,.field th.region a:before{content:""}.field.locality>label:before{content:""}.field.contact label:before{content:""}.field.submitter label:before{content:""}.field.url label:before,.field th.url:before{content:""}.field.diaspora label:before,.field th.diaspora:before{content:""}.field.tags label:before,.field th.tags a:before{content:""}.field.active label:before{content:""}.field.reason label:before{content:""}.field.kind>label:before,.field th.kind:before{content:""}.field.feed label:before,.field th.feed:before{content:""}.field.future label:before{content:""}.field.period_year label:before{content:""}.field.period_week label:before{content:""}.field.near_location label:before{content:""}.field.near_distance label:before{content:""}.field.iframe label:before{content:""}.quantity{text-align:right !important;white-space:nowrap}table{margin:1em auto;border-spacing:2px}table th{padding:0.3em 0.6em}table.list thead tr{background-color:#fed}table.list tbody tr:nth-child(odd){background-color:#def}table.list tbody tr:nth-child(even){background-color:#eee}table.list th{font-size:larger}table.list td{padding:0.2em;text-align:left}table.list td.updated_at{text-align:center}dl{margin:1em auto;max-width:40em}dl dt{clear:left;float:left;padding:0.2em 1em;min-width:50%;text-align:right}dl dd{padding:0.2em 1em;text-align:left}dl dd.quantity{padding-right:16em}dl dd h3{display:inline}dl dt+dd+dt+dd{border-top:1px solid #999}ul.counters{text-align:center}ul.counters li{display:inline}ul.counters li a:link,ul.counters li a:visited{color:white;padding:0.4em 1em;display:inline-block;font-size:x-large;box-shadow:0 0 2px black;border-radius:0.4em;background-color:#258}.edit_link:link,.delete_link:link{display:none}.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg,.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer{max-width:none !important}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,0.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-tile{will-change:opacity}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity 0.2s linear;-moz-transition:opacity 0.2s linear;-o-transition:opacity 0.2s linear;transition:opacity 0.2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.leaflet-zoom-anim .leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1);-moz-transition:-moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1);-o-transition:-o-transform 0.25s cubic-bezier(0, 0, 0.25, 1);transition:transform 0.25s cubic-bezier(0, 0, 0.25, 1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline:0}.leaflet-container a{color:#0078A8}.leaflet-container a.leaflet-active{outline:2px solid orange}.leaflet-zoom-box{border:2px dotted #38f;background:rgba(255,255,255,0.5)}.leaflet-container{font:12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif}.leaflet-bar{box-shadow:0 1px 5px rgba(0,0,0,0.65);border-radius:4px}.leaflet-bar a,.leaflet-bar a:hover{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:black}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:bold 18px 'Lucida Console', Monaco, monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px rgba(0,0,0,0.4);background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(/assets/leaflet/dist/images/layers-1dbbe9d028e292f36fcba8f8b3a28d5e8932754fc2215b9ac69e4cdecf5107c6.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(/assets/leaflet/dist/images/layers-2x-066daca850d8ffbef007af00b06eac0015728dee279c51f3cb6c716df7c42edf.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(/assets/leaflet/dist/images/marker-icon-574c3a5cca85f4114085b6841596d62f00d7c892c7b03f28cbfa301deb1dc437.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:rgba(255,255,255,0.7);margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover{text-decoration:underline}.leaflet-container .leaflet-control-attribution,.leaflet-container .leaflet-control-scale{font-size:11px}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;font-size:11px;white-space:nowrap;overflow:hidden;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;background:rgba(255,255,255,0.5)}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,0.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 19px;line-height:1.4}.leaflet-popup-content p{margin:18px 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:white;color:#333;box-shadow:0 3px 14px rgba(0,0,0,0.4)}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;padding:4px 4px 0 0;border:none;text-align:center;width:18px;height:14px;font:16px/14px Tahoma, Verdana, sans-serif;color:#c3c3c3;text-decoration:none;font-weight:bold;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover{color:#999}.leaflet-popup-scrolled{overflow:auto;border-bottom:1px solid #ddd;border-top:1px solid #ddd}.leaflet-oldie .leaflet-popup-content-wrapper{zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)}.leaflet-oldie .leaflet-popup-tip-container{margin-top:-1px}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px rgba(0,0,0,0.4)}.leaflet-tooltip.leaflet-clickable{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}.leaflet-cluster-anim .leaflet-marker-icon,.leaflet-cluster-anim .leaflet-marker-shadow{-webkit-transition:-webkit-transform 0.3s ease-out, opacity 0.3s ease-in;-moz-transition:-moz-transform 0.3s ease-out, opacity 0.3s ease-in;-o-transition:-o-transform 0.3s ease-out, opacity 0.3s ease-in;transition:transform 0.3s ease-out, opacity 0.3s ease-in}.leaflet-cluster-spider-leg{-webkit-transition:-webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in;-moz-transition:-moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in;-o-transition:-o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in;transition:stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in}.marker-cluster-small{background-color:rgba(181,226,140,0.6)}.marker-cluster-small div{background-color:rgba(110,204,57,0.6)}.marker-cluster-medium{background-color:rgba(241,211,87,0.6)}.marker-cluster-medium div{background-color:rgba(240,194,12,0.6)}.marker-cluster-large{background-color:rgba(253,156,115,0.6)}.marker-cluster-large div{background-color:rgba(241,128,23,0.6)}.leaflet-oldie .marker-cluster-small{background-color:#b5e28c}.leaflet-oldie .marker-cluster-small div{background-color:#6ecc39}.leaflet-oldie .marker-cluster-medium{background-color:#f1d357}.leaflet-oldie .marker-cluster-medium div{background-color:#f0c20c}.leaflet-oldie .marker-cluster-large{background-color:#fd9c73}.leaflet-oldie .marker-cluster-large div{background-color:#f18017}.marker-cluster{background-clip:padding-box;border-radius:20px}.marker-cluster div{width:30px;height:30px;margin-left:5px;margin-top:5px;text-align:center;border-radius:15px;font:12px "Helvetica Neue", Arial, Helvetica, sans-serif}.marker-cluster span{line-height:30px}#map{height:60em;box-shadow:0 0 1em SteelBlue;transition:none}#map *{max-width:initial}#map.event,#map.orga{height:20em}.tags #map{width:40%;height:60em;margin:1.6em 2%;display:inline-block}form.leaflet-control-layers-list label{text-align:left}form.leaflet-control-layers-list label .awesome-marker{height:auto !important;display:inline-block !important;position:relative !important}html.iframe #map{width:100%;max-width:100%;box-shadow:none}@media all and (max-width: 1024px){.links,a#banner{margin:0.6em auto}table,table.list,table.dates,table.list.dates{border-spacing:1px}table tbody th,table.list tbody th,table.dates tbody th,table.list.dates tbody th{overflow:hidden;max-width:3em}}@media all and (max-width: 900px){body{border:none;margin:0;padding:1%;font-size:smaller}body main ul{margin-left:0}form#orga_search{font-size:smaller !important}thead th{font-size:smaller}}@media all and (max-width: 34em){body{padding:0}p{padding-left:0.4em;padding-right:0.4em}header.top{text-align:center}header.top nav{display:none}header.top img.logo{margin-right:0}header.top h1{padding-top:0;letter-spacing:initial}form#orga_search{display:none}body.index table thead{display:none}body.index.events table tr td{clear:both;width:auto;height:auto;margin:1px;display:block;font-size:larger;min-height:1em;border-width:1px !important}body.index.events table tr td.prev-month,body.index.events table tr td.next-month,body.index.events table tr td.current-month.past{display:none}body.index.events table tr td .day_number{font-size:initial}body.index.events table tr td .event a{padding:0.4em 1em}body.index header:active+table tr td.current-month.past,body.index header:hover+table tr td.current-month.past{display:block}body.index.versions table tbody tr td,body.index.orgas table tbody tr td{width:auto;padding:0 0.2em;display:block}body.index.versions table tbody tr td:first-child,body.index.orgas table tbody tr td:first-child{float:left}body.index.versions table tbody td+td+td,body.index.orgas table tbody td+td+td{display:inline-block}body.index.versions table tbody td:first-child+td,body.index.orgas table tbody td:first-child+td{width:100%;display:block}dl dt{min-width:auto;text-align:left}dl dd,dl dd.quantity{padding-right:1em}aside{display:none}.links,a#banner{float:none;padding:0.4em 0}.field label{width:auto;display:block;text-align:left}.field input{width:100%;display:block}}@media all and (min-width: 1600px){body{font-size:larger}aside#orga-list{width:auto}#advises{max-width:60em}}h2.warning{color:red}.moderations table.list,.notes table.list{min-width:90%;margin-top:15px}.moderations table.list td,.notes table.list td{padding-top:0.5em;padding-bottom:0.5em}.moderations table.list td.empty,.notes table.list td.empty{background-color:white}.moderations table.list td.note,.notes table.list td.note{text-align:left}.moderations table.list td pre,.notes table.list td pre{width:70%;margin:auto;padding:5px;overflow:auto;text-align:left;background-color:#eee}.moderations table.list td em.author,.notes table.list td em.author{display:block;font-size:smaller;text-align:right;font-style:italic;margin-top:15px}.moderations table.list th.actions,.notes table.list th.actions{padding:0}.moderations table.list th.actions a,.notes table.list th.actions a{padding:0.2em;display:inline-block;font-weight:normal}.fa.fa-check,.fa.fa-thumbs-up{color:green}.fa.fa-thumbs-down{color:red}.notes form label:after{content:":"}img.favicon{max-height:2em;border-radius:3px;vertical-align:middle}form#orga_search{right:0;width:15em;position:absolute;font-size:larger;text-align:right;white-space:nowrap}form#orga_search label{display:none}form#orga_search em.fa{color:#258}form#orga_search input{width:14em;border:solid thin #258;padding:0;margin-left:-1.5em;margin-right:-1.3em;padding-left:1.5em;padding-right:1.2em}form#orga_search button.search{color:#258;border:none;padding:0;font-size:large;box-shadow:none;margin-top:-0.1em;margin-left:0;vertical-align:middle;background-color:transparent}form#orga_search button.search:hover em.fa{color:#2E97FF}form#orga_search button.search span.label{display:none}body.orgas.show main fieldset.orga{min-width:60em}body.orgas.show main dl,body.orgas.show main iframe,body.orgas.show main fieldset{display:inline-block;min-width:30em;vertical-align:top}table tr.inactive{color:gray}body.pages main h3,body.pages main h4{text-align:left}.region_filter{float:right;font-size:smaller}.region_filter>ul>li{float:left}.region_filter ul{margin:0;z-index:1500;list-style:none;text-align:left;border-bottom-left-radius:0.4em;border-bottom-right-radius:0.4em}.region_filter ul ul{position:absolute;background-color:white}.region_filter ul ul li{display:none;border-top:solid thin #eee}.region_filter ul li:hover li,.region_filter ul li.selected{display:block}.region_filter li{margin:0}.region_filter li.selected{box-shadow:0 0 0 6px lightgray}.region_filter li a{padding:0.3em;display:inline-block;white-space:nowrap}.region_filter li:hover ul{box-shadow:0 4px 4px gray}.radios .radios{display:inline-block;text-align:left;background-color:white}.radios .radios label{display:none;padding:0.2em}.radios .radios input:checked+label{display:inline}.radios .region:hover .radios{z-index:1000;position:absolute;box-shadow:0 4px 4px gray}.radios .region:hover .radios label{display:block !important}.flag-icon-ca-qc{background-image:url(/assets/regions/CA-QC-776d563b6a4ac4312cae9f0bfe630c20711346e8dbddd41040998eba79f4b588.png)}body.stats h3{text-align:center}table.list.dates th,table.list.dates td{padding:0 0.6em}table.list.dates .sparkline{padding:0}div.field,div.actions{margin-bottom:10px}#notice{color:green}#error_explanation{width:450px;border:2px solid red;padding-bottom:0;margin-bottom:20px;background-color:#f0f0f0}#error_explanation h2{text-align:left;font-weight:bold;padding:15px;font-size:12px;background-color:#c00;color:#fff}#error_explanation p,#error_explanation ul{padding:0 1em}#error_explanation p li,#error_explanation ul li{font-size:12px;list-style:square}.sessions form{margin:6em auto}.logout{margin:2em auto}table.list.dates{width:100%}table.list.dates thead th{height:3em;padding:0 !important;font-size:initial;transform:rotate(-45deg)}table.list.dates tbody th:first-child{font-size:large;text-align:right}table.list.dates tbody td{padding:0}table.list.dates tbody td a{padding:0 1em;display:block}table.list.dates tfoot td canvas{width:100% !important;background-color:white}p.tags a:after{color:black;content:","}p.tags a:last-child:after{content:""}.css1{font-size:0.8em}.css2{font-size:1em}.css3{font-size:1.4em}.css4{font-size:1.8em}div.tagsinput{height:auto !important;border:none;margin:0;padding:0;display:inline-block;min-height:auto !important;vertical-align:middle}div.tagsinput span.tag{margin:0;padding:0.5em;font-size:inherit;font-family:inherit}div.tagsinput #event_tag_list_addTag{float:none;text-align:left}div.tagsinput #event_tag_list_addTag:first-child #event_tag_list_tag{width:100% !important}div.tagsinput input,div.tagsinput .ui-autocomplete-input{width:30% !important;border:solid 0.25em transparent !important;font-size:inherit;min-width:8em;margin-right:0;margin-bottom:0}div.tagsinput input:focus,div.tagsinput .ui-autocomplete-input:focus{border-color:#F0F8FF !important}body.versions td.changes{white-space:pre-wrap}/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0");src:url("/assets/font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot?v=4.7.0#iefix") format("embedded-opentype"),url("/assets/font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2?v=4.7.0") format("woff2"),url("/assets/font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff?v=4.7.0") format("woff"),url("/assets/font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf?v=4.7.0") format("truetype"),url("/assets/font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:0.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/public/assets/application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css.gz b/public/assets/application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css.gz
new file mode 100644
index 00000000..190d8490
Binary files /dev/null and b/public/assets/application-661f8a3a1589512fce34b1382f6b7a631001f9cf430896fc658c95562edff4b7.css.gz differ
diff --git a/public/assets/application-9b741d81e960c215cca53ea2b4e0bda53cfedf35d173e3075fa3aa0b1ed8ef0a.js b/public/assets/application-9b741d81e960c215cca53ea2b4e0bda53cfedf35d173e3075fa3aa0b1ed8ef0a.js
new file mode 100644
index 00000000..0e3d5520
--- /dev/null
+++ b/public/assets/application-9b741d81e960c215cca53ea2b4e0bda53cfedf35d173e3075fa3aa0b1ed8ef0a.js
@@ -0,0 +1,80412 @@
+/*!
+ * jQuery JavaScript Library v1.12.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-05-20T17:17Z
+ */
+
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//"use strict";
+var deletedIds = [];
+
+var document = window.document;
+
+var slice = deletedIds.slice;
+
+var concat = deletedIds.concat;
+
+var push = deletedIds.push;
+
+var indexOf = deletedIds.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ version = "1.12.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1, IE<9
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: deletedIds.sort,
+ splice: deletedIds.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var src, copyIsArray, copy, name, options, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray( src ) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type( obj ) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type( obj ) === "array";
+ },
+
+ isWindow: function( obj ) {
+ /* jshint eqeqeq: false */
+ return obj != null && obj == obj.window;
+ },
+
+ isNumeric: function( obj ) {
+
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ var realStringObj = obj && obj.toString();
+ return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ isPlainObject: function( obj ) {
+ var key;
+
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ try {
+
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call( obj, "constructor" ) &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+ } catch ( e ) {
+
+ // IE8,9 Will throw exceptions on certain host objects #9897
+ return false;
+ }
+
+ // Support: IE<9
+ // Handle iteration over inherited properties before own properties.
+ if ( !support.ownFirst ) {
+ for ( key in obj ) {
+ return hasOwn.call( obj, key );
+ }
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwn.call( obj, key );
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+ },
+
+ // Workarounds based on findings by Jim Driscoll
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+ globalEval: function( data ) {
+ if ( data && jQuery.trim( data ) ) {
+
+ // We use execScript on Internet Explorer
+ // We use an anonymous function so that context is window
+ // rather than jQuery in Firefox
+ ( window.execScript || function( data ) {
+ window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
+ } )( data );
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1, IE<9
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ var len;
+
+ if ( arr ) {
+ if ( indexOf ) {
+ return indexOf.call( arr, elem, i );
+ }
+
+ len = arr.length;
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+ for ( ; i < len; i++ ) {
+
+ // Skip accessing in sparse arrays
+ if ( i in arr && arr[ i ] === elem ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ while ( j < len ) {
+ first[ i++ ] = second[ j++ ];
+ }
+
+ // Support: IE<9
+ // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
+ if ( len !== len ) {
+ while ( second[ j ] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var args, proxy, tmp;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: function() {
+ return +( new Date() );
+ },
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+// JSHint would error on this code due to the Symbol not being defined in ES5.
+// Defining this global in .jshintrc would create a danger of using the global
+// unguarded in another place, it seems safer to just disable JSHint for these
+// three lines.
+/* jshint ignore: start */
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
+}
+/* jshint ignore: end */
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.1
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-10-17
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, nidselect, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !compilerCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+ if ( nodeType !== 1 ) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
+ while ( i-- ) {
+ groups[i] = nidselect + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( (parent = document.defaultView) && parent.top !== parent ) {
+ // Support: IE 11
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( document.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ return m ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = "" +
+ "";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !compilerCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( (oldCache = uniqueCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
+ } );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i,
+ ret = [],
+ self = this,
+ len = self.length;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // init accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector.charAt( 0 ) === "<" &&
+ selector.charAt( selector.length - 1 ) === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[ 2 ] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[ 0 ] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof root.ready !== "undefined" ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var i,
+ targets = jQuery( target, this ),
+ len = targets.length;
+
+ return this.filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( pos ?
+ pos.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return jQuery.inArray( this[ 0 ], jQuery( elem ) );
+ }
+
+ // Locate the position of the desired element
+ return jQuery.inArray(
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem, this );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ do {
+ cur = cur[ dir ];
+ } while ( cur && cur.nodeType !== 1 );
+
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return jQuery.nodeName( elem, "iframe" ) ?
+ elem.contentDocument || elem.contentWindow.document :
+ jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ ret = jQuery.uniqueSort( ret );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+ }
+
+ return this.pushStack( ret );
+ };
+} );
+var rnotwhite = ( /\S+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( jQuery.isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = true;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks( "memory" ) ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this === promise ? newDefer.promise() : this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add( function() {
+
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 ||
+ ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred.
+ // If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .progress( updateFunc( i, progressContexts, progressValues ) )
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+} );
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+} );
+
+/**
+ * Clean-up method for dom ready events
+ */
+function detach() {
+ if ( document.addEventListener ) {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+
+ } else {
+ document.detachEvent( "onreadystatechange", completed );
+ window.detachEvent( "onload", completed );
+ }
+}
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+
+ // readyState === "complete" is good enough for us to call the dom ready in oldIE
+ if ( document.addEventListener ||
+ window.event.type === "load" ||
+ document.readyState === "complete" ) {
+
+ detach();
+ jQuery.ready();
+ }
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called
+ // after the browser event has already occurred.
+ // Support: IE6-10
+ // Older IE sometimes signals "interactive" too soon
+ if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+ // Standards-based browsers support DOMContentLoaded
+ } else if ( document.addEventListener ) {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+
+ // If IE event model is used
+ } else {
+
+ // Ensure firing before onload, maybe late but safe also for iframes
+ document.attachEvent( "onreadystatechange", completed );
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", completed );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var top = false;
+
+ try {
+ top = window.frameElement == null && document.documentElement;
+ } catch ( e ) {}
+
+ if ( top && top.doScroll ) {
+ ( function doScrollCheck() {
+ if ( !jQuery.isReady ) {
+
+ try {
+
+ // Use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ top.doScroll( "left" );
+ } catch ( e ) {
+ return window.setTimeout( doScrollCheck, 50 );
+ }
+
+ // detach all dom ready events
+ detach();
+
+ // and execute any waiting functions
+ jQuery.ready();
+ }
+ } )();
+ }
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Support: IE<9
+// Iteration over object's inherited properties before its own
+var i;
+for ( i in jQuery( support ) ) {
+ break;
+}
+support.ownFirst = i === "0";
+
+// Note: most support tests are defined in their respective modules.
+// false until the test is run
+support.inlineBlockNeedsLayout = false;
+
+// Execute ASAP in case we need to set body.style.zoom
+jQuery( function() {
+
+ // Minified: var a,b,c,d
+ var val, div, body, container;
+
+ body = document.getElementsByTagName( "body" )[ 0 ];
+ if ( !body || !body.style ) {
+
+ // Return for frameset docs that don't have a body
+ return;
+ }
+
+ // Setup
+ div = document.createElement( "div" );
+ container = document.createElement( "div" );
+ container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+ body.appendChild( container ).appendChild( div );
+
+ if ( typeof div.style.zoom !== "undefined" ) {
+
+ // Support: IE<8
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
+
+ support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
+ if ( val ) {
+
+ // Prevent IE 6 from affecting layout for positioned elements #11048
+ // Prevent IE from shrinking the body in IE 7 mode #12869
+ // Support: IE<8
+ body.style.zoom = 1;
+ }
+ }
+
+ body.removeChild( container );
+} );
+
+
+( function() {
+ var div = document.createElement( "div" );
+
+ // Support: IE<9
+ support.deleteExpando = true;
+ try {
+ delete div.test;
+ } catch ( e ) {
+ support.deleteExpando = false;
+ }
+
+ // Null elements to avoid leaks in IE.
+ div = null;
+} )();
+var acceptData = function( elem ) {
+ var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
+ nodeType = +elem.nodeType || 1;
+
+ // Do not set data on non-element DOM nodes because it will not be cleared (#8335).
+ return nodeType !== 1 && nodeType !== 9 ?
+ false :
+
+ // Nodes accept data unless otherwise specified; rejection can be conditional
+ !noData || noData !== true && elem.getAttribute( "classid" ) === noData;
+};
+
+
+
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+ var name;
+ for ( name in obj ) {
+
+ // if the public data object is empty, the private is still empty
+ if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
+ continue;
+ }
+ if ( name !== "toJSON" ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
+ if ( !acceptData( elem ) ) {
+ return;
+ }
+
+ var ret, thisCache,
+ internalKey = jQuery.expando,
+
+ // We have to handle DOM nodes and JS objects differently because IE6-7
+ // can't GC object references properly across the DOM-JS boundary
+ isNode = elem.nodeType,
+
+ // Only DOM nodes need the global jQuery cache; JS object data is
+ // attached directly to the object so GC can occur automatically
+ cache = isNode ? jQuery.cache : elem,
+
+ // Only defining an ID for JS objects if its cache already exists allows
+ // the code to shortcut on the same path as a DOM node with no cache
+ id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+ // Avoid doing any more work than we need to when trying to get data on an
+ // object that has no data at all
+ if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
+ data === undefined && typeof name === "string" ) {
+ return;
+ }
+
+ if ( !id ) {
+
+ // Only DOM nodes need a new unique ID for each element since their data
+ // ends up in the global cache
+ if ( isNode ) {
+ id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
+ } else {
+ id = internalKey;
+ }
+ }
+
+ if ( !cache[ id ] ) {
+
+ // Avoid exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
+ cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
+ }
+
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
+ // shallow copied over onto the existing cache
+ if ( typeof name === "object" || typeof name === "function" ) {
+ if ( pvt ) {
+ cache[ id ] = jQuery.extend( cache[ id ], name );
+ } else {
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+ }
+ }
+
+ thisCache = cache[ id ];
+
+ // jQuery data() is stored in a separate object inside the object's internal data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
+ }
+
+ thisCache = thisCache.data;
+ }
+
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
+
+ // Check for both converted-to-camel and non-converted data property names
+ // If a data property was specified
+ if ( typeof name === "string" ) {
+
+ // First Try to find as-is property data
+ ret = thisCache[ name ];
+
+ // Test for null|undefined property data
+ if ( ret == null ) {
+
+ // Try to find the camelCased property
+ ret = thisCache[ jQuery.camelCase( name ) ];
+ }
+ } else {
+ ret = thisCache;
+ }
+
+ return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+ if ( !acceptData( elem ) ) {
+ return;
+ }
+
+ var thisCache, i,
+ isNode = elem.nodeType,
+
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+ id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+ // If there is already no cache entry for this object, there is no
+ // purpose in continuing
+ if ( !cache[ id ] ) {
+ return;
+ }
+
+ if ( name ) {
+
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+ if ( thisCache ) {
+
+ // Support array or space separated string names for data keys
+ if ( !jQuery.isArray( name ) ) {
+
+ // try the string as a key before any manipulation
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+
+ // split the camel cased version by spaces unless a key with the spaces exists
+ name = jQuery.camelCase( name );
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+ name = name.split( " " );
+ }
+ }
+ } else {
+
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete thisCache[ name[ i ] ];
+ }
+
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
+ return;
+ }
+ }
+ }
+
+ // See jQuery.data for more information
+ if ( !pvt ) {
+ delete cache[ id ].data;
+
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject( cache[ id ] ) ) {
+ return;
+ }
+ }
+
+ // Destroy the cache
+ if ( isNode ) {
+ jQuery.cleanData( [ elem ], true );
+
+ // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+ /* jshint eqeqeq: false */
+ } else if ( support.deleteExpando || cache != cache.window ) {
+ /* jshint eqeqeq: true */
+ delete cache[ id ];
+
+ // When all else fails, undefined
+ } else {
+ cache[ id ] = undefined;
+ }
+}
+
+jQuery.extend( {
+ cache: {},
+
+ // The following elements (space-suffixed to avoid Object.prototype collisions)
+ // throw uncatchable exceptions if you attempt to set expando properties
+ noData: {
+ "applet ": true,
+ "embed ": true,
+
+ // ...but Flash objects (which have this classid) *can* handle expandos
+ "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
+ },
+
+ hasData: function( elem ) {
+ elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
+ return !!elem && !isEmptyDataObject( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return internalData( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ return internalRemoveData( elem, name );
+ },
+
+ // For internal use only.
+ _data: function( elem, name, data ) {
+ return internalData( elem, name, data, true );
+ },
+
+ _removeData: function( elem, name ) {
+ return internalRemoveData( elem, name, true );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Special expections of .data basically thwart jQuery.access,
+ // so implement the relevant behavior ourselves
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = jQuery.data( elem );
+
+ if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ jQuery._data( elem, "parsedAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ jQuery.data( this, key );
+ } );
+ }
+
+ return arguments.length > 1 ?
+
+ // Sets one value
+ this.each( function() {
+ jQuery.data( this, key, value );
+ } ) :
+
+ // Gets one value
+ // Try to fetch any internally stored data first
+ elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ jQuery.removeData( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = jQuery._data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object,
+ // or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ jQuery._removeData( elem, type + "queue" );
+ jQuery._removeData( elem, key );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+
+
+( function() {
+ var shrinkWrapBlocksVal;
+
+ support.shrinkWrapBlocks = function() {
+ if ( shrinkWrapBlocksVal != null ) {
+ return shrinkWrapBlocksVal;
+ }
+
+ // Will be changed later if needed.
+ shrinkWrapBlocksVal = false;
+
+ // Minified: var b,c,d
+ var div, body, container;
+
+ body = document.getElementsByTagName( "body" )[ 0 ];
+ if ( !body || !body.style ) {
+
+ // Test fired too early or in an unsupported environment, exit.
+ return;
+ }
+
+ // Setup
+ div = document.createElement( "div" );
+ container = document.createElement( "div" );
+ container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
+ body.appendChild( container ).appendChild( div );
+
+ // Support: IE6
+ // Check if elements with layout shrink-wrap their children
+ if ( typeof div.style.zoom !== "undefined" ) {
+
+ // Reset CSS: box-sizing; display; margin; border
+ div.style.cssText =
+
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;" +
+ "padding:1px;width:1px;zoom:1";
+ div.appendChild( document.createElement( "div" ) ).style.width = "5px";
+ shrinkWrapBlocksVal = div.offsetWidth !== 3;
+ }
+
+ body.removeChild( container );
+
+ return shrinkWrapBlocksVal;
+ };
+
+} )();
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" ||
+ !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted,
+ scale = 1,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() { return tween.cur(); } :
+ function() { return jQuery.css( elem, prop, "" ); },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ do {
+
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ initialInUnit = initialInUnit / scale;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // Break the loop if scale is unchanged or perfect, or if we've just had enough.
+ } while (
+ scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+ );
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ length = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < length; i++ ) {
+ fn(
+ elems[ i ],
+ key,
+ raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ length ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([\w:-]+)/ );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+var rleadingWhitespace = ( /^\s+/ );
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
+ "details|dialog|figcaption|figure|footer|header|hgroup|main|" +
+ "mark|meter|nav|output|picture|progress|section|summary|template|time|video";
+
+
+
+function createSafeFragment( document ) {
+ var list = nodeNames.split( "|" ),
+ safeFrag = document.createDocumentFragment();
+
+ if ( safeFrag.createElement ) {
+ while ( list.length ) {
+ safeFrag.createElement(
+ list.pop()
+ );
+ }
+ }
+ return safeFrag;
+}
+
+
+( function() {
+ var div = document.createElement( "div" ),
+ fragment = document.createDocumentFragment(),
+ input = document.createElement( "input" );
+
+ // Setup
+ div.innerHTML = "
a";
+
+ // IE strips leading whitespace when .innerHTML is used
+ support.leadingWhitespace = div.firstChild.nodeType === 3;
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ support.tbody = !div.getElementsByTagName( "tbody" ).length;
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
+
+ // Makes sure cloning an html5 element does not cause problems
+ // Where outerHTML is undefined, this still works
+ support.html5Clone =
+ document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>";
+
+ // Check if a disconnected checkbox will retain its checked
+ // value of true after appended to the DOM (IE6/7)
+ input.type = "checkbox";
+ input.checked = true;
+ fragment.appendChild( input );
+ support.appendChecked = input.checked;
+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ // Support: IE6-IE11+
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ fragment.appendChild( div );
+
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input = document.createElement( "input" );
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<9
+ // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
+ support.noCloneEvent = !!div.addEventListener;
+
+ // Support: IE<9
+ // Since attributes and properties are the same in IE,
+ // cleanData must set properties to undefined rather than use removeAttribute
+ div[ jQuery.expando ] = 1;
+ support.attributes = !div.getAttribute( jQuery.expando );
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+ option: [ 1, "" ],
+ legend: [ 1, "" ],
+ area: [ 1, "" ],
+
+ // Support: IE8
+ param: [ 1, "" ],
+ thead: [ 1, "
", "
" ],
+ tr: [ 2, "
", "
" ],
+ col: [ 2, "
", "
" ],
+ td: [ 3, "
", "
" ],
+
+ // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+ // unless wrapped in a div with non-breaking characters in front of it.
+ _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ]
+};
+
+// Support: IE8-IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+ var elems, elem,
+ i = 0,
+ found = typeof context.getElementsByTagName !== "undefined" ?
+ context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== "undefined" ?
+ context.querySelectorAll( tag || "*" ) :
+ undefined;
+
+ if ( !found ) {
+ for ( found = [], elems = context.childNodes || context;
+ ( elem = elems[ i ] ) != null;
+ i++
+ ) {
+ if ( !tag || jQuery.nodeName( elem, tag ) ) {
+ found.push( elem );
+ } else {
+ jQuery.merge( found, getAll( elem, tag ) );
+ }
+ }
+ }
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], found ) :
+ found;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var elem,
+ i = 0;
+ for ( ; ( elem = elems[ i ] ) != null; i++ ) {
+ jQuery._data(
+ elem,
+ "globalEval",
+ !refElements || jQuery._data( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/,
+ rtbody = / from table fragments
+ if ( !support.tbody ) {
+
+ // String was a
, *may* have spurious
+ elem = tag === "table" && !rtbody.test( elem ) ?
+ tmp.firstChild :
+
+ // String was a bare or
+ wrap[ 1 ] === "
" && !rtbody.test( elem ) ?
+ tmp :
+ 0;
+
+ j = elem && elem.childNodes.length;
+ while ( j-- ) {
+ if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
+ !tbody.childNodes.length ) {
+
+ elem.removeChild( tbody );
+ }
+ }
+ }
+
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Fix #12392 for WebKit and IE > 9
+ tmp.textContent = "";
+
+ // Fix #12392 for oldIE
+ while ( tmp.firstChild ) {
+ tmp.removeChild( tmp.firstChild );
+ }
+
+ // Remember the top-level container for proper cleanup
+ tmp = safe.lastChild;
+ }
+ }
+ }
+
+ // Fix #11356: Clear elements from fragment
+ if ( tmp ) {
+ safe.removeChild( tmp );
+ }
+
+ // Reset defaultChecked for any radios and checkboxes
+ // about to be appended to the DOM in IE 6/7 (#8060)
+ if ( !support.appendChecked ) {
+ jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+ }
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( safe.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ tmp = null;
+
+ return safe;
+}
+
+
+( function() {
+ var i, eventName,
+ div = document.createElement( "div" );
+
+ // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
+ for ( i in { submit: true, change: true, focusin: true } ) {
+ eventName = "on" + i;
+
+ if ( !( support[ i ] = eventName in window ) ) {
+
+ // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
+ div.setAttribute( eventName, "t" );
+ support[ i ] = div.attributes[ eventName ].expando === false;
+ }
+ }
+
+ // Null elements to avoid leaks in IE.
+ div = null;
+} )();
+
+
+var rformElems = /^(?:input|select|textarea)$/i,
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE9
+// See #13393 for more info
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+ var tmp, events, t, handleObjIn,
+ special, eventHandle, handleObj,
+ handlers, type, namespaces, origType,
+ elemData = jQuery._data( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" &&
+ ( !e || jQuery.event.triggered !== e.type ) ?
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+
+ // Add elem as a property of the handle fn to prevent a memory leak
+ // with IE non-native events
+ eventHandle.elem = elem;
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener/attachEvent if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+ var j, handleObj, tmp,
+ origCount, t, events,
+ special, handlers, type,
+ namespaces, origType,
+ elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery._removeData( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+ var handle, ontype, cur,
+ bubbleType, special, tmp, i,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf( "." ) > -1 ) {
+
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split( "." );
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join( "." );
+ event.rnamespace = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === ( elem.ownerDocument || document ) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
+ jQuery._data( cur, "handle" );
+
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if (
+ ( !special._default ||
+ special._default.apply( eventPath.pop(), data ) === false
+ ) && acceptData( elem )
+ ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ try {
+ elem[ type ]();
+ } catch ( e ) {
+
+ // IE<9 dies on focus/blur to hidden element (#1486,#12518)
+ // only reproducible on winXP IE8 native, not IE9 in IE8 mode
+ }
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Support (at least): Chrome, IE9
+ // Find delegate handlers
+ // Black-hole SVG
"},postRender:function(){var a=this;a._super(),a.settings.activeTab=a.settings.activeTab||0,a.activateTab(a.settings.activeTab),this.on("click",function(b){var c=b.target.parentNode;if(c&&c.id==a._id+"-head")for(var d=c.childNodes.length;d--;)c.childNodes[d]==b.target&&a.activateTab(d)})},initLayoutRect:function(){var a,b,d,e=this;b=c.getSize(e.getEl("head")).width,b=b<0?0:b,d=0,e.items().each(function(a){b=Math.max(b,a.layoutRect().minW),d=Math.max(d,a.layoutRect().minH)}),e.items().each(function(a){a.settings.x=0,a.settings.y=0,a.settings.w=b,a.settings.h=d,a.layoutRect({x:0,y:0,w:b,h:d})});var f=c.getSize(e.getEl("head")).height;return e.settings.minWidth=b,e.settings.minHeight=d+f,a=e._super(),a.deltaH+=f,a.innerH=a.h-a.deltaH,a}})}),g("2a",["12","c","2n","15"],function(a,b,c,d){return d.extend({init:function(a){var b=this;b._super(a),b.classes.add("textbox"),a.multiline?b.classes.add("multiline"):(b.on("keydown",function(a){var c;13==a.keyCode&&(a.preventDefault(),b.parents().reverse().each(function(a){if(a.toJSON)return c=a,!1}),b.fire("submit",{data:c.toJSON()}))}),b.on("keyup",function(a){b.state.set("value",a.target.value)}))},repaint:function(){var b,c,d,e,f,g=this,h=0;b=g.getEl().style,c=g._layoutRect,f=g._lastRepaintRect||{};var i=a;return!g.settings.multiline&&i.all&&(!i.documentMode||i.documentMode<=8)&&(b.lineHeight=c.h-h+"px"),d=g.borderBox,e=d.left+d.right+8,h=d.top+d.bottom+(g.settings.multiline?8:0),c.x!==f.x&&(b.left=c.x+"px",f.x=c.x),c.y!==f.y&&(b.top=c.y+"px",f.y=c.y),c.w!==f.w&&(b.width=c.w-e+"px",f.w=c.w),c.h!==f.h&&(b.height=c.h-h+"px",f.h=c.h),g._lastRepaintRect=f,g.fire("repaint",{},!1),g},renderHtml:function(){var a,d,e=this,f=e.settings;return a={id:e._id,hidefocus:"1"},b.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(b){a[b]=f[b]}),e.disabled()&&(a.disabled="disabled"),f.subtype&&(a.type=f.subtype),d=c.create(f.multiline?"textarea":"input",a),d.value=e.state.get("value"),d.className=e.classes,d.outerHTML},value:function(a){return arguments.length?(this.state.set("value",a),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var a=this;a.getEl().value=a.state.get("value"),a._super(),a.$el.on("change",function(b){a.state.set("value",b.target.value),a.fire("change",b)})},bindStates:function(){var a=this;return a.state.on("change:value",function(b){a.getEl().value!=b.value&&(a.getEl().value=b.value)}),a.state.on("change:disabled",function(b){a.getEl().disabled=b.value}),a._super()},remove:function(){this.$el.off(),this._super()}})}),g("4",["b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","5","1f","1g","1h","1i","1j","1k","1l","1m","1n","1o","1p","1q","1r","1s","1t","1u","1v","1w","1x","1y","1z","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","15","2e"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da,ea,fa,ga,ha){var ia=function(){return{Selector:Y,Collection:h,ReflowQueue:T,Control:n,Factory:a,KeyboardNavigation:D,Container:m,DragHelper:o,Scrollable:W,Panel:O,Movable:M,Resizable:U,FloatPanel:v,Window:ha,MessageBox:L,Tooltip:fa,Widget:ga,Progress:R,Notification:N,Layout:F,AbsoluteLayout:c,Button:e,ButtonGroup:f,Checkbox:g,ComboBox:l,ColorBox:i,PanelButton:P,ColorButton:j,ColorPicker:k,Path:Q,ElementPath:q,FormItem:z,Form:x,FieldSet:r,FilePicker:s,FitLayout:t,FlexLayout:u,FlowLayout:w,FormatControls:y,GridLayout:A,Iframe:B,InfoBox:C,Label:E,Toolbar:ea,MenuBar:I,MenuButton:J,MenuItem:K,Throbber:da,Menu:H,ListBox:G,Radio:S,ResizeHandle:V,SelectBox:X,Slider:Z,Spacer:$,SplitButton:_,StackLayout:aa,TabPanel:ba,TextBox:ca,DropZone:p,BrowseButton:d}},ja=function(a){a.ui?b.each(ia(),function(b,c){a.ui[c]=b}):a.ui=ia()},ka=function(){b.each(ia(),function(b,c){a.add(c,b)})},la={appendTo:ja,registerToFactory:ka};return la}),g("0",["1","2","3","4","5"],function(a,b,c,d,e){return d.registerToFactory(),d.appendTo(a.tinymce?a.tinymce:{}),b.add("modern",function(a){return e.setup(a),c.get(a)}),function(){}}),d("0")()}();
diff --git a/public/assets/tinymce/themes/modern/theme-c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c.js.gz b/public/assets/tinymce/themes/modern/theme-c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c.js.gz
new file mode 100644
index 00000000..c270be1e
Binary files /dev/null and b/public/assets/tinymce/themes/modern/theme-c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c.js.gz differ
diff --git a/public/assets/tinymce/themes/modern/theme.js b/public/assets/tinymce/themes/modern/theme.js
index 9af194ef..4bb661f2 120000
--- a/public/assets/tinymce/themes/modern/theme.js
+++ b/public/assets/tinymce/themes/modern/theme.js
@@ -1 +1 @@
-theme-acb8d1f30de151cc3b7f6b5131ed0e7e45abfd745256260b2d57b3594c97c685.js
\ No newline at end of file
+theme-c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c.js
\ No newline at end of file
diff --git a/public/assets/tinymce/themes/modern/theme.js.gz b/public/assets/tinymce/themes/modern/theme.js.gz
index 94d574f6..a816d825 120000
--- a/public/assets/tinymce/themes/modern/theme.js.gz
+++ b/public/assets/tinymce/themes/modern/theme.js.gz
@@ -1 +1 @@
-theme-acb8d1f30de151cc3b7f6b5131ed0e7e45abfd745256260b2d57b3594c97c685.js.gz
\ No newline at end of file
+theme-c648c4f32163d55e6b2311339a3a1d29e039b7f79ed5271854663cc013e9052c.js.gz
\ No newline at end of file
diff --git a/public/assets/tinymce/tinymce-cccbb9fb34a9d8d8634a3a9ae0080ca394081f2b98cd81c4c378c5a1d73fba21.js b/public/assets/tinymce/tinymce-cccbb9fb34a9d8d8634a3a9ae0080ca394081f2b98cd81c4c378c5a1d73fba21.js
new file mode 100644
index 00000000..a3a045a6
--- /dev/null
+++ b/public/assets/tinymce/tinymce-cccbb9fb34a9d8d8634a3a9ae0080ca394081f2b98cd81c4c378c5a1d73fba21.js
@@ -0,0 +1,44399 @@
+// 4.7.4 (2017-12-05)
+(function () {
+
+var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)}
+
+// Used when there is no 'main' module.
+// The name is probably (hopefully) unique so minification removes for releases.
+var register_3795 = function (id) {
+ var module = dem(id);
+ var fragments = id.split('.');
+ var target = Function('return this;')();
+ for (var i = 0; i < fragments.length - 1; ++i) {
+ if (target[fragments[i]] === undefined)
+ target[fragments[i]] = {};
+ target = target[fragments[i]];
+ }
+ target[fragments[fragments.length - 1]] = module;
+};
+
+var instantiate = function (id) {
+ var actual = defs[id];
+ var dependencies = actual.deps;
+ var definition = actual.defn;
+ var len = dependencies.length;
+ var instances = new Array(len);
+ for (var i = 0; i < len; ++i)
+ instances[i] = dem(dependencies[i]);
+ var defResult = definition.apply(null, instances);
+ if (defResult === undefined)
+ throw 'module [' + id + '] returned undefined';
+ actual.instance = defResult;
+};
+
+var def = function (id, dependencies, definition) {
+ if (typeof id !== 'string')
+ throw 'module id must be a string';
+ else if (dependencies === undefined)
+ throw 'no dependencies for ' + id;
+ else if (definition === undefined)
+ throw 'no definition function for ' + id;
+ defs[id] = {
+ deps: dependencies,
+ defn: definition,
+ instance: undefined
+ };
+};
+
+var dem = function (id) {
+ var actual = defs[id];
+ if (actual === undefined)
+ throw 'module [' + id + '] was undefined';
+ else if (actual.instance === undefined)
+ instantiate(id);
+ return actual.instance;
+};
+
+var req = function (ids, callback) {
+ var len = ids.length;
+ var instances = new Array(len);
+ for (var i = 0; i < len; ++i)
+ instances[i] = dem(ids[i]);
+ callback.apply(null, instances);
+};
+
+var ephox = {};
+
+ephox.bolt = {
+ module: {
+ api: {
+ define: def,
+ require: req,
+ demand: dem
+ }
+ }
+};
+
+var define = def;
+var require = req;
+var demand = dem;
+// this helps with minification when using a lot of global references
+var defineGlobal = function (id, ref) {
+ define(id, [], function () { return ref; });
+};
+/*jsc
+["tinymce.core.api.Main","ephox.katamari.api.Fun","global!window","tinymce.core.api.Tinymce","global!Array","global!Error","tinymce.core.AddOnManager","tinymce.core.Editor","tinymce.core.EditorCommands","tinymce.core.EditorManager","tinymce.core.EditorObservable","tinymce.core.Env","tinymce.core.Shortcuts","tinymce.core.UndoManager","tinymce.core.api.FocusManager","tinymce.core.api.Formatter","tinymce.core.api.NotificationManager","tinymce.core.api.WindowManager","tinymce.core.api.dom.BookmarkManager","tinymce.core.api.dom.RangeUtils","tinymce.core.api.dom.Serializer","tinymce.core.dom.ControlSelection","tinymce.core.dom.DOMUtils","tinymce.core.dom.DomQuery","tinymce.core.dom.EventUtils","tinymce.core.dom.ScriptLoader","tinymce.core.dom.Selection","tinymce.core.dom.Sizzle","tinymce.core.dom.TreeWalker","tinymce.core.geom.Rect","tinymce.core.html.DomParser","tinymce.core.html.Entities","tinymce.core.html.Node","tinymce.core.html.SaxParser","tinymce.core.html.Schema","tinymce.core.html.Serializer","tinymce.core.html.Styles","tinymce.core.html.Writer","tinymce.core.ui.Factory","tinymce.core.util.Class","tinymce.core.util.Color","tinymce.core.util.Delay","tinymce.core.util.EventDispatcher","tinymce.core.util.I18n","tinymce.core.util.JSON","tinymce.core.util.JSONP","tinymce.core.util.JSONRequest","tinymce.core.util.LocalStorage","tinymce.core.util.Observable","tinymce.core.util.Promise","tinymce.core.util.Tools","tinymce.core.util.URI","tinymce.core.util.VK","tinymce.core.util.XHR","ephox.katamari.api.Arr","global!document","ephox.sand.api.URL","global!matchMedia","global!navigator","global!clearInterval","global!clearTimeout","global!setInterval","global!setTimeout","tinymce.core.util.Arr","tinymce.core.dom.Position","tinymce.core.dom.StyleSheetLoader","tinymce.core.dom.TrimNode","ephox.sugar.api.node.Element","tinymce.core.InsertContent","tinymce.core.delete.DeleteCommands","tinymce.core.dom.NodeType","tinymce.core.newline.InsertBr","tinymce.core.selection.SelectionBookmark","tinymce.core.EditorSettings","tinymce.core.Mode","tinymce.core.dom.TrimHtml","tinymce.core.focus.EditorFocus","tinymce.core.init.Render","tinymce.core.ui.Sidebar","tinymce.core.util.Uuid","ephox.katamari.api.Type","tinymce.core.ErrorReporter","tinymce.core.focus.FocusController","tinymce.core.dom.GetBookmark","tinymce.core.undo.Levels","ephox.katamari.api.Cell","tinymce.core.fmt.ApplyFormat","tinymce.core.fmt.CaretFormat","tinymce.core.fmt.FormatChanged","tinymce.core.fmt.FormatRegistry","tinymce.core.fmt.MatchFormat","tinymce.core.fmt.Preview","tinymce.core.fmt.RemoveFormat","tinymce.core.fmt.ToggleFormat","tinymce.core.keyboard.FormatShortcuts","ephox.katamari.api.Option","tinymce.core.EditorView","tinymce.core.ui.NotificationManagerImpl","tinymce.core.ui.WindowManagerImpl","tinymce.core.dom.Bookmarks","tinymce.core.selection.CaretRangeFromPoint","tinymce.core.selection.NormalizeRange","tinymce.core.selection.RangeCompare","tinymce.core.selection.RangeNodes","tinymce.core.selection.RangeWalk","tinymce.core.selection.SplitRange","tinymce.core.dom.DomSerializer","ephox.sugar.api.search.Selectors","tinymce.core.dom.RangePoint","ephox.sugar.api.dom.Compare","tinymce.core.caret.CaretPosition","tinymce.core.dom.ScrollIntoView","tinymce.core.selection.EventProcessRanges","tinymce.core.selection.GetSelectionContent","tinymce.core.selection.MultiRange","tinymce.core.selection.SetSelectionContent","tinymce.core.html.LegacyFilter","ephox.sand.api.XMLHttpRequest","global!Object","global!String","ephox.sand.util.Global","ephox.sand.api.PlatformDetection","global!console","ephox.sugar.api.node.Node","ephox.sugar.api.properties.Css","ephox.sugar.api.search.Traverse","ephox.katamari.api.Future","ephox.katamari.api.Futures","ephox.katamari.api.Result","tinymce.core.dom.ElementType","tinymce.core.InsertList","tinymce.core.caret.CaretCandidate","tinymce.core.geom.ClientRect","tinymce.core.text.ExtendingChar","tinymce.core.util.Fun","tinymce.core.caret.CaretWalker","tinymce.core.dom.ElementUtils","tinymce.core.dom.PaddingBr","tinymce.core.selection.RangeNormalizer","tinymce.core.delete.BlockBoundaryDelete","tinymce.core.delete.BlockRangeDelete","tinymce.core.delete.CefDelete","tinymce.core.delete.DeleteUtils","tinymce.core.delete.InlineBoundaryDelete","tinymce.core.delete.TableDelete","ephox.sugar.api.dom.Insert","tinymce.core.caret.CaretFinder","tinymce.core.keyboard.BoundaryLocation","tinymce.core.keyboard.InlineUtils","ephox.katamari.api.Struct","tinymce.core.caret.CaretContainer","ephox.sugar.api.dom.Remove","ephox.sugar.api.properties.Attr","tinymce.core.fmt.ExpandRange","tinymce.core.fmt.FormatUtils","tinymce.core.text.Zwsp","ephox.sand.api.Node","ephox.sugar.api.node.NodeTypes","ephox.sugar.api.node.Text","ephox.sugar.api.selection.Selection","ephox.katamari.api.Obj","ephox.katamari.api.Strings","ephox.sugar.api.dom.Focus","tinymce.core.init.Init","tinymce.core.PluginManager","tinymce.core.ThemeManager","tinymce.core.selection.SelectionRestore","tinymce.core.caret.CaretBookmark","tinymce.core.undo.Fragments","tinymce.core.dom.ResolveBookmark","tinymce.core.fmt.Hooks","tinymce.core.fmt.MergeFormats","tinymce.core.fmt.DefaultFormats","ephox.katamari.api.Merger","tinymce.core.api.Events","tinymce.core.dom.DomSerializerFilters","tinymce.core.dom.DomSerializerPreProcess","tinymce.core.selection.FragmentReader","ephox.katamari.api.Resolve","ephox.katamari.api.Thunk","ephox.sand.core.PlatformDetection","ephox.sugar.api.node.Body","ephox.sugar.impl.Style","ephox.katamari.str.StrAppend","ephox.katamari.str.StringParts","ephox.katamari.data.Immutable","ephox.katamari.data.MixedBag","ephox.sugar.alien.Recurse","ephox.katamari.api.LazyValue","ephox.katamari.async.Bounce","ephox.katamari.async.AsyncValues","tinymce.core.caret.CaretUtils","ephox.katamari.api.Options","ephox.sugar.api.dom.InsertAll","ephox.sugar.impl.NodeValue","ephox.sugar.api.search.SelectorFilter","tinymce.core.delete.BlockBoundary","tinymce.core.delete.MergeBlocks","ephox.sugar.api.search.PredicateFind","tinymce.core.text.Bidi","tinymce.core.delete.CefDeleteAction","tinymce.core.delete.DeleteElement","tinymce.core.keyboard.BoundaryCaret","ephox.katamari.api.Adt","tinymce.core.util.LazyEvaluator","tinymce.core.keyboard.BoundarySelection","tinymce.core.delete.TableDeleteAction","tinymce.core.dom.Empty","tinymce.core.dom.Parents","tinymce.core.selection.TableCellSelection","ephox.sugar.api.selection.Situ","ephox.sugar.api.search.PredicateExists","tinymce.core.init.InitContentBody","tinymce.core.init.InitIframe","ephox.katamari.api.Throttler","tinymce.core.undo.Diff","ephox.sugar.api.dom.Replication","ephox.sugar.api.node.Fragment","ephox.sugar.api.search.SelectorFind","tinymce.core.selection.SelectionUtils","tinymce.core.selection.SimpleTableModel","ephox.katamari.api.Global","ephox.sand.core.Browser","ephox.sand.core.OperatingSystem","ephox.sand.detect.DeviceType","ephox.sand.detect.UaString","ephox.sand.info.PlatformInfo","ephox.katamari.util.BagUtils","ephox.sugar.api.search.PredicateFilter","ephox.sugar.impl.ClosestOrAncestor","ephox.sugar.api.search.SelectorExists","tinymce.core.caret.CaretContainerInline","tinymce.core.caret.CaretContainerRemove","tinymce.core.selection.WordSelection","tinymce.core.EditorUpload","tinymce.core.ForceBlocks","tinymce.core.NodeChange","tinymce.core.SelectionOverrides","tinymce.core.caret.CaretContainerInput","tinymce.core.keyboard.KeyboardOverrides","tinymce.core.util.Quirks","tinymce.core.api.Settings","ephox.sand.detect.Version","tinymce.core.file.Uploader","tinymce.core.file.ImageScanner","tinymce.core.file.BlobCache","tinymce.core.file.UploadStatus","tinymce.core.DragDropOverrides","tinymce.core.caret.FakeCaret","tinymce.core.caret.LineUtils","tinymce.core.focus.CefFocus","tinymce.core.keyboard.CefUtils","tinymce.core.keyboard.ArrowKeys","tinymce.core.keyboard.DeleteBackspaceKeys","tinymce.core.keyboard.EnterKey","tinymce.core.keyboard.SpaceKey","global!Number","tinymce.core.file.Conversions","tinymce.core.dom.MousePosition","tinymce.core.dom.Dimensions","tinymce.core.keyboard.CefNavigation","tinymce.core.keyboard.MatchKeys","tinymce.core.delete.InlineFormatDelete","tinymce.core.newline.InsertNewLine","tinymce.core.keyboard.InsertSpace","ephox.sand.api.Blob","ephox.sand.api.FileReader","ephox.sand.api.Uint8Array","ephox.sand.api.Window","tinymce.core.caret.LineWalker","tinymce.core.newline.InsertBlock","tinymce.core.newline.NewLineAction","tinymce.core.newline.InsertLi","tinymce.core.newline.NewLineUtils","tinymce.core.newline.ContextSelectors"]
+jsc*/
+defineGlobal("global!Array", Array);
+defineGlobal("global!Error", Error);
+define(
+ 'ephox.katamari.api.Fun',
+
+ [
+ 'global!Array',
+ 'global!Error'
+ ],
+
+ function (Array, Error) {
+
+ var noop = function () { };
+
+ var noarg = function (f) {
+ return function () {
+ return f();
+ };
+ };
+
+ var compose = function (fa, fb) {
+ return function () {
+ return fa(fb.apply(null, arguments));
+ };
+ };
+
+ var constant = function (value) {
+ return function () {
+ return value;
+ };
+ };
+
+ var identity = function (x) {
+ return x;
+ };
+
+ var tripleEquals = function(a, b) {
+ return a === b;
+ };
+
+ // Don't use array slice(arguments), makes the whole function unoptimisable on Chrome
+ var curry = function (f) {
+ // equivalent to arguments.slice(1)
+ // starting at 1 because 0 is the f, makes things tricky.
+ // Pay attention to what variable is where, and the -1 magic.
+ // thankfully, we have tests for this.
+ var args = new Array(arguments.length - 1);
+ for (var i = 1; i < arguments.length; i++) args[i-1] = arguments[i];
+
+ return function () {
+ var newArgs = new Array(arguments.length);
+ for (var j = 0; j < newArgs.length; j++) newArgs[j] = arguments[j];
+
+ var all = args.concat(newArgs);
+ return f.apply(null, all);
+ };
+ };
+
+ var not = function (f) {
+ return function () {
+ return !f.apply(null, arguments);
+ };
+ };
+
+ var die = function (msg) {
+ return function () {
+ throw new Error(msg);
+ };
+ };
+
+ var apply = function (f) {
+ return f();
+ };
+
+ var call = function(f) {
+ f();
+ };
+
+ var never = constant(false);
+ var always = constant(true);
+
+
+ return {
+ noop: noop,
+ noarg: noarg,
+ compose: compose,
+ constant: constant,
+ identity: identity,
+ tripleEquals: tripleEquals,
+ curry: curry,
+ not: not,
+ die: die,
+ apply: apply,
+ call: call,
+ never: never,
+ always: always
+ };
+ }
+);
+
+defineGlobal("global!window", window);
+defineGlobal("global!Object", Object);
+define(
+ 'ephox.katamari.api.Option',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'global!Object'
+ ],
+
+ function (Fun, Object) {
+
+ var never = Fun.never;
+ var always = Fun.always;
+
+ /**
+ Option objects support the following methods:
+
+ fold :: this Option a -> ((() -> b, a -> b)) -> Option b
+
+ is :: this Option a -> a -> Boolean
+
+ isSome :: this Option a -> () -> Boolean
+
+ isNone :: this Option a -> () -> Boolean
+
+ getOr :: this Option a -> a -> a
+
+ getOrThunk :: this Option a -> (() -> a) -> a
+
+ getOrDie :: this Option a -> String -> a
+
+ or :: this Option a -> Option a -> Option a
+ - if some: return self
+ - if none: return opt
+
+ orThunk :: this Option a -> (() -> Option a) -> Option a
+ - Same as "or", but uses a thunk instead of a value
+
+ map :: this Option a -> (a -> b) -> Option b
+ - "fmap" operation on the Option Functor.
+ - same as 'each'
+
+ ap :: this Option a -> Option (a -> b) -> Option b
+ - "apply" operation on the Option Apply/Applicative.
+ - Equivalent to <*> in Haskell/PureScript.
+
+ each :: this Option a -> (a -> b) -> undefined
+ - similar to 'map', but doesn't return a value.
+ - intended for clarity when performing side effects.
+
+ bind :: this Option a -> (a -> Option b) -> Option b
+ - "bind"/"flatMap" operation on the Option Bind/Monad.
+ - Equivalent to >>= in Haskell/PureScript; flatMap in Scala.
+
+ flatten :: {this Option (Option a))} -> () -> Option a
+ - "flatten"/"join" operation on the Option Monad.
+
+ exists :: this Option a -> (a -> Boolean) -> Boolean
+
+ forall :: this Option a -> (a -> Boolean) -> Boolean
+
+ filter :: this Option a -> (a -> Boolean) -> Option a
+
+ equals :: this Option a -> Option a -> Boolean
+
+ equals_ :: this Option a -> (Option a, a -> Boolean) -> Boolean
+
+ toArray :: this Option a -> () -> [a]
+
+ */
+
+ var none = function () { return NONE; };
+
+ var NONE = (function () {
+ var eq = function (o) {
+ return o.isNone();
+ };
+
+ // inlined from peanut, maybe a micro-optimisation?
+ var call = function (thunk) { return thunk(); };
+ var id = function (n) { return n; };
+ var noop = function () { };
+
+ var me = {
+ fold: function (n, s) { return n(); },
+ is: never,
+ isSome: never,
+ isNone: always,
+ getOr: id,
+ getOrThunk: call,
+ getOrDie: function (msg) {
+ throw new Error(msg || 'error: getOrDie called on none.');
+ },
+ or: id,
+ orThunk: call,
+ map: none,
+ ap: none,
+ each: noop,
+ bind: none,
+ flatten: none,
+ exists: never,
+ forall: always,
+ filter: none,
+ equals: eq,
+ equals_: eq,
+ toArray: function () { return []; },
+ toString: Fun.constant("none()")
+ };
+ if (Object.freeze) Object.freeze(me);
+ return me;
+ })();
+
+
+ /** some :: a -> Option a */
+ var some = function (a) {
+
+ // inlined from peanut, maybe a micro-optimisation?
+ var constant_a = function () { return a; };
+
+ var self = function () {
+ // can't Fun.constant this one
+ return me;
+ };
+
+ var map = function (f) {
+ return some(f(a));
+ };
+
+ var bind = function (f) {
+ return f(a);
+ };
+
+ var me = {
+ fold: function (n, s) { return s(a); },
+ is: function (v) { return a === v; },
+ isSome: always,
+ isNone: never,
+ getOr: constant_a,
+ getOrThunk: constant_a,
+ getOrDie: constant_a,
+ or: self,
+ orThunk: self,
+ map: map,
+ ap: function (optfab) {
+ return optfab.fold(none, function(fab) {
+ return some(fab(a));
+ });
+ },
+ each: function (f) {
+ f(a);
+ },
+ bind: bind,
+ flatten: constant_a,
+ exists: bind,
+ forall: bind,
+ filter: function (f) {
+ return f(a) ? me : NONE;
+ },
+ equals: function (o) {
+ return o.is(a);
+ },
+ equals_: function (o, elementEq) {
+ return o.fold(
+ never,
+ function (b) { return elementEq(a, b); }
+ );
+ },
+ toArray: function () {
+ return [a];
+ },
+ toString: function () {
+ return 'some(' + a + ')';
+ }
+ };
+ return me;
+ };
+
+ /** from :: undefined|null|a -> Option a */
+ var from = function (value) {
+ return value === null || value === undefined ? NONE : some(value);
+ };
+
+ return {
+ some: some,
+ none: none,
+ from: from
+ };
+ }
+);
+
+defineGlobal("global!String", String);
+define(
+ 'ephox.katamari.api.Arr',
+
+ [
+ 'ephox.katamari.api.Option',
+ 'global!Array',
+ 'global!Error',
+ 'global!String'
+ ],
+
+ function (Option, Array, Error, String) {
+ // Use the native Array.indexOf if it is available (IE9+) otherwise fall back to manual iteration
+ // https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
+ var rawIndexOf = (function () {
+ var pIndexOf = Array.prototype.indexOf;
+
+ var fastIndex = function (xs, x) { return pIndexOf.call(xs, x); };
+
+ var slowIndex = function(xs, x) { return slowIndexOf(xs, x); };
+
+ return pIndexOf === undefined ? slowIndex : fastIndex;
+ })();
+
+ var indexOf = function (xs, x) {
+ // The rawIndexOf method does not wrap up in an option. This is for performance reasons.
+ var r = rawIndexOf(xs, x);
+ return r === -1 ? Option.none() : Option.some(r);
+ };
+
+ var contains = function (xs, x) {
+ return rawIndexOf(xs, x) > -1;
+ };
+
+ // Using findIndex is likely less optimal in Chrome (dynamic return type instead of bool)
+ // but if we need that micro-optimisation we can inline it later.
+ var exists = function (xs, pred) {
+ return findIndex(xs, pred).isSome();
+ };
+
+ var range = function (num, f) {
+ var r = [];
+ for (var i = 0; i < num; i++) {
+ r.push(f(i));
+ }
+ return r;
+ };
+
+ // It's a total micro optimisation, but these do make some difference.
+ // Particularly for browsers other than Chrome.
+ // - length caching
+ // http://jsperf.com/browser-diet-jquery-each-vs-for-loop/69
+ // - not using push
+ // http://jsperf.com/array-direct-assignment-vs-push/2
+
+ var chunk = function (array, size) {
+ var r = [];
+ for (var i = 0; i < array.length; i += size) {
+ var s = array.slice(i, i + size);
+ r.push(s);
+ }
+ return r;
+ };
+
+ var map = function(xs, f) {
+ // pre-allocating array size when it's guaranteed to be known
+ // http://jsperf.com/push-allocated-vs-dynamic/22
+ var len = xs.length;
+ var r = new Array(len);
+ for (var i = 0; i < len; i++) {
+ var x = xs[i];
+ r[i] = f(x, i, xs);
+ }
+ return r;
+ };
+
+ // Unwound implementing other functions in terms of each.
+ // The code size is roughly the same, and it should allow for better optimisation.
+ var each = function(xs, f) {
+ for (var i = 0, len = xs.length; i < len; i++) {
+ var x = xs[i];
+ f(x, i, xs);
+ }
+ };
+
+ var eachr = function (xs, f) {
+ for (var i = xs.length - 1; i >= 0; i--) {
+ var x = xs[i];
+ f(x, i, xs);
+ }
+ };
+
+ var partition = function(xs, pred) {
+ var pass = [];
+ var fail = [];
+ for (var i = 0, len = xs.length; i < len; i++) {
+ var x = xs[i];
+ var arr = pred(x, i, xs) ? pass : fail;
+ arr.push(x);
+ }
+ return { pass: pass, fail: fail };
+ };
+
+ var filter = function(xs, pred) {
+ var r = [];
+ for (var i = 0, len = xs.length; i < len; i++) {
+ var x = xs[i];
+ if (pred(x, i, xs)) {
+ r.push(x);
+ }
+ }
+ return r;
+ };
+
+ /*
+ * Groups an array into contiguous arrays of like elements. Whether an element is like or not depends on f.
+ *
+ * f is a function that derives a value from an element - e.g. true or false, or a string.
+ * Elements are like if this function generates the same value for them (according to ===).
+ *
+ *
+ * Order of the elements is preserved. Arr.flatten() on the result will return the original list, as with Haskell groupBy function.
+ * For a good explanation, see the group function (which is a special case of groupBy)
+ * http://hackage.haskell.org/package/base-4.7.0.0/docs/Data-List.html#v:group
+ */
+ var groupBy = function (xs, f) {
+ if (xs.length === 0) {
+ return [];
+ } else {
+ var wasType = f(xs[0]); // initial case for matching
+ var r = [];
+ var group = [];
+
+ for (var i = 0, len = xs.length; i < len; i++) {
+ var x = xs[i];
+ var type = f(x);
+ if (type !== wasType) {
+ r.push(group);
+ group = [];
+ }
+ wasType = type;
+ group.push(x);
+ }
+ if (group.length !== 0) {
+ r.push(group);
+ }
+ return r;
+ }
+ };
+
+ var foldr = function (xs, f, acc) {
+ eachr(xs, function (x) {
+ acc = f(acc, x);
+ });
+ return acc;
+ };
+
+ var foldl = function (xs, f, acc) {
+ each(xs, function (x) {
+ acc = f(acc, x);
+ });
+ return acc;
+ };
+
+ var find = function (xs, pred) {
+ for (var i = 0, len = xs.length; i < len; i++) {
+ var x = xs[i];
+ if (pred(x, i, xs)) {
+ return Option.some(x);
+ }
+ }
+ return Option.none();
+ };
+
+ var findIndex = function (xs, pred) {
+ for (var i = 0, len = xs.length; i < len; i++) {
+ var x = xs[i];
+ if (pred(x, i, xs)) {
+ return Option.some(i);
+ }
+ }
+
+ return Option.none();
+ };
+
+ var slowIndexOf = function (xs, x) {
+ for (var i = 0, len = xs.length; i < len; ++i) {
+ if (xs[i] === x) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ var push = Array.prototype.push;
+ var flatten = function (xs) {
+ // Note, this is possible because push supports multiple arguments:
+ // http://jsperf.com/concat-push/6
+ // Note that in the past, concat() would silently work (very slowly) for array-like objects.
+ // With this change it will throw an error.
+ var r = [];
+ for (var i = 0, len = xs.length; i < len; ++i) {
+ // Ensure that each value is an array itself
+ if (! Array.prototype.isPrototypeOf(xs[i])) throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
+ push.apply(r, xs[i]);
+ }
+ return r;
+ };
+
+ var bind = function (xs, f) {
+ var output = map(xs, f);
+ return flatten(output);
+ };
+
+ var forall = function (xs, pred) {
+ for (var i = 0, len = xs.length; i < len; ++i) {
+ var x = xs[i];
+ if (pred(x, i, xs) !== true) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ var equal = function (a1, a2) {
+ return a1.length === a2.length && forall(a1, function (x, i) {
+ return x === a2[i];
+ });
+ };
+
+ var slice = Array.prototype.slice;
+ var reverse = function (xs) {
+ var r = slice.call(xs, 0);
+ r.reverse();
+ return r;
+ };
+
+ var difference = function (a1, a2) {
+ return filter(a1, function (x) {
+ return !contains(a2, x);
+ });
+ };
+
+ var mapToObject = function(xs, f) {
+ var r = {};
+ for (var i = 0, len = xs.length; i < len; i++) {
+ var x = xs[i];
+ r[String(x)] = f(x, i);
+ }
+ return r;
+ };
+
+ var pure = function(x) {
+ return [x];
+ };
+
+ var sort = function (xs, comparator) {
+ var copy = slice.call(xs, 0);
+ copy.sort(comparator);
+ return copy;
+ };
+
+ var head = function (xs) {
+ return xs.length === 0 ? Option.none() : Option.some(xs[0]);
+ };
+
+ var last = function (xs) {
+ return xs.length === 0 ? Option.none() : Option.some(xs[xs.length - 1]);
+ };
+
+ return {
+ map: map,
+ each: each,
+ eachr: eachr,
+ partition: partition,
+ filter: filter,
+ groupBy: groupBy,
+ indexOf: indexOf,
+ foldr: foldr,
+ foldl: foldl,
+ find: find,
+ findIndex: findIndex,
+ flatten: flatten,
+ bind: bind,
+ forall: forall,
+ exists: exists,
+ contains: contains,
+ equal: equal,
+ reverse: reverse,
+ chunk: chunk,
+ difference: difference,
+ mapToObject: mapToObject,
+ pure: pure,
+ sort: sort,
+ range: range,
+ head: head,
+ last: last
+ };
+ }
+);
+defineGlobal("global!document", document);
+define(
+ 'ephox.katamari.api.Global',
+
+ [
+ ],
+
+ function () {
+ // Use window object as the global if it's available since CSP will block script evals
+ var global = typeof window !== 'undefined' ? window : Function('return this;')();
+ return global;
+ }
+);
+
+
+define(
+ 'ephox.katamari.api.Resolve',
+
+ [
+ 'ephox.katamari.api.Global'
+ ],
+
+ function (Global) {
+ /** path :: ([String], JsObj?) -> JsObj */
+ var path = function (parts, scope) {
+ var o = scope !== undefined ? scope : Global;
+ for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i)
+ o = o[parts[i]];
+ return o;
+ };
+
+ /** resolve :: (String, JsObj?) -> JsObj */
+ var resolve = function (p, scope) {
+ var parts = p.split('.');
+ return path(parts, scope);
+ };
+
+ /** step :: (JsObj, String) -> JsObj */
+ var step = function (o, part) {
+ if (o[part] === undefined || o[part] === null)
+ o[part] = {};
+ return o[part];
+ };
+
+ /** forge :: ([String], JsObj?) -> JsObj */
+ var forge = function (parts, target) {
+ var o = target !== undefined ? target : Global;
+ for (var i = 0; i < parts.length; ++i)
+ o = step(o, parts[i]);
+ return o;
+ };
+
+ /** namespace :: (String, JsObj?) -> JsObj */
+ var namespace = function (name, target) {
+ var parts = name.split('.');
+ return forge(parts, target);
+ };
+
+ return {
+ path: path,
+ resolve: resolve,
+ forge: forge,
+ namespace: namespace
+ };
+ }
+);
+
+
+define(
+ 'ephox.sand.util.Global',
+
+ [
+ 'ephox.katamari.api.Resolve'
+ ],
+
+ function (Resolve) {
+ var unsafe = function (name, scope) {
+ return Resolve.resolve(name, scope);
+ };
+
+ var getOrDie = function (name, scope) {
+ var actual = unsafe(name, scope);
+
+ if (actual === undefined) throw name + ' not available on this browser';
+ return actual;
+ };
+
+ return {
+ getOrDie: getOrDie
+ };
+ }
+);
+define(
+ 'ephox.sand.api.URL',
+
+ [
+ 'ephox.sand.util.Global'
+ ],
+
+ function (Global) {
+ /*
+ * IE10 and above per
+ * https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL
+ *
+ * Also Safari 6.1+
+ * Safari 6.0 has 'webkitURL' instead, but doesn't support flexbox so we
+ * aren't supporting it anyway
+ */
+ var url = function () {
+ return Global.getOrDie('URL');
+ };
+
+ var createObjectURL = function (blob) {
+ return url().createObjectURL(blob);
+ };
+
+ var revokeObjectURL = function (u) {
+ url().revokeObjectURL(u);
+ };
+
+ return {
+ createObjectURL: createObjectURL,
+ revokeObjectURL: revokeObjectURL
+ };
+ }
+);
+defineGlobal("global!matchMedia", matchMedia);
+defineGlobal("global!navigator", navigator);
+/**
+ * Env.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class contains various environment constants like browser versions etc.
+ * Normally you don't want to sniff specific browser versions but sometimes you have
+ * to when it's impossible to feature detect. So use this with care.
+ *
+ * @class tinymce.Env
+ * @static
+ */
+define(
+ 'tinymce.core.Env',
+ [
+ 'ephox.sand.api.URL',
+ 'global!document',
+ 'global!matchMedia',
+ 'global!navigator',
+ 'global!window'
+ ],
+ function (URL, document, matchMedia, navigator, window) {
+ var nav = navigator, userAgent = nav.userAgent;
+ var opera, webkit, ie, ie11, ie12, gecko, mac, iDevice, android, fileApi, phone, tablet, windowsPhone;
+
+ var matchMediaQuery = function (query) {
+ return "matchMedia" in window ? matchMedia(query).matches : false;
+ };
+
+ opera = window.opera && window.opera.buildNumber;
+ android = /Android/.test(userAgent);
+ webkit = /WebKit/.test(userAgent);
+ ie = !webkit && !opera && (/MSIE/gi).test(userAgent) && (/Explorer/gi).test(nav.appName);
+ ie = ie && /MSIE (\w+)\./.exec(userAgent)[1];
+ ie11 = userAgent.indexOf('Trident/') != -1 && (userAgent.indexOf('rv:') != -1 || nav.appName.indexOf('Netscape') != -1) ? 11 : false;
+ ie12 = (userAgent.indexOf('Edge/') != -1 && !ie && !ie11) ? 12 : false;
+ ie = ie || ie11 || ie12;
+ gecko = !webkit && !ie11 && /Gecko/.test(userAgent);
+ mac = userAgent.indexOf('Mac') != -1;
+ iDevice = /(iPad|iPhone)/.test(userAgent);
+ fileApi = "FormData" in window && "FileReader" in window && "URL" in window && !!URL.createObjectURL;
+ phone = matchMediaQuery("only screen and (max-device-width: 480px)") && (android || iDevice);
+ tablet = matchMediaQuery("only screen and (min-width: 800px)") && (android || iDevice);
+ windowsPhone = userAgent.indexOf('Windows Phone') != -1;
+
+ if (ie12) {
+ webkit = false;
+ }
+
+ // Is a iPad/iPhone and not on iOS5 sniff the WebKit version since older iOS WebKit versions
+ // says it has contentEditable support but there is no visible caret.
+ var contentEditable = !iDevice || fileApi || userAgent.match(/AppleWebKit\/(\d*)/)[1] >= 534;
+
+ return {
+ /**
+ * Constant that is true if the browser is Opera.
+ *
+ * @property opera
+ * @type Boolean
+ * @final
+ */
+ opera: opera,
+
+ /**
+ * Constant that is true if the browser is WebKit (Safari/Chrome).
+ *
+ * @property webKit
+ * @type Boolean
+ * @final
+ */
+ webkit: webkit,
+
+ /**
+ * Constant that is more than zero if the browser is IE.
+ *
+ * @property ie
+ * @type Boolean
+ * @final
+ */
+ ie: ie,
+
+ /**
+ * Constant that is true if the browser is Gecko.
+ *
+ * @property gecko
+ * @type Boolean
+ * @final
+ */
+ gecko: gecko,
+
+ /**
+ * Constant that is true if the os is Mac OS.
+ *
+ * @property mac
+ * @type Boolean
+ * @final
+ */
+ mac: mac,
+
+ /**
+ * Constant that is true if the os is iOS.
+ *
+ * @property iOS
+ * @type Boolean
+ * @final
+ */
+ iOS: iDevice,
+
+ /**
+ * Constant that is true if the os is android.
+ *
+ * @property android
+ * @type Boolean
+ * @final
+ */
+ android: android,
+
+ /**
+ * Constant that is true if the browser supports editing.
+ *
+ * @property contentEditable
+ * @type Boolean
+ * @final
+ */
+ contentEditable: contentEditable,
+
+ /**
+ * Transparent image data url.
+ *
+ * @property transparentSrc
+ * @type Boolean
+ * @final
+ */
+ transparentSrc: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
+
+ /**
+ * Returns true/false if the browser can or can't place the caret after a inline block like an image.
+ *
+ * @property noCaretAfter
+ * @type Boolean
+ * @final
+ */
+ caretAfter: ie != 8,
+
+ /**
+ * Constant that is true if the browser supports native DOM Ranges. IE 9+.
+ *
+ * @property range
+ * @type Boolean
+ */
+ range: window.getSelection && "Range" in window,
+
+ /**
+ * Returns the IE document mode for non IE browsers this will fake IE 10.
+ *
+ * @property documentMode
+ * @type Number
+ */
+ documentMode: ie && !ie12 ? (document.documentMode || 7) : 10,
+
+ /**
+ * Constant that is true if the browser has a modern file api.
+ *
+ * @property fileApi
+ * @type Boolean
+ */
+ fileApi: fileApi,
+
+ /**
+ * Constant that is true if the browser supports contentEditable=false regions.
+ *
+ * @property ceFalse
+ * @type Boolean
+ */
+ ceFalse: (ie === false || ie > 8),
+
+ /**
+ * Constant if CSP mode is possible or not. Meaning we can't use script urls for the iframe.
+ */
+ canHaveCSP: (ie === false || ie > 11),
+
+ desktop: !phone && !tablet,
+ windowsPhone: windowsPhone
+ };
+ }
+);
+
+defineGlobal("global!clearInterval", clearInterval);
+defineGlobal("global!clearTimeout", clearTimeout);
+defineGlobal("global!setInterval", setInterval);
+defineGlobal("global!setTimeout", setTimeout);
+/**
+ * Promise.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * Promise polyfill under MIT license: https://github.com/taylorhakes/promise-polyfill
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/* eslint-disable */
+/* jshint ignore:start */
+
+/**
+ * Modifed to be a feature fill and wrapped as tinymce module.
+ */
+define(
+ 'tinymce.core.util.Promise',
+ [],
+ function () {
+ if (window.Promise) {
+ return window.Promise;
+ }
+
+ // Use polyfill for setImmediate for performance gains
+ var asap = Promise.immediateFn || (typeof setImmediate === 'function' && setImmediate) ||
+ function (fn) { setTimeout(fn, 1); };
+
+ // Polyfill for Function.prototype.bind
+ function bind(fn, thisArg) {
+ return function () {
+ fn.apply(thisArg, arguments);
+ };
+ }
+
+ var isArray = Array.isArray || function (value) { return Object.prototype.toString.call(value) === "[object Array]"; };
+
+ function Promise(fn) {
+ if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new');
+ if (typeof fn !== 'function') throw new TypeError('not a function');
+ this._state = null;
+ this._value = null;
+ this._deferreds = [];
+
+ doResolve(fn, bind(resolve, this), bind(reject, this));
+ }
+
+ function handle(deferred) {
+ var me = this;
+ if (this._state === null) {
+ this._deferreds.push(deferred);
+ return;
+ }
+ asap(function () {
+ var cb = me._state ? deferred.onFulfilled : deferred.onRejected;
+ if (cb === null) {
+ (me._state ? deferred.resolve : deferred.reject)(me._value);
+ return;
+ }
+ var ret;
+ try {
+ ret = cb(me._value);
+ }
+ catch (e) {
+ deferred.reject(e);
+ return;
+ }
+ deferred.resolve(ret);
+ });
+ }
+
+ function resolve(newValue) {
+ try { //Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
+ if (newValue === this) throw new TypeError('A promise cannot be resolved with itself.');
+ if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
+ var then = newValue.then;
+ if (typeof then === 'function') {
+ doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this));
+ return;
+ }
+ }
+ this._state = true;
+ this._value = newValue;
+ finale.call(this);
+ } catch (e) { reject.call(this, e); }
+ }
+
+ function reject(newValue) {
+ this._state = false;
+ this._value = newValue;
+ finale.call(this);
+ }
+
+ function finale() {
+ for (var i = 0, len = this._deferreds.length; i < len; i++) {
+ handle.call(this, this._deferreds[i]);
+ }
+ this._deferreds = null;
+ }
+
+ function Handler(onFulfilled, onRejected, resolve, reject) {
+ this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
+ this.onRejected = typeof onRejected === 'function' ? onRejected : null;
+ this.resolve = resolve;
+ this.reject = reject;
+ }
+
+ /**
+ * Take a potentially misbehaving resolver function and make sure
+ * onFulfilled and onRejected are only called once.
+ *
+ * Makes no guarantees about asynchrony.
+ */
+ function doResolve(fn, onFulfilled, onRejected) {
+ var done = false;
+ try {
+ fn(function (value) {
+ if (done) return;
+ done = true;
+ onFulfilled(value);
+ }, function (reason) {
+ if (done) return;
+ done = true;
+ onRejected(reason);
+ });
+ } catch (ex) {
+ if (done) return;
+ done = true;
+ onRejected(ex);
+ }
+ }
+
+ Promise.prototype['catch'] = function (onRejected) {
+ return this.then(null, onRejected);
+ };
+
+ Promise.prototype.then = function (onFulfilled, onRejected) {
+ var me = this;
+ return new Promise(function (resolve, reject) {
+ handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject));
+ });
+ };
+
+ Promise.all = function () {
+ var args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments);
+
+ return new Promise(function (resolve, reject) {
+ if (args.length === 0) return resolve([]);
+ var remaining = args.length;
+ function res(i, val) {
+ try {
+ if (val && (typeof val === 'object' || typeof val === 'function')) {
+ var then = val.then;
+ if (typeof then === 'function') {
+ then.call(val, function (val) { res(i, val); }, reject);
+ return;
+ }
+ }
+ args[i] = val;
+ if (--remaining === 0) {
+ resolve(args);
+ }
+ } catch (ex) {
+ reject(ex);
+ }
+ }
+ for (var i = 0; i < args.length; i++) {
+ res(i, args[i]);
+ }
+ });
+ };
+
+ Promise.resolve = function (value) {
+ if (value && typeof value === 'object' && value.constructor === Promise) {
+ return value;
+ }
+
+ return new Promise(function (resolve) {
+ resolve(value);
+ });
+ };
+
+ Promise.reject = function (value) {
+ return new Promise(function (resolve, reject) {
+ reject(value);
+ });
+ };
+
+ Promise.race = function (values) {
+ return new Promise(function (resolve, reject) {
+ for (var i = 0, len = values.length; i < len; i++) {
+ values[i].then(resolve, reject);
+ }
+ });
+ };
+
+ return Promise;
+ }
+);
+
+/* jshint ignore:end */
+/* eslint-enable */
+/**
+ * Delay.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Utility class for working with delayed actions like setTimeout.
+ *
+ * @class tinymce.util.Delay
+ */
+define(
+ 'tinymce.core.util.Delay',
+ [
+ 'global!clearInterval',
+ 'global!clearTimeout',
+ 'global!document',
+ 'global!setInterval',
+ 'global!setTimeout',
+ 'global!window',
+ 'tinymce.core.util.Promise'
+ ],
+ function (clearInterval, clearTimeout, document, setInterval, setTimeout, window, Promise) {
+ var requestAnimationFramePromise;
+
+ var requestAnimationFrame = function (callback, element) {
+ var i, requestAnimationFrameFunc = window.requestAnimationFrame, vendors = ['ms', 'moz', 'webkit'];
+
+ var featurefill = function (callback) {
+ window.setTimeout(callback, 0);
+ };
+
+ for (i = 0; i < vendors.length && !requestAnimationFrameFunc; i++) {
+ requestAnimationFrameFunc = window[vendors[i] + 'RequestAnimationFrame'];
+ }
+
+ if (!requestAnimationFrameFunc) {
+ requestAnimationFrameFunc = featurefill;
+ }
+
+ requestAnimationFrameFunc(callback, element);
+ };
+
+ var wrappedSetTimeout = function (callback, time) {
+ if (typeof time != 'number') {
+ time = 0;
+ }
+
+ return setTimeout(callback, time);
+ };
+
+ var wrappedSetInterval = function (callback, time) {
+ if (typeof time != 'number') {
+ time = 1; // IE 8 needs it to be > 0
+ }
+
+ return setInterval(callback, time);
+ };
+
+ var wrappedClearTimeout = function (id) {
+ return clearTimeout(id);
+ };
+
+ var wrappedClearInterval = function (id) {
+ return clearInterval(id);
+ };
+
+ var debounce = function (callback, time) {
+ var timer, func;
+
+ func = function () {
+ var args = arguments;
+
+ clearTimeout(timer);
+
+ timer = wrappedSetTimeout(function () {
+ callback.apply(this, args);
+ }, time);
+ };
+
+ func.stop = function () {
+ clearTimeout(timer);
+ };
+
+ return func;
+ };
+
+ return {
+ /**
+ * Requests an animation frame and fallbacks to a timeout on older browsers.
+ *
+ * @method requestAnimationFrame
+ * @param {function} callback Callback to execute when a new frame is available.
+ * @param {DOMElement} element Optional element to scope it to.
+ */
+ requestAnimationFrame: function (callback, element) {
+ if (requestAnimationFramePromise) {
+ requestAnimationFramePromise.then(callback);
+ return;
+ }
+
+ requestAnimationFramePromise = new Promise(function (resolve) {
+ if (!element) {
+ element = document.body;
+ }
+
+ requestAnimationFrame(resolve, element);
+ }).then(callback);
+ },
+
+ /**
+ * Sets a timer in ms and executes the specified callback when the timer runs out.
+ *
+ * @method setTimeout
+ * @param {function} callback Callback to execute when timer runs out.
+ * @param {Number} time Optional time to wait before the callback is executed, defaults to 0.
+ * @return {Number} Timeout id number.
+ */
+ setTimeout: wrappedSetTimeout,
+
+ /**
+ * Sets an interval timer in ms and executes the specified callback at every interval of that time.
+ *
+ * @method setInterval
+ * @param {function} callback Callback to execute when interval time runs out.
+ * @param {Number} time Optional time to wait before the callback is executed, defaults to 0.
+ * @return {Number} Timeout id number.
+ */
+ setInterval: wrappedSetInterval,
+
+ /**
+ * Sets an editor timeout it's similar to setTimeout except that it checks if the editor instance is
+ * still alive when the callback gets executed.
+ *
+ * @method setEditorTimeout
+ * @param {tinymce.Editor} editor Editor instance to check the removed state on.
+ * @param {function} callback Callback to execute when timer runs out.
+ * @param {Number} time Optional time to wait before the callback is executed, defaults to 0.
+ * @return {Number} Timeout id number.
+ */
+ setEditorTimeout: function (editor, callback, time) {
+ return wrappedSetTimeout(function () {
+ if (!editor.removed) {
+ callback();
+ }
+ }, time);
+ },
+
+ /**
+ * Sets an interval timer it's similar to setInterval except that it checks if the editor instance is
+ * still alive when the callback gets executed.
+ *
+ * @method setEditorInterval
+ * @param {function} callback Callback to execute when interval time runs out.
+ * @param {Number} time Optional time to wait before the callback is executed, defaults to 0.
+ * @return {Number} Timeout id number.
+ */
+ setEditorInterval: function (editor, callback, time) {
+ var timer;
+
+ timer = wrappedSetInterval(function () {
+ if (!editor.removed) {
+ callback();
+ } else {
+ clearInterval(timer);
+ }
+ }, time);
+
+ return timer;
+ },
+
+ /**
+ * Creates debounced callback function that only gets executed once within the specified time.
+ *
+ * @method debounce
+ * @param {function} callback Callback to execute when timer finishes.
+ * @param {Number} time Optional time to wait before the callback is executed, defaults to 0.
+ * @return {Function} debounced function callback.
+ */
+ debounce: debounce,
+
+ // Throttle needs to be debounce due to backwards compatibility.
+ throttle: debounce,
+
+ /**
+ * Clears an interval timer so it won't execute.
+ *
+ * @method clearInterval
+ * @param {Number} Interval timer id number.
+ */
+ clearInterval: wrappedClearInterval,
+
+ /**
+ * Clears an timeout timer so it won't execute.
+ *
+ * @method clearTimeout
+ * @param {Number} Timeout timer id number.
+ */
+ clearTimeout: wrappedClearTimeout
+ };
+ }
+);
+
+/**
+ * EventUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/*jshint loopfunc:true*/
+/*eslint no-loop-func:0 */
+
+/**
+ * This class wraps the browsers native event logic with more convenient methods.
+ *
+ * @class tinymce.dom.EventUtils
+ */
+define(
+ 'tinymce.core.dom.EventUtils',
+ [
+ 'global!document',
+ 'global!window',
+ 'tinymce.core.Env',
+ 'tinymce.core.util.Delay'
+ ],
+ function (document, window, Env, Delay) {
+ "use strict";
+
+ var eventExpandoPrefix = "mce-data-";
+ var mouseEventRe = /^(?:mouse|contextmenu)|click/;
+ var deprecated = {
+ keyLocation: 1, layerX: 1, layerY: 1, returnValue: 1,
+ webkitMovementX: 1, webkitMovementY: 1, keyIdentifier: 1
+ };
+
+ // Checks if it is our own isDefaultPrevented function
+ var hasIsDefaultPrevented = function (event) {
+ return event.isDefaultPrevented === returnTrue || event.isDefaultPrevented === returnFalse;
+ };
+
+ // Dummy function that gets replaced on the delegation state functions
+ var returnFalse = function () {
+ return false;
+ };
+
+ // Dummy function that gets replaced on the delegation state functions
+ var returnTrue = function () {
+ return true;
+ };
+
+ /**
+ * Binds a native event to a callback on the speified target.
+ */
+ var addEvent = function (target, name, callback, capture) {
+ if (target.addEventListener) {
+ target.addEventListener(name, callback, capture || false);
+ } else if (target.attachEvent) {
+ target.attachEvent('on' + name, callback);
+ }
+ };
+
+ /**
+ * Unbinds a native event callback on the specified target.
+ */
+ var removeEvent = function (target, name, callback, capture) {
+ if (target.removeEventListener) {
+ target.removeEventListener(name, callback, capture || false);
+ } else if (target.detachEvent) {
+ target.detachEvent('on' + name, callback);
+ }
+ };
+
+ /**
+ * Gets the event target based on shadow dom properties like path and deepPath.
+ */
+ var getTargetFromShadowDom = function (event, defaultTarget) {
+ var path, target = defaultTarget;
+
+ // When target element is inside Shadow DOM we need to take first element from path
+ // otherwise we'll get Shadow Root parent, not actual target element
+
+ // Normalize target for WebComponents v0 implementation (in Chrome)
+ path = event.path;
+ if (path && path.length > 0) {
+ target = path[0];
+ }
+
+ // Normalize target for WebComponents v1 implementation (standard)
+ if (event.deepPath) {
+ path = event.deepPath();
+ if (path && path.length > 0) {
+ target = path[0];
+ }
+ }
+
+ return target;
+ };
+
+ /**
+ * Normalizes a native event object or just adds the event specific methods on a custom event.
+ */
+ var fix = function (originalEvent, data) {
+ var name, event = data || {}, undef;
+
+ // Copy all properties from the original event
+ for (name in originalEvent) {
+ // layerX/layerY is deprecated in Chrome and produces a warning
+ if (!deprecated[name]) {
+ event[name] = originalEvent[name];
+ }
+ }
+
+ // Normalize target IE uses srcElement
+ if (!event.target) {
+ event.target = event.srcElement || document;
+ }
+
+ // Experimental shadow dom support
+ if (Env.experimentalShadowDom) {
+ event.target = getTargetFromShadowDom(originalEvent, event.target);
+ }
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if (originalEvent && mouseEventRe.test(originalEvent.type) && originalEvent.pageX === undef && originalEvent.clientX !== undef) {
+ var eventDoc = event.target.ownerDocument || document;
+ var doc = eventDoc.documentElement;
+ var body = eventDoc.body;
+
+ event.pageX = originalEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) -
+ (doc && doc.clientLeft || body && body.clientLeft || 0);
+
+ event.pageY = originalEvent.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) -
+ (doc && doc.clientTop || body && body.clientTop || 0);
+ }
+
+ // Add preventDefault method
+ event.preventDefault = function () {
+ event.isDefaultPrevented = returnTrue;
+
+ // Execute preventDefault on the original event object
+ if (originalEvent) {
+ if (originalEvent.preventDefault) {
+ originalEvent.preventDefault();
+ } else {
+ originalEvent.returnValue = false; // IE
+ }
+ }
+ };
+
+ // Add stopPropagation
+ event.stopPropagation = function () {
+ event.isPropagationStopped = returnTrue;
+
+ // Execute stopPropagation on the original event object
+ if (originalEvent) {
+ if (originalEvent.stopPropagation) {
+ originalEvent.stopPropagation();
+ } else {
+ originalEvent.cancelBubble = true; // IE
+ }
+ }
+ };
+
+ // Add stopImmediatePropagation
+ event.stopImmediatePropagation = function () {
+ event.isImmediatePropagationStopped = returnTrue;
+ event.stopPropagation();
+ };
+
+ // Add event delegation states
+ if (hasIsDefaultPrevented(event) === false) {
+ event.isDefaultPrevented = returnFalse;
+ event.isPropagationStopped = returnFalse;
+ event.isImmediatePropagationStopped = returnFalse;
+ }
+
+ // Add missing metaKey for IE 8
+ if (typeof event.metaKey == 'undefined') {
+ event.metaKey = false;
+ }
+
+ return event;
+ };
+
+ /**
+ * Bind a DOMContentLoaded event across browsers and executes the callback once the page DOM is initialized.
+ * It will also set/check the domLoaded state of the event_utils instance so ready isn't called multiple times.
+ */
+ var bindOnReady = function (win, callback, eventUtils) {
+ var doc = win.document, event = { type: 'ready' };
+
+ if (eventUtils.domLoaded) {
+ callback(event);
+ return;
+ }
+
+ var isDocReady = function () {
+ // Check complete or interactive state if there is a body
+ // element on some iframes IE 8 will produce a null body
+ return doc.readyState === "complete" || (doc.readyState === "interactive" && doc.body);
+ };
+
+ // Gets called when the DOM is ready
+ var readyHandler = function () {
+ if (!eventUtils.domLoaded) {
+ eventUtils.domLoaded = true;
+ callback(event);
+ }
+ };
+
+ var waitForDomLoaded = function () {
+ if (isDocReady()) {
+ removeEvent(doc, "readystatechange", waitForDomLoaded);
+ readyHandler();
+ }
+ };
+
+ var tryScroll = function () {
+ try {
+ // If IE is used, use the trick by Diego Perini licensed under MIT by request to the author.
+ // http://javascript.nwbox.com/IEContentLoaded/
+ doc.documentElement.doScroll("left");
+ } catch (ex) {
+ Delay.setTimeout(tryScroll);
+ return;
+ }
+
+ readyHandler();
+ };
+
+ // Use W3C method (exclude IE 9,10 - readyState "interactive" became valid only in IE 11)
+ if (doc.addEventListener && !(Env.ie && Env.ie < 11)) {
+ if (isDocReady()) {
+ readyHandler();
+ } else {
+ addEvent(win, 'DOMContentLoaded', readyHandler);
+ }
+ } else {
+ // Use IE method
+ addEvent(doc, "readystatechange", waitForDomLoaded);
+
+ // Wait until we can scroll, when we can the DOM is initialized
+ if (doc.documentElement.doScroll && win.self === win.top) {
+ tryScroll();
+ }
+ }
+
+ // Fallback if any of the above methods should fail for some odd reason
+ addEvent(win, 'load', readyHandler);
+ };
+
+ /**
+ * This class enables you to bind/unbind native events to elements and normalize it's behavior across browsers.
+ */
+ var EventUtils = function () {
+ var self = this, events = {}, count, expando, hasFocusIn, hasMouseEnterLeave, mouseEnterLeave;
+
+ expando = eventExpandoPrefix + (+new Date()).toString(32);
+ hasMouseEnterLeave = "onmouseenter" in document.documentElement;
+ hasFocusIn = "onfocusin" in document.documentElement;
+ mouseEnterLeave = { mouseenter: 'mouseover', mouseleave: 'mouseout' };
+ count = 1;
+
+ // State if the DOMContentLoaded was executed or not
+ self.domLoaded = false;
+ self.events = events;
+
+ /**
+ * Executes all event handler callbacks for a specific event.
+ *
+ * @private
+ * @param {Event} evt Event object.
+ * @param {String} id Expando id value to look for.
+ */
+ var executeHandlers = function (evt, id) {
+ var callbackList, i, l, callback, container = events[id];
+
+ callbackList = container && container[evt.type];
+ if (callbackList) {
+ for (i = 0, l = callbackList.length; i < l; i++) {
+ callback = callbackList[i];
+
+ // Check if callback exists might be removed if a unbind is called inside the callback
+ if (callback && callback.func.call(callback.scope, evt) === false) {
+ evt.preventDefault();
+ }
+
+ // Should we stop propagation to immediate listeners
+ if (evt.isImmediatePropagationStopped()) {
+ return;
+ }
+ }
+ }
+ };
+
+ /**
+ * Binds a callback to an event on the specified target.
+ *
+ * @method bind
+ * @param {Object} target Target node/window or custom object.
+ * @param {String} names Name of the event to bind.
+ * @param {function} callback Callback function to execute when the event occurs.
+ * @param {Object} scope Scope to call the callback function on, defaults to target.
+ * @return {function} Callback function that got bound.
+ */
+ self.bind = function (target, names, callback, scope) {
+ var id, callbackList, i, name, fakeName, nativeHandler, capture, win = window;
+
+ // Native event handler function patches the event and executes the callbacks for the expando
+ var defaultNativeHandler = function (evt) {
+ executeHandlers(fix(evt || win.event), id);
+ };
+
+ // Don't bind to text nodes or comments
+ if (!target || target.nodeType === 3 || target.nodeType === 8) {
+ return;
+ }
+
+ // Create or get events id for the target
+ if (!target[expando]) {
+ id = count++;
+ target[expando] = id;
+ events[id] = {};
+ } else {
+ id = target[expando];
+ }
+
+ // Setup the specified scope or use the target as a default
+ scope = scope || target;
+
+ // Split names and bind each event, enables you to bind multiple events with one call
+ names = names.split(' ');
+ i = names.length;
+ while (i--) {
+ name = names[i];
+ nativeHandler = defaultNativeHandler;
+ fakeName = capture = false;
+
+ // Use ready instead of DOMContentLoaded
+ if (name === "DOMContentLoaded") {
+ name = "ready";
+ }
+
+ // DOM is already ready
+ if (self.domLoaded && name === "ready" && target.readyState == 'complete') {
+ callback.call(scope, fix({ type: name }));
+ continue;
+ }
+
+ // Handle mouseenter/mouseleaver
+ if (!hasMouseEnterLeave) {
+ fakeName = mouseEnterLeave[name];
+
+ if (fakeName) {
+ nativeHandler = function (evt) {
+ var current, related;
+
+ current = evt.currentTarget;
+ related = evt.relatedTarget;
+
+ // Check if related is inside the current target if it's not then the event should
+ // be ignored since it's a mouseover/mouseout inside the element
+ if (related && current.contains) {
+ // Use contains for performance
+ related = current.contains(related);
+ } else {
+ while (related && related !== current) {
+ related = related.parentNode;
+ }
+ }
+
+ // Fire fake event
+ if (!related) {
+ evt = fix(evt || win.event);
+ evt.type = evt.type === 'mouseout' ? 'mouseleave' : 'mouseenter';
+ evt.target = current;
+ executeHandlers(evt, id);
+ }
+ };
+ }
+ }
+
+ // Fake bubbling of focusin/focusout
+ if (!hasFocusIn && (name === "focusin" || name === "focusout")) {
+ capture = true;
+ fakeName = name === "focusin" ? "focus" : "blur";
+ nativeHandler = function (evt) {
+ evt = fix(evt || win.event);
+ evt.type = evt.type === 'focus' ? 'focusin' : 'focusout';
+ executeHandlers(evt, id);
+ };
+ }
+
+ // Setup callback list and bind native event
+ callbackList = events[id][name];
+ if (!callbackList) {
+ events[id][name] = callbackList = [{ func: callback, scope: scope }];
+ callbackList.fakeName = fakeName;
+ callbackList.capture = capture;
+ //callbackList.callback = callback;
+
+ // Add the nativeHandler to the callback list so that we can later unbind it
+ callbackList.nativeHandler = nativeHandler;
+
+ // Check if the target has native events support
+
+ if (name === "ready") {
+ bindOnReady(target, nativeHandler, self);
+ } else {
+ addEvent(target, fakeName || name, nativeHandler, capture);
+ }
+ } else {
+ if (name === "ready" && self.domLoaded) {
+ callback({ type: name });
+ } else {
+ // If it already has an native handler then just push the callback
+ callbackList.push({ func: callback, scope: scope });
+ }
+ }
+ }
+
+ target = callbackList = 0; // Clean memory for IE
+
+ return callback;
+ };
+
+ /**
+ * Unbinds the specified event by name, name and callback or all events on the target.
+ *
+ * @method unbind
+ * @param {Object} target Target node/window or custom object.
+ * @param {String} names Optional event name to unbind.
+ * @param {function} callback Optional callback function to unbind.
+ * @return {EventUtils} Event utils instance.
+ */
+ self.unbind = function (target, names, callback) {
+ var id, callbackList, i, ci, name, eventMap;
+
+ // Don't bind to text nodes or comments
+ if (!target || target.nodeType === 3 || target.nodeType === 8) {
+ return self;
+ }
+
+ // Unbind event or events if the target has the expando
+ id = target[expando];
+ if (id) {
+ eventMap = events[id];
+
+ // Specific callback
+ if (names) {
+ names = names.split(' ');
+ i = names.length;
+ while (i--) {
+ name = names[i];
+ callbackList = eventMap[name];
+
+ // Unbind the event if it exists in the map
+ if (callbackList) {
+ // Remove specified callback
+ if (callback) {
+ ci = callbackList.length;
+ while (ci--) {
+ if (callbackList[ci].func === callback) {
+ var nativeHandler = callbackList.nativeHandler;
+ var fakeName = callbackList.fakeName, capture = callbackList.capture;
+
+ // Clone callbackList since unbind inside a callback would otherwise break the handlers loop
+ callbackList = callbackList.slice(0, ci).concat(callbackList.slice(ci + 1));
+ callbackList.nativeHandler = nativeHandler;
+ callbackList.fakeName = fakeName;
+ callbackList.capture = capture;
+
+ eventMap[name] = callbackList;
+ }
+ }
+ }
+
+ // Remove all callbacks if there isn't a specified callback or there is no callbacks left
+ if (!callback || callbackList.length === 0) {
+ delete eventMap[name];
+ removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
+ }
+ }
+ }
+ } else {
+ // All events for a specific element
+ for (name in eventMap) {
+ callbackList = eventMap[name];
+ removeEvent(target, callbackList.fakeName || name, callbackList.nativeHandler, callbackList.capture);
+ }
+
+ eventMap = {};
+ }
+
+ // Check if object is empty, if it isn't then we won't remove the expando map
+ for (name in eventMap) {
+ return self;
+ }
+
+ // Delete event object
+ delete events[id];
+
+ // Remove expando from target
+ try {
+ // IE will fail here since it can't delete properties from window
+ delete target[expando];
+ } catch (ex) {
+ // IE will set it to null
+ target[expando] = null;
+ }
+ }
+
+ return self;
+ };
+
+ /**
+ * Fires the specified event on the specified target.
+ *
+ * @method fire
+ * @param {Object} target Target node/window or custom object.
+ * @param {String} name Event name to fire.
+ * @param {Object} args Optional arguments to send to the observers.
+ * @return {EventUtils} Event utils instance.
+ */
+ self.fire = function (target, name, args) {
+ var id;
+
+ // Don't bind to text nodes or comments
+ if (!target || target.nodeType === 3 || target.nodeType === 8) {
+ return self;
+ }
+
+ // Build event object by patching the args
+ args = fix(null, args);
+ args.type = name;
+ args.target = target;
+
+ do {
+ // Found an expando that means there is listeners to execute
+ id = target[expando];
+ if (id) {
+ executeHandlers(args, id);
+ }
+
+ // Walk up the DOM
+ target = target.parentNode || target.ownerDocument || target.defaultView || target.parentWindow;
+ } while (target && !args.isPropagationStopped());
+
+ return self;
+ };
+
+ /**
+ * Removes all bound event listeners for the specified target. This will also remove any bound
+ * listeners to child nodes within that target.
+ *
+ * @method clean
+ * @param {Object} target Target node/window object.
+ * @return {EventUtils} Event utils instance.
+ */
+ self.clean = function (target) {
+ var i, children, unbind = self.unbind;
+
+ // Don't bind to text nodes or comments
+ if (!target || target.nodeType === 3 || target.nodeType === 8) {
+ return self;
+ }
+
+ // Unbind any element on the specified target
+ if (target[expando]) {
+ unbind(target);
+ }
+
+ // Target doesn't have getElementsByTagName it's probably a window object then use it's document to find the children
+ if (!target.getElementsByTagName) {
+ target = target.document;
+ }
+
+ // Remove events from each child element
+ if (target && target.getElementsByTagName) {
+ unbind(target);
+
+ children = target.getElementsByTagName('*');
+ i = children.length;
+ while (i--) {
+ target = children[i];
+
+ if (target[expando]) {
+ unbind(target);
+ }
+ }
+ }
+
+ return self;
+ };
+
+ /**
+ * Destroys the event object. Call this on IE to remove memory leaks.
+ */
+ self.destroy = function () {
+ events = {};
+ };
+
+ // Legacy function for canceling events
+ self.cancel = function (e) {
+ if (e) {
+ e.preventDefault();
+ e.stopImmediatePropagation();
+ }
+
+ return false;
+ };
+ };
+
+ EventUtils.Event = new EventUtils();
+ EventUtils.Event.bind(window, 'ready', function () { });
+
+ return EventUtils;
+ }
+);
+
+/**
+ * Sizzle.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ *
+ * @ignore-file
+ *
+ * Forked changes:
+ * - Disabled all assertions since they are only used for non supported browsers and cause dom repaints see #TINY-1141
+ */
+
+/*jshint bitwise:false, expr:true, noempty:false, sub:true, eqnull:true, latedef:false, maxlen:255 */
+/*eslint-disable */
+
+/**
+ * Sizzle CSS Selector Engine v@VERSION
+ * http://sizzlejs.com/
+ *
+ * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: @DATE
+ */
+define(
+ 'tinymce.core.dom.Sizzle',
+ [],
+ function () {
+ var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function (a, b) {
+ if (a === b) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function (elem) {
+ var i = 0,
+ len = this.length;
+ for (; i < len; i++) {
+ if (this[i] === elem) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
+
+ rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
+ rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
+
+ rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),
+
+ rpseudo = new RegExp(pseudos),
+ ridentifier = new RegExp("^" + identifier + "$"),
+
+ matchExpr = {
+ "ID": new RegExp("^#(" + identifier + ")"),
+ "CLASS": new RegExp("^\\.(" + identifier + ")"),
+ "TAG": new RegExp("^(" + identifier + "|[*])"),
+ "ATTR": new RegExp("^" + attributes),
+ "PSEUDO": new RegExp("^" + pseudos),
+ "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
+ "bool": new RegExp("^(?:" + booleans + ")$", "i"),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
+ funescape = function (_, escaped, escapedWhitespace) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode(high + 0x10000) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
+ };
+
+ // Optimize for push.apply( _, NodeList )
+ try {
+ push.apply(
+ (arr = slice.call(preferredDoc.childNodes)),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[preferredDoc.childNodes.length].nodeType;
+ } catch (e) {
+ push = {
+ apply: arr.length ?
+
+ // Leverage slice if possible
+ function (target, els) {
+ push_native.apply(target, slice.call(els));
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function (target, els) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ((target[j++] = els[i++])) { }
+ target.length = j - 1;
+ }
+ };
+ }
+
+ function Sizzle(selector, context, results, seed) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
+ setDocument(context);
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if (!selector || typeof selector !== "string") {
+ return results;
+ }
+
+ if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) {
+ return [];
+ }
+
+ if (documentIsHTML && !seed) {
+
+ // Shortcuts
+ if ((match = rquickExpr.exec(selector))) {
+ // Speed-up: Sizzle("#ID")
+ if ((m = match[1])) {
+ if (nodeType === 9) {
+ elem = context.getElementById(m);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if (elem && elem.parentNode) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if (elem.id === m) {
+ results.push(elem);
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) &&
+ contains(context, elem) && elem.id === m) {
+ results.push(elem);
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if (match[2]) {
+ push.apply(results, context.getElementsByTagName(selector));
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ((m = match[3]) && support.getElementsByClassName) {
+ push.apply(results, context.getElementsByClassName(m));
+ return results;
+ }
+ }
+
+ // QSA path
+ if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if (nodeType === 1 && context.nodeName.toLowerCase() !== "object") {
+ groups = tokenize(selector);
+
+ if ((old = context.getAttribute("id"))) {
+ nid = old.replace(rescape, "\\$&");
+ } else {
+ context.setAttribute("id", nid);
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while (i--) {
+ groups[i] = nid + toSelector(groups[i]);
+ }
+ newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
+ newSelector = groups.join(",");
+ }
+
+ if (newSelector) {
+ try {
+ push.apply(results,
+ newContext.querySelectorAll(newSelector)
+ );
+ return results;
+ } catch (qsaError) {
+ } finally {
+ if (!old) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select(selector.replace(rtrim, "$1"), context, results, seed);
+ }
+
+ /**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+ function createCache() {
+ var keys = [];
+
+ function cache(key, value) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if (keys.push(key + " ") > Expr.cacheLength) {
+ // Only keep the most recent entries
+ delete cache[keys.shift()];
+ }
+ return (cache[key + " "] = value);
+ }
+ return cache;
+ }
+
+ /**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+ function markFunction(fn) {
+ fn[expando] = true;
+ return fn;
+ }
+
+ /**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+ /*function assert(fn) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn(div);
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if (div.parentNode) {
+ div.parentNode.removeChild(div);
+ }
+ // release memory in IE
+ div = null;
+ }
+ }*/
+
+ /**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+ function addHandle(attrs, handler) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while (i--) {
+ Expr.attrHandle[arr[i]] = handler;
+ }
+ }
+
+ /**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+ function siblingCheck(a, b) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ (~b.sourceIndex || MAX_NEGATIVE) -
+ (~a.sourceIndex || MAX_NEGATIVE);
+
+ // Use IE sourceIndex if available on both nodes
+ if (diff) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if (cur) {
+ while ((cur = cur.nextSibling)) {
+ if (cur === b) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+ }
+
+ /**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+ function createInputPseudo(type) {
+ return function (elem) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+ }
+
+ /**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+ function createButtonPseudo(type) {
+ return function (elem) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+ }
+
+ /**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+ function createPositionalPseudo(fn) {
+ return markFunction(function (argument) {
+ argument = +argument;
+ return markFunction(function (seed, matches) {
+ var j,
+ matchIndexes = fn([], seed.length, argument),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while (i--) {
+ if (seed[(j = matchIndexes[i])]) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+ }
+
+ /**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+ function testContext(context) {
+ return context && typeof context.getElementsByTagName !== strundefined && context;
+ }
+
+ // Expose support vars for convenience
+ support = Sizzle.support = {};
+
+ /**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+ isXML = Sizzle.isXML = function (elem) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+ };
+
+ /**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+ setDocument = Sizzle.setDocument = function (node) {
+ var hasCompare,
+ doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ function getTop(win) {
+ // Edge throws a lovely Object expected if you try to get top on a detached reference see #2642
+ try {
+ return win.top;
+ } catch (ex) {
+ // Ignore
+ }
+
+ return null;
+ }
+
+ // If no document and documentElement is available, return
+ if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML(doc);
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if (parent && parent !== getTop(parent)) {
+ // IE11 does not have attachEvent, so all must suffer
+ if (parent.addEventListener) {
+ parent.addEventListener("unload", function () {
+ setDocument();
+ }, false);
+ } else if (parent.attachEvent) {
+ parent.attachEvent("onunload", function () {
+ setDocument();
+ });
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = true;
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = true;
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test(doc.getElementsByClassName);
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = true;
+
+ // ID find and filter
+ /*if (support.getById) {*/
+ Expr.find["ID"] = function (id, context) {
+ if (typeof context.getElementById !== strundefined && documentIsHTML) {
+ var m = context.getElementById(id);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ };
+ Expr.filter["ID"] = function (id) {
+ var attrId = id.replace(runescape, funescape);
+ return function (elem) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ /*} else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function (id) {
+ var attrId = id.replace(runescape, funescape);
+ return function (elem) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }*/
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function (tag, context) {
+ if (typeof context.getElementsByTagName !== strundefined) {
+ return context.getElementsByTagName(tag);
+ }
+ } :
+ function (tag, context) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName(tag);
+
+ // Filter out possible comments
+ if (tag === "*") {
+ while ((elem = results[i++])) {
+ if (elem.nodeType === 1) {
+ tmp.push(elem);
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
+ if (documentIsHTML) {
+ return context.getElementsByClassName(className);
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ /*
+ if ((support.qsa = rnative.test(doc.querySelectorAll))) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function (div) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if (div.querySelectorAll("[msallowcapture^='']").length) {
+ rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if (!div.querySelectorAll("[selected]").length) {
+ rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if (!div.querySelectorAll(":checked").length) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function (div) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute("type", "hidden");
+ div.appendChild(input).setAttribute("name", "D");
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if (div.querySelectorAll("[name=d]").length) {
+ rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if (!div.querySelectorAll(":enabled").length) {
+ rbuggyQSA.push(":enabled", ":disabled");
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+ */
+
+ support.disconnectedMatch = true;
+
+ /*
+ if ((support.matchesSelector = rnative.test((matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector)))) {
+
+ assert(function (div) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call(div, "div");
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call(div, "[s!='']:x");
+ rbuggyMatches.push("!=", pseudos);
+ });
+ }
+ */
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
+ rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test(docElem.compareDocumentPosition);
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test(docElem.contains) ?
+ function (a, b) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!(bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains(bup) :
+ a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16
+ ));
+ } :
+ function (a, b) {
+ if (b) {
+ while ((b = b.parentNode)) {
+ if (b === a) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function (a, b) {
+
+ // Flag for duplicate removal
+ if (a === b) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if (compare) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = (a.ownerDocument || a) === (b.ownerDocument || b) ?
+ a.compareDocumentPosition(b) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if (compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition(a) === compare)) {
+
+ // Choose the first element that is related to our preferred document
+ if (a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
+ return -1;
+ }
+ if (b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ (indexOf.call(sortInput, a) - indexOf.call(sortInput, b)) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function (a, b) {
+ // Exit early if the nodes are identical
+ if (a === b) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [a],
+ bp = [b];
+
+ // Parentless nodes are either documents or disconnected
+ if (!aup || !bup) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ (indexOf.call(sortInput, a) - indexOf.call(sortInput, b)) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if (aup === bup) {
+ return siblingCheck(a, b);
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ((cur = cur.parentNode)) {
+ ap.unshift(cur);
+ }
+ cur = b;
+ while ((cur = cur.parentNode)) {
+ bp.unshift(cur);
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while (ap[i] === bp[i]) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck(ap[i], bp[i]) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+ };
+
+ Sizzle.matches = function (expr, elements) {
+ return Sizzle(expr, null, null, elements);
+ };
+
+ Sizzle.matchesSelector = function (elem, expr) {
+ // Set document vars if needed
+ if ((elem.ownerDocument || elem) !== document) {
+ setDocument(elem);
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace(rattributeQuotes, "='$1']");
+
+ if (support.matchesSelector && documentIsHTML &&
+ (!rbuggyMatches || !rbuggyMatches.test(expr)) &&
+ (!rbuggyQSA || !rbuggyQSA.test(expr))) {
+
+ try {
+ var ret = matches.call(elem, expr);
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if (ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11) {
+ return ret;
+ }
+ } catch (e) { }
+ }
+
+ return Sizzle(expr, document, null, [elem]).length > 0;
+ };
+
+ Sizzle.contains = function (context, elem) {
+ // Set document vars if needed
+ if ((context.ownerDocument || context) !== document) {
+ setDocument(context);
+ }
+ return contains(context, elem);
+ };
+
+ Sizzle.attr = function (elem, name) {
+ // Set document vars if needed
+ if ((elem.ownerDocument || elem) !== document) {
+ setDocument(elem);
+ }
+
+ var fn = Expr.attrHandle[name.toLowerCase()],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ?
+ fn(elem, name, !documentIsHTML) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute(name) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+ };
+
+ Sizzle.error = function (msg) {
+ throw new Error("Syntax error, unrecognized expression: " + msg);
+ };
+
+ /**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+ Sizzle.uniqueSort = function (results) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice(0);
+ results.sort(sortOrder);
+
+ if (hasDuplicate) {
+ while ((elem = results[i++])) {
+ if (elem === results[i]) {
+ j = duplicates.push(i);
+ }
+ }
+ while (j--) {
+ results.splice(duplicates[j], 1);
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+ };
+
+ /**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+ getText = Sizzle.getText = function (elem) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if (!nodeType) {
+ // If no nodeType, this is expected to be an array
+ while ((node = elem[i++])) {
+ // Do not traverse comment nodes
+ ret += getText(node);
+ }
+ } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if (typeof elem.textContent === "string") {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ ret += getText(elem);
+ }
+ }
+ } else if (nodeType === 3 || nodeType === 4) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+ };
+
+ Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function (match) {
+ match[1] = match[1].replace(runescape, funescape);
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
+
+ if (match[2] === "~=") {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice(0, 4);
+ },
+
+ "CHILD": function (match) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if (match[1].slice(0, 3) === "nth") {
+ // nth-* requires argument
+ if (!match[3]) {
+ Sizzle.error(match[0]);
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
+ match[5] = +((match[7] + match[8]) || match[3] === "odd");
+
+ // other types prohibit arguments
+ } else if (match[3]) {
+ Sizzle.error(match[0]);
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function (match) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if (matchExpr["CHILD"].test(match[0])) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if (match[3]) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if (unquoted && rpseudo.test(unquoted) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize(unquoted, true)) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
+
+ // excess is a negative index
+ match[0] = match[0].slice(0, excess);
+ match[2] = unquoted.slice(0, excess);
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice(0, 3);
+ }
+ },
+
+ filter: {
+
+ "TAG": function (nodeNameSelector) {
+ var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function () { return true; } :
+ function (elem) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function (className) {
+ var pattern = classCache[className + " "];
+
+ return pattern ||
+ (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) &&
+ classCache(className, function (elem) {
+ return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "");
+ });
+ },
+
+ "ATTR": function (name, operator, check) {
+ return function (elem) {
+ var result = Sizzle.attr(elem, name);
+
+ if (result == null) {
+ return operator === "!=";
+ }
+ if (!operator) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf(check) === 0 :
+ operator === "*=" ? check && result.indexOf(check) > -1 :
+ operator === "$=" ? check && result.slice(-check.length) === check :
+ operator === "~=" ? (" " + result + " ").indexOf(check) > -1 :
+ operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function (type, what, argument, first, last) {
+ var simple = type.slice(0, 3) !== "nth",
+ forward = type.slice(-4) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function (elem) {
+ return !!elem.parentNode;
+ } :
+
+ function (elem, context, xml) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if (parent) {
+
+ // :(first|last|only)-(child|of-type)
+ if (simple) {
+ while (dir) {
+ node = elem;
+ while ((node = node[dir])) {
+ if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [forward ? parent.firstChild : parent.lastChild];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if (forward && useCache) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[expando] || (parent[expando] = {});
+ cache = outerCache[type] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[nodeIndex];
+
+ while ((node = ++nodeIndex && node && node[dir] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop())) {
+
+ // When found, cache indexes on `parent` and break
+ if (node.nodeType === 1 && ++diff && node === elem) {
+ outerCache[type] = [dirruns, nodeIndex, diff];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if (useCache && (cache = (elem[expando] || (elem[expando] = {}))[type]) && cache[0] === dirruns) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ((node = ++nodeIndex && node && node[dir] ||
+ (diff = nodeIndex = 0) || start.pop())) {
+
+ if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {
+ // Cache the index of each encountered element
+ if (useCache) {
+ (node[expando] || (node[expando] = {}))[type] = [dirruns, diff];
+ }
+
+ if (node === elem) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || (diff % first === 0 && diff / first >= 0);
+ }
+ };
+ },
+
+ "PSEUDO": function (pseudo, argument) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] ||
+ Sizzle.error("unsupported pseudo: " + pseudo);
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if (fn[expando]) {
+ return fn(argument);
+ }
+
+ // But maintain support for old signatures
+ if (fn.length > 1) {
+ args = [pseudo, pseudo, "", argument];
+ return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ?
+ markFunction(function (seed, matches) {
+ var idx,
+ matched = fn(seed, argument),
+ i = matched.length;
+ while (i--) {
+ idx = indexOf.call(seed, matched[i]);
+ seed[idx] = !(matches[idx] = matched[i]);
+ }
+ }) :
+ function (elem) {
+ return fn(elem, 0, args);
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function (selector) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile(selector.replace(rtrim, "$1"));
+
+ return matcher[expando] ?
+ markFunction(function (seed, matches, context, xml) {
+ var elem,
+ unmatched = matcher(seed, null, xml, []),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while (i--) {
+ if ((elem = unmatched[i])) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function (elem, context, xml) {
+ input[0] = elem;
+ matcher(input, null, xml, results);
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function (selector) {
+ return function (elem) {
+ return Sizzle(selector, elem).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function (text) {
+ text = text.replace(runescape, funescape);
+ return function (elem) {
+ return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction(function (lang) {
+ // lang value must be a valid identifier
+ if (!ridentifier.test(lang || "")) {
+ Sizzle.error("unsupported lang: " + lang);
+ }
+ lang = lang.replace(runescape, funescape).toLowerCase();
+ return function (elem) {
+ var elemLang;
+ do {
+ if ((elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
+ }
+ } while ((elem = elem.parentNode) && elem.nodeType === 1);
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function (elem) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice(1) === elem.id;
+ },
+
+ "root": function (elem) {
+ return elem === docElem;
+ },
+
+ "focus": function (elem) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function (elem) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function (elem) {
+ return elem.disabled === true;
+ },
+
+ "checked": function (elem) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function (elem) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if (elem.parentNode) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function (elem) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ if (elem.nodeType < 6) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function (elem) {
+ return !Expr.pseudos["empty"](elem);
+ },
+
+ // Element/input types
+ "header": function (elem) {
+ return rheader.test(elem.nodeName);
+ },
+
+ "input": function (elem) {
+ return rinputs.test(elem.nodeName);
+ },
+
+ "button": function (elem) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function (elem) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function () {
+ return [0];
+ }),
+
+ "last": createPositionalPseudo(function (matchIndexes, length) {
+ return [length - 1];
+ }),
+
+ "eq": createPositionalPseudo(function (matchIndexes, length, argument) {
+ return [argument < 0 ? argument + length : argument];
+ }),
+
+ "even": createPositionalPseudo(function (matchIndexes, length) {
+ var i = 0;
+ for (; i < length; i += 2) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function (matchIndexes, length) {
+ var i = 1;
+ for (; i < length; i += 2) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function (matchIndexes, length, argument) {
+ var i = argument < 0 ? argument + length : argument;
+ for (; --i >= 0;) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function (matchIndexes, length, argument) {
+ var i = argument < 0 ? argument + length : argument;
+ for (; ++i < length;) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ })
+ }
+ };
+
+ Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+ // Add button/input type pseudos
+ for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
+ Expr.pseudos[i] = createInputPseudo(i);
+ }
+ for (i in { submit: true, reset: true }) {
+ Expr.pseudos[i] = createButtonPseudo(i);
+ }
+
+ // Easy API for creating new setFilters
+ function setFilters() { }
+ setFilters.prototype = Expr.filters = Expr.pseudos;
+ Expr.setFilters = new setFilters();
+
+ tokenize = Sizzle.tokenize = function (selector, parseOnly) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[selector + " "];
+
+ if (cached) {
+ return parseOnly ? 0 : cached.slice(0);
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while (soFar) {
+
+ // Comma and first run
+ if (!matched || (match = rcomma.exec(soFar))) {
+ if (match) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice(match[0].length) || soFar;
+ }
+ groups.push((tokens = []));
+ }
+
+ matched = false;
+
+ // Combinators
+ if ((match = rcombinators.exec(soFar))) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace(rtrim, " ")
+ });
+ soFar = soFar.slice(matched.length);
+ }
+
+ // Filters
+ for (type in Expr.filter) {
+ if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] ||
+ (match = preFilters[type](match)))) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice(matched.length);
+ }
+ }
+
+ if (!matched) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error(selector) :
+ // Cache the tokens
+ tokenCache(selector, groups).slice(0);
+ };
+
+ function toSelector(tokens) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for (; i < len; i++) {
+ selector += tokens[i].value;
+ }
+ return selector;
+ }
+
+ function addCombinator(matcher, combinator, base) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function (elem, context, xml) {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ return matcher(elem, context, xml);
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function (elem, context, xml) {
+ var oldCache, outerCache,
+ newCache = [dirruns, doneName];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if (xml) {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ if (matcher(elem, context, xml)) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ outerCache = elem[expando] || (elem[expando] = {});
+ if ((oldCache = outerCache[dir]) &&
+ oldCache[0] === dirruns && oldCache[1] === doneName) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[2] = oldCache[2]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[dir] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ((newCache[2] = matcher(elem, context, xml))) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+ }
+
+ function elementMatcher(matchers) {
+ return matchers.length > 1 ?
+ function (elem, context, xml) {
+ var i = matchers.length;
+ while (i--) {
+ if (!matchers[i](elem, context, xml)) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+ }
+
+ function multipleContexts(selector, contexts, results) {
+ var i = 0,
+ len = contexts.length;
+ for (; i < len; i++) {
+ Sizzle(selector, contexts[i], results);
+ }
+ return results;
+ }
+
+ function condense(unmatched, map, filter, context, xml) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for (; i < len; i++) {
+ if ((elem = unmatched[i])) {
+ if (!filter || filter(elem, context, xml)) {
+ newUnmatched.push(elem);
+ if (mapped) {
+ map.push(i);
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+ }
+
+ function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
+ if (postFilter && !postFilter[expando]) {
+ postFilter = setMatcher(postFilter);
+ }
+ if (postFinder && !postFinder[expando]) {
+ postFinder = setMatcher(postFinder, postSelector);
+ }
+ return markFunction(function (seed, results, context, xml) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && (seed || !selector) ?
+ condense(elems, preMap, preFilter, context, xml) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || (seed ? preFilter : preexisting || postFilter) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if (matcher) {
+ matcher(matcherIn, matcherOut, context, xml);
+ }
+
+ // Apply postFilter
+ if (postFilter) {
+ temp = condense(matcherOut, postMap);
+ postFilter(temp, [], context, xml);
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while (i--) {
+ if ((elem = temp[i])) {
+ matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
+ }
+ }
+ }
+
+ if (seed) {
+ if (postFinder || preFilter) {
+ if (postFinder) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while (i--) {
+ if ((elem = matcherOut[i])) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push((matcherIn[i] = elem));
+ }
+ }
+ postFinder(null, (matcherOut = []), temp, xml);
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while (i--) {
+ if ((elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice(preexisting, matcherOut.length) :
+ matcherOut
+ );
+ if (postFinder) {
+ postFinder(null, results, matcherOut, xml);
+ } else {
+ push.apply(results, matcherOut);
+ }
+ }
+ });
+ }
+
+ function matcherFromTokens(tokens) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[tokens[0].type],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator(function (elem) {
+ return elem === checkContext;
+ }, implicitRelative, true),
+ matchAnyContext = addCombinator(function (elem) {
+ return indexOf.call(checkContext, elem) > -1;
+ }, implicitRelative, true),
+ matchers = [function (elem, context, xml) {
+ return (!leadingRelative && (xml || context !== outermostContext)) || (
+ (checkContext = context).nodeType ?
+ matchContext(elem, context, xml) :
+ matchAnyContext(elem, context, xml));
+ }];
+
+ for (; i < len; i++) {
+ if ((matcher = Expr.relative[tokens[i].type])) {
+ matchers = [addCombinator(elementMatcher(matchers), matcher)];
+ } else {
+ matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
+
+ // Return special upon seeing a positional matcher
+ if (matcher[expando]) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for (; j < len; j++) {
+ if (Expr.relative[tokens[j].type]) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher(matchers),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" })
+ ).replace(rtrim, "$1"),
+ matcher,
+ i < j && matcherFromTokens(tokens.slice(i, j)),
+ j < len && matcherFromTokens((tokens = tokens.slice(j))),
+ j < len && toSelector(tokens)
+ );
+ }
+ matchers.push(matcher);
+ }
+ }
+
+ return elementMatcher(matchers);
+ }
+
+ function matcherFromGroupMatchers(elementMatchers, setMatchers) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function (seed, context, xml, results, outermost) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]("*", outermost),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if (outermost) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for (; i !== len && (elem = elems[i]) != null; i++) {
+ if (byElement && elem) {
+ j = 0;
+ while ((matcher = elementMatchers[j++])) {
+ if (matcher(elem, context, xml)) {
+ results.push(elem);
+ break;
+ }
+ }
+ if (outermost) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if (bySet) {
+ // They will have gone through all possible matchers
+ if ((elem = !matcher && elem)) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if (seed) {
+ unmatched.push(elem);
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if (bySet && i !== matchedCount) {
+ j = 0;
+ while ((matcher = setMatchers[j++])) {
+ matcher(unmatched, setMatched, context, xml);
+ }
+
+ if (seed) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if (matchedCount > 0) {
+ while (i--) {
+ if (!(unmatched[i] || setMatched[i])) {
+ setMatched[i] = pop.call(results);
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense(setMatched);
+ }
+
+ // Add matches to results
+ push.apply(results, setMatched);
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if (outermost && !seed && setMatched.length > 0 &&
+ (matchedCount + setMatchers.length) > 1) {
+
+ Sizzle.uniqueSort(results);
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if (outermost) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction(superMatcher) :
+ superMatcher;
+ }
+
+ compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[selector + " "];
+
+ if (!cached) {
+ // Generate a function of recursive functions that can be used to check each element
+ if (!match) {
+ match = tokenize(selector);
+ }
+ i = match.length;
+ while (i--) {
+ cached = matcherFromTokens(match[i]);
+ if (cached[expando]) {
+ setMatchers.push(cached);
+ } else {
+ elementMatchers.push(cached);
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+ };
+
+ /**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+ select = Sizzle.select = function (selector, context, results, seed) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize((selector = compiled.selector || selector));
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if (match.length === 1) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice(0);
+ if (tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[tokens[1].type]) {
+
+ context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
+ if (!context) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if (compiled) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice(tokens.shift().value.length);
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
+ while (i--) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if (Expr.relative[(type = token.type)]) {
+ break;
+ }
+ if ((find = Expr.find[type])) {
+ // Search, expanding context for leading sibling combinators
+ if ((seed = find(
+ token.matches[0].replace(runescape, funescape),
+ rsibling.test(tokens[0].type) && testContext(context.parentNode) || context
+ ))) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice(i, 1);
+ selector = seed.length && toSelector(tokens);
+ if (!selector) {
+ push.apply(results, seed);
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ (compiled || compile(selector, match))(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test(selector) && testContext(context.parentNode) || context
+ );
+ return results;
+ };
+
+ // One-time assignments
+
+ // Sort stability
+ support.sortStable = expando.split("").sort(sortOrder).join("") === expando;
+
+ // Support: Chrome 14-35+
+ // Always assume duplicates if they aren't passed to the comparison function
+ support.detectDuplicates = !!hasDuplicate;
+
+ // Initialize against the default document
+ setDocument();
+
+ // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+ // Detached nodes confoundingly follow *each other*
+ support.sortDetached = true;
+
+ // Support: IE<8
+ // Prevent attribute/property "interpolation"
+ // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+ /*if (!assert(function (div) {
+ div.innerHTML = "";
+ return div.firstChild.getAttribute("href") === "#";
+ })) {
+ addHandle("type|href|height|width", function (elem, name, isXML) {
+ if (!isXML) {
+ return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
+ }
+ });
+ }*/
+
+ // Support: IE<9
+ // Use defaultValue in place of getAttribute("value")
+ /*if (!support.attributes || !assert(function (div) {
+ div.innerHTML = "";
+ div.firstChild.setAttribute("value", "");
+ return div.firstChild.getAttribute("value") === "";
+ })) {
+ addHandle("value", function (elem, name, isXML) {
+ if (!isXML && elem.nodeName.toLowerCase() === "input") {
+ return elem.defaultValue;
+ }
+ });
+ }*/
+
+ // Support: IE<9
+ // Use getAttributeNode to fetch booleans when getAttribute lies
+ /*if (!assert(function (div) {
+ return div.getAttribute("disabled") == null;
+ })) {
+ addHandle(booleans, function (elem, name, isXML) {
+ var val;
+ if (!isXML) {
+ return elem[name] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+ }*/
+
+ // EXPOSE
+ return Sizzle;
+ }
+);
+
+/*eslint-enable */
+
+/**
+ * Arr.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Array utility class.
+ *
+ * @private
+ * @class tinymce.util.Arr
+ */
+define(
+ 'tinymce.core.util.Arr',
+ [
+ ],
+ function () {
+ var isArray = Array.isArray || function (obj) {
+ return Object.prototype.toString.call(obj) === "[object Array]";
+ };
+
+ var toArray = function (obj) {
+ var array = obj, i, l;
+
+ if (!isArray(obj)) {
+ array = [];
+ for (i = 0, l = obj.length; i < l; i++) {
+ array[i] = obj[i];
+ }
+ }
+
+ return array;
+ };
+
+ var each = function (o, cb, s) {
+ var n, l;
+
+ if (!o) {
+ return 0;
+ }
+
+ s = s || o;
+
+ if (o.length !== undefined) {
+ // Indexed arrays, needed for Safari
+ for (n = 0, l = o.length; n < l; n++) {
+ if (cb.call(s, o[n], n, o) === false) {
+ return 0;
+ }
+ }
+ } else {
+ // Hashtables
+ for (n in o) {
+ if (o.hasOwnProperty(n)) {
+ if (cb.call(s, o[n], n, o) === false) {
+ return 0;
+ }
+ }
+ }
+ }
+
+ return 1;
+ };
+
+ var map = function (array, callback) {
+ var out = [];
+
+ each(array, function (item, index) {
+ out.push(callback(item, index, array));
+ });
+
+ return out;
+ };
+
+ var filter = function (a, f) {
+ var o = [];
+
+ each(a, function (v, index) {
+ if (!f || f(v, index, a)) {
+ o.push(v);
+ }
+ });
+
+ return o;
+ };
+
+ var indexOf = function (a, v) {
+ var i, l;
+
+ if (a) {
+ for (i = 0, l = a.length; i < l; i++) {
+ if (a[i] === v) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ };
+
+ var reduce = function (collection, iteratee, accumulator, thisArg) {
+ var i = 0;
+
+ if (arguments.length < 3) {
+ accumulator = collection[0];
+ }
+
+ for (; i < collection.length; i++) {
+ accumulator = iteratee.call(thisArg, accumulator, collection[i], i);
+ }
+
+ return accumulator;
+ };
+
+ var findIndex = function (array, predicate, thisArg) {
+ var i, l;
+
+ for (i = 0, l = array.length; i < l; i++) {
+ if (predicate.call(thisArg, array[i], i, array)) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ var find = function (array, predicate, thisArg) {
+ var idx = findIndex(array, predicate, thisArg);
+
+ if (idx !== -1) {
+ return array[idx];
+ }
+
+ return undefined;
+ };
+
+ var last = function (collection) {
+ return collection[collection.length - 1];
+ };
+
+ return {
+ isArray: isArray,
+ toArray: toArray,
+ each: each,
+ map: map,
+ filter: filter,
+ indexOf: indexOf,
+ reduce: reduce,
+ findIndex: findIndex,
+ find: find,
+ last: last
+ };
+ }
+);
+/**
+ * Tools.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class contains various utlity functions. These are also exposed
+ * directly on the tinymce namespace.
+ *
+ * @class tinymce.util.Tools
+ */
+define(
+ 'tinymce.core.util.Tools',
+ [
+ 'global!window',
+ 'tinymce.core.Env',
+ 'tinymce.core.util.Arr'
+ ],
+ function (window, Env, Arr) {
+ /**
+ * Removes whitespace from the beginning and end of a string.
+ *
+ * @method trim
+ * @param {String} s String to remove whitespace from.
+ * @return {String} New string with removed whitespace.
+ */
+ var whiteSpaceRegExp = /^\s*|\s*$/g;
+
+ var trim = function (str) {
+ return (str === null || str === undefined) ? '' : ("" + str).replace(whiteSpaceRegExp, '');
+ };
+
+ /**
+ * Checks if a object is of a specific type for example an array.
+ *
+ * @method is
+ * @param {Object} obj Object to check type of.
+ * @param {string} type Optional type to check for.
+ * @return {Boolean} true/false if the object is of the specified type.
+ */
+ var is = function (obj, type) {
+ if (!type) {
+ return obj !== undefined;
+ }
+
+ if (type == 'array' && Arr.isArray(obj)) {
+ return true;
+ }
+
+ return typeof obj == type;
+ };
+
+ /**
+ * Makes a name/object map out of an array with names.
+ *
+ * @method makeMap
+ * @param {Array/String} items Items to make map out of.
+ * @param {String} delim Optional delimiter to split string by.
+ * @param {Object} map Optional map to add items to.
+ * @return {Object} Name/value map of items.
+ */
+ var makeMap = function (items, delim, map) {
+ var i;
+
+ items = items || [];
+ delim = delim || ',';
+
+ if (typeof items == "string") {
+ items = items.split(delim);
+ }
+
+ map = map || {};
+
+ i = items.length;
+ while (i--) {
+ map[items[i]] = {};
+ }
+
+ return map;
+ };
+
+ /**
+ * JavaScript does not protect hasOwnProperty method, so it is possible to overwrite it. This is
+ * object independent version.
+ *
+ * @param {Object} obj
+ * @param {String} prop
+ * @returns {Boolean}
+ */
+ var hasOwnProperty = function (obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+ };
+
+ /**
+ * Creates a class, subclass or static singleton.
+ * More details on this method can be found in the Wiki.
+ *
+ * @method create
+ * @param {String} s Class name, inheritance and prefix.
+ * @param {Object} p Collection of methods to add to the class.
+ * @param {Object} root Optional root object defaults to the global window object.
+ * @example
+ * // Creates a basic class
+ * tinymce.create('tinymce.somepackage.SomeClass', {
+ * SomeClass: function() {
+ * // Class constructor
+ * },
+ *
+ * method: function() {
+ * // Some method
+ * }
+ * });
+ *
+ * // Creates a basic subclass class
+ * tinymce.create('tinymce.somepackage.SomeSubClass:tinymce.somepackage.SomeClass', {
+ * SomeSubClass: function() {
+ * // Class constructor
+ * this.parent(); // Call parent constructor
+ * },
+ *
+ * method: function() {
+ * // Some method
+ * this.parent(); // Call parent method
+ * },
+ *
+ * 'static': {
+ * staticMethod: function() {
+ * // Static method
+ * }
+ * }
+ * });
+ *
+ * // Creates a singleton/static class
+ * tinymce.create('static tinymce.somepackage.SomeSingletonClass', {
+ * method: function() {
+ * // Some method
+ * }
+ * });
+ */
+ var create = function (s, p, root) {
+ var self = this, sp, ns, cn, scn, c, de = 0;
+
+ // Parse : :
+ s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);
+ cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name
+
+ // Create namespace for new class
+ ns = self.createNS(s[3].replace(/\.\w+$/, ''), root);
+
+ // Class already exists
+ if (ns[cn]) {
+ return;
+ }
+
+ // Make pure static class
+ if (s[2] == 'static') {
+ ns[cn] = p;
+
+ if (this.onCreate) {
+ this.onCreate(s[2], s[3], ns[cn]);
+ }
+
+ return;
+ }
+
+ // Create default constructor
+ if (!p[cn]) {
+ p[cn] = function () { };
+ de = 1;
+ }
+
+ // Add constructor and methods
+ ns[cn] = p[cn];
+ self.extend(ns[cn].prototype, p);
+
+ // Extend
+ if (s[5]) {
+ sp = self.resolve(s[5]).prototype;
+ scn = s[5].match(/\.(\w+)$/i)[1]; // Class name
+
+ // Extend constructor
+ c = ns[cn];
+ if (de) {
+ // Add passthrough constructor
+ ns[cn] = function () {
+ return sp[scn].apply(this, arguments);
+ };
+ } else {
+ // Add inherit constructor
+ ns[cn] = function () {
+ this.parent = sp[scn];
+ return c.apply(this, arguments);
+ };
+ }
+ ns[cn].prototype[cn] = ns[cn];
+
+ // Add super methods
+ self.each(sp, function (f, n) {
+ ns[cn].prototype[n] = sp[n];
+ });
+
+ // Add overridden methods
+ self.each(p, function (f, n) {
+ // Extend methods if needed
+ if (sp[n]) {
+ ns[cn].prototype[n] = function () {
+ this.parent = sp[n];
+ return f.apply(this, arguments);
+ };
+ } else {
+ if (n != cn) {
+ ns[cn].prototype[n] = f;
+ }
+ }
+ });
+ }
+
+ // Add static methods
+ /*jshint sub:true*/
+ /*eslint dot-notation:0*/
+ self.each(p['static'], function (f, n) {
+ ns[cn][n] = f;
+ });
+ };
+
+ var extend = function (obj, ext) {
+ var i, l, name, args = arguments, value;
+
+ for (i = 1, l = args.length; i < l; i++) {
+ ext = args[i];
+ for (name in ext) {
+ if (ext.hasOwnProperty(name)) {
+ value = ext[name];
+
+ if (value !== undefined) {
+ obj[name] = value;
+ }
+ }
+ }
+ }
+
+ return obj;
+ };
+
+ /**
+ * Executed the specified function for each item in a object tree.
+ *
+ * @method walk
+ * @param {Object} o Object tree to walk though.
+ * @param {function} f Function to call for each item.
+ * @param {String} n Optional name of collection inside the objects to walk for example childNodes.
+ * @param {String} s Optional scope to execute the function in.
+ */
+ var walk = function (o, f, n, s) {
+ s = s || this;
+
+ if (o) {
+ if (n) {
+ o = o[n];
+ }
+
+ Arr.each(o, function (o, i) {
+ if (f.call(s, o, i, n) === false) {
+ return false;
+ }
+
+ walk(o, f, n, s);
+ });
+ }
+ };
+
+ /**
+ * Creates a namespace on a specific object.
+ *
+ * @method createNS
+ * @param {String} n Namespace to create for example a.b.c.d.
+ * @param {Object} o Optional object to add namespace to, defaults to window.
+ * @return {Object} New namespace object the last item in path.
+ * @example
+ * // Create some namespace
+ * tinymce.createNS('tinymce.somepackage.subpackage');
+ *
+ * // Add a singleton
+ * var tinymce.somepackage.subpackage.SomeSingleton = {
+ * method: function() {
+ * // Some method
+ * }
+ * };
+ */
+ var createNS = function (n, o) {
+ var i, v;
+
+ o = o || window;
+
+ n = n.split('.');
+ for (i = 0; i < n.length; i++) {
+ v = n[i];
+
+ if (!o[v]) {
+ o[v] = {};
+ }
+
+ o = o[v];
+ }
+
+ return o;
+ };
+
+ /**
+ * Resolves a string and returns the object from a specific structure.
+ *
+ * @method resolve
+ * @param {String} n Path to resolve for example a.b.c.d.
+ * @param {Object} o Optional object to search though, defaults to window.
+ * @return {Object} Last object in path or null if it couldn't be resolved.
+ * @example
+ * // Resolve a path into an object reference
+ * var obj = tinymce.resolve('a.b.c.d');
+ */
+ var resolve = function (n, o) {
+ var i, l;
+
+ o = o || window;
+
+ n = n.split('.');
+ for (i = 0, l = n.length; i < l; i++) {
+ o = o[n[i]];
+
+ if (!o) {
+ break;
+ }
+ }
+
+ return o;
+ };
+
+ /**
+ * Splits a string but removes the whitespace before and after each value.
+ *
+ * @method explode
+ * @param {string} s String to split.
+ * @param {string} d Delimiter to split by.
+ * @example
+ * // Split a string into an array with a,b,c
+ * var arr = tinymce.explode('a, b, c');
+ */
+ var explode = function (s, d) {
+ if (!s || is(s, 'array')) {
+ return s;
+ }
+
+ return Arr.map(s.split(d || ','), trim);
+ };
+
+ var _addCacheSuffix = function (url) {
+ var cacheSuffix = Env.cacheSuffix;
+
+ if (cacheSuffix) {
+ url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix;
+ }
+
+ return url;
+ };
+
+ return {
+ trim: trim,
+
+ /**
+ * Returns true/false if the object is an array or not.
+ *
+ * @method isArray
+ * @param {Object} obj Object to check.
+ * @return {boolean} true/false state if the object is an array or not.
+ */
+ isArray: Arr.isArray,
+
+ is: is,
+
+ /**
+ * Converts the specified object into a real JavaScript array.
+ *
+ * @method toArray
+ * @param {Object} obj Object to convert into array.
+ * @return {Array} Array object based in input.
+ */
+ toArray: Arr.toArray,
+ makeMap: makeMap,
+
+ /**
+ * Performs an iteration of all items in a collection such as an object or array. This method will execure the
+ * callback function for each item in the collection, if the callback returns false the iteration will terminate.
+ * The callback has the following format: cb(value, key_or_index).
+ *
+ * @method each
+ * @param {Object} o Collection to iterate.
+ * @param {function} cb Callback function to execute for each item.
+ * @param {Object} s Optional scope to execute the callback in.
+ * @example
+ * // Iterate an array
+ * tinymce.each([1,2,3], function(v, i) {
+ * console.debug("Value: " + v + ", Index: " + i);
+ * });
+ *
+ * // Iterate an object
+ * tinymce.each({a: 1, b: 2, c: 3], function(v, k) {
+ * console.debug("Value: " + v + ", Key: " + k);
+ * });
+ */
+ each: Arr.each,
+
+ /**
+ * Creates a new array by the return value of each iteration function call. This enables you to convert
+ * one array list into another.
+ *
+ * @method map
+ * @param {Array} array Array of items to iterate.
+ * @param {function} callback Function to call for each item. It's return value will be the new value.
+ * @return {Array} Array with new values based on function return values.
+ */
+ map: Arr.map,
+
+ /**
+ * Filters out items from the input array by calling the specified function for each item.
+ * If the function returns false the item will be excluded if it returns true it will be included.
+ *
+ * @method grep
+ * @param {Array} a Array of items to loop though.
+ * @param {function} f Function to call for each item. Include/exclude depends on it's return value.
+ * @return {Array} New array with values imported and filtered based in input.
+ * @example
+ * // Filter out some items, this will return an array with 4 and 5
+ * var items = tinymce.grep([1,2,3,4,5], function(v) {return v > 3;});
+ */
+ grep: Arr.filter,
+
+ /**
+ * Returns an index of the item or -1 if item is not present in the array.
+ *
+ * @method inArray
+ * @param {any} item Item to search for.
+ * @param {Array} arr Array to search in.
+ * @return {Number} index of the item or -1 if item was not found.
+ */
+ inArray: Arr.indexOf,
+
+ hasOwn: hasOwnProperty,
+
+ extend: extend,
+ create: create,
+ walk: walk,
+ createNS: createNS,
+ resolve: resolve,
+ explode: explode,
+ _addCacheSuffix: _addCacheSuffix
+ };
+ }
+);
+/**
+ * DomQuery.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class mimics most of the jQuery API:
+ *
+ * This is whats currently implemented:
+ * - Utility functions
+ * - DOM traversial
+ * - DOM manipulation
+ * - Event binding
+ *
+ * This is not currently implemented:
+ * - Dimension
+ * - Ajax
+ * - Animation
+ * - Advanced chaining
+ *
+ * @example
+ * var $ = tinymce.dom.DomQuery;
+ * $('p').attr('attr', 'value').addClass('class');
+ *
+ * @class tinymce.dom.DomQuery
+ */
+define(
+ 'tinymce.core.dom.DomQuery',
+ [
+ 'global!document',
+ 'tinymce.core.dom.EventUtils',
+ 'tinymce.core.dom.Sizzle',
+ 'tinymce.core.Env',
+ 'tinymce.core.util.Tools'
+ ],
+ function (document, EventUtils, Sizzle, Env, Tools) {
+ var doc = document, push = Array.prototype.push, slice = Array.prototype.slice;
+ var rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/;
+ var Event = EventUtils.Event, undef;
+ var skipUniques = Tools.makeMap('children,contents,next,prev');
+
+ var isDefined = function (obj) {
+ return typeof obj !== 'undefined';
+ };
+
+ var isString = function (obj) {
+ return typeof obj === 'string';
+ };
+
+ var isWindow = function (obj) {
+ return obj && obj == obj.window;
+ };
+
+ var createFragment = function (html, fragDoc) {
+ var frag, node, container;
+
+ fragDoc = fragDoc || doc;
+ container = fragDoc.createElement('div');
+ frag = fragDoc.createDocumentFragment();
+ container.innerHTML = html;
+
+ while ((node = container.firstChild)) {
+ frag.appendChild(node);
+ }
+
+ return frag;
+ };
+
+ var domManipulate = function (targetNodes, sourceItem, callback, reverse) {
+ var i;
+
+ if (isString(sourceItem)) {
+ sourceItem = createFragment(sourceItem, getElementDocument(targetNodes[0]));
+ } else if (sourceItem.length && !sourceItem.nodeType) {
+ sourceItem = DomQuery.makeArray(sourceItem);
+
+ if (reverse) {
+ for (i = sourceItem.length - 1; i >= 0; i--) {
+ domManipulate(targetNodes, sourceItem[i], callback, reverse);
+ }
+ } else {
+ for (i = 0; i < sourceItem.length; i++) {
+ domManipulate(targetNodes, sourceItem[i], callback, reverse);
+ }
+ }
+
+ return targetNodes;
+ }
+
+ if (sourceItem.nodeType) {
+ i = targetNodes.length;
+ while (i--) {
+ callback.call(targetNodes[i], sourceItem);
+ }
+ }
+
+ return targetNodes;
+ };
+
+ var hasClass = function (node, className) {
+ return node && className && (' ' + node.className + ' ').indexOf(' ' + className + ' ') !== -1;
+ };
+
+ var wrap = function (elements, wrapper, all) {
+ var lastParent, newWrapper;
+
+ wrapper = DomQuery(wrapper)[0];
+
+ elements.each(function () {
+ var self = this;
+
+ if (!all || lastParent != self.parentNode) {
+ lastParent = self.parentNode;
+ newWrapper = wrapper.cloneNode(false);
+ self.parentNode.insertBefore(newWrapper, self);
+ newWrapper.appendChild(self);
+ } else {
+ newWrapper.appendChild(self);
+ }
+ });
+
+ return elements;
+ };
+
+ var numericCssMap = Tools.makeMap('fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom', ' ');
+ var booleanMap = Tools.makeMap('checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected', ' ');
+ var propFix = {
+ 'for': 'htmlFor',
+ 'class': 'className',
+ 'readonly': 'readOnly'
+ };
+ var cssFix = {
+ 'float': 'cssFloat'
+ };
+
+ var attrHooks = {}, cssHooks = {};
+
+ var DomQuery = function (selector, context) {
+ /*eslint new-cap:0 */
+ return new DomQuery.fn.init(selector, context);
+ };
+
+ var inArray = function (item, array) {
+ var i;
+
+ if (array.indexOf) {
+ return array.indexOf(item);
+ }
+
+ i = array.length;
+ while (i--) {
+ if (array[i] === item) {
+ return i;
+ }
+ }
+
+ return -1;
+ };
+
+ var whiteSpaceRegExp = /^\s*|\s*$/g;
+
+ var trim = function (str) {
+ return (str === null || str === undef) ? '' : ("" + str).replace(whiteSpaceRegExp, '');
+ };
+
+ var each = function (obj, callback) {
+ var length, key, i, undef, value;
+
+ if (obj) {
+ length = obj.length;
+
+ if (length === undef) {
+ // Loop object items
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ value = obj[key];
+ if (callback.call(value, key, value) === false) {
+ break;
+ }
+ }
+ }
+ } else {
+ // Loop array items
+ for (i = 0; i < length; i++) {
+ value = obj[i];
+ if (callback.call(value, i, value) === false) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ };
+
+ var grep = function (array, callback) {
+ var out = [];
+
+ each(array, function (i, item) {
+ if (callback(item, i)) {
+ out.push(item);
+ }
+ });
+
+ return out;
+ };
+
+ var getElementDocument = function (element) {
+ if (!element) {
+ return doc;
+ }
+
+ if (element.nodeType == 9) {
+ return element;
+ }
+
+ return element.ownerDocument;
+ };
+
+ DomQuery.fn = DomQuery.prototype = {
+ constructor: DomQuery,
+
+ /**
+ * Selector for the current set.
+ *
+ * @property selector
+ * @type String
+ */
+ selector: "",
+
+ /**
+ * Context used to create the set.
+ *
+ * @property context
+ * @type Element
+ */
+ context: null,
+
+ /**
+ * Number of items in the current set.
+ *
+ * @property length
+ * @type Number
+ */
+ length: 0,
+
+ /**
+ * Constructs a new DomQuery instance with the specified selector or context.
+ *
+ * @constructor
+ * @method init
+ * @param {String/Array/DomQuery} selector Optional CSS selector/Array or array like object or HTML string.
+ * @param {Document/Element} context Optional context to search in.
+ */
+ init: function (selector, context) {
+ var self = this, match, node;
+
+ if (!selector) {
+ return self;
+ }
+
+ if (selector.nodeType) {
+ self.context = self[0] = selector;
+ self.length = 1;
+
+ return self;
+ }
+
+ if (context && context.nodeType) {
+ self.context = context;
+ } else {
+ if (context) {
+ return DomQuery(selector).attr(context);
+ }
+
+ self.context = context = document;
+ }
+
+ if (isString(selector)) {
+ self.selector = selector;
+
+ if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
+ match = [null, selector, null];
+ } else {
+ match = rquickExpr.exec(selector);
+ }
+
+ if (match) {
+ if (match[1]) {
+ node = createFragment(selector, getElementDocument(context)).firstChild;
+
+ while (node) {
+ push.call(self, node);
+ node = node.nextSibling;
+ }
+ } else {
+ node = getElementDocument(context).getElementById(match[2]);
+
+ if (!node) {
+ return self;
+ }
+
+ if (node.id !== match[2]) {
+ return self.find(selector);
+ }
+
+ self.length = 1;
+ self[0] = node;
+ }
+ } else {
+ return DomQuery(context).find(selector);
+ }
+ } else {
+ this.add(selector, false);
+ }
+
+ return self;
+ },
+
+ /**
+ * Converts the current set to an array.
+ *
+ * @method toArray
+ * @return {Array} Array of all nodes in set.
+ */
+ toArray: function () {
+ return Tools.toArray(this);
+ },
+
+ /**
+ * Adds new nodes to the set.
+ *
+ * @method add
+ * @param {Array/tinymce.core.dom.DomQuery} items Array of all nodes to add to set.
+ * @param {Boolean} sort Optional sort flag that enables sorting of elements.
+ * @return {tinymce.dom.DomQuery} New instance with nodes added.
+ */
+ add: function (items, sort) {
+ var self = this, nodes, i;
+
+ if (isString(items)) {
+ return self.add(DomQuery(items));
+ }
+
+ if (sort !== false) {
+ nodes = DomQuery.unique(self.toArray().concat(DomQuery.makeArray(items)));
+ self.length = nodes.length;
+ for (i = 0; i < nodes.length; i++) {
+ self[i] = nodes[i];
+ }
+ } else {
+ push.apply(self, DomQuery.makeArray(items));
+ }
+
+ return self;
+ },
+
+ /**
+ * Sets/gets attributes on the elements in the current set.
+ *
+ * @method attr
+ * @param {String/Object} name Name of attribute to get or an object with attributes to set.
+ * @param {String} value Optional value to set.
+ * @return {tinymce.dom.DomQuery/String} Current set or the specified attribute when only the name is specified.
+ */
+ attr: function (name, value) {
+ var self = this, hook;
+
+ if (typeof name === "object") {
+ each(name, function (name, value) {
+ self.attr(name, value);
+ });
+ } else if (isDefined(value)) {
+ this.each(function () {
+ var hook;
+
+ if (this.nodeType === 1) {
+ hook = attrHooks[name];
+ if (hook && hook.set) {
+ hook.set(this, value);
+ return;
+ }
+
+ if (value === null) {
+ this.removeAttribute(name, 2);
+ } else {
+ this.setAttribute(name, value, 2);
+ }
+ }
+ });
+ } else {
+ if (self[0] && self[0].nodeType === 1) {
+ hook = attrHooks[name];
+ if (hook && hook.get) {
+ return hook.get(self[0], name);
+ }
+
+ if (booleanMap[name]) {
+ return self.prop(name) ? name : undef;
+ }
+
+ value = self[0].getAttribute(name, 2);
+
+ if (value === null) {
+ value = undef;
+ }
+ }
+
+ return value;
+ }
+
+ return self;
+ },
+
+ /**
+ * Removes attributse on the elements in the current set.
+ *
+ * @method removeAttr
+ * @param {String/Object} name Name of attribute to remove.
+ * @return {tinymce.dom.DomQuery/String} Current set.
+ */
+ removeAttr: function (name) {
+ return this.attr(name, null);
+ },
+
+ /**
+ * Sets/gets properties on the elements in the current set.
+ *
+ * @method attr
+ * @param {String/Object} name Name of property to get or an object with properties to set.
+ * @param {String} value Optional value to set.
+ * @return {tinymce.dom.DomQuery/String} Current set or the specified property when only the name is specified.
+ */
+ prop: function (name, value) {
+ var self = this;
+
+ name = propFix[name] || name;
+
+ if (typeof name === "object") {
+ each(name, function (name, value) {
+ self.prop(name, value);
+ });
+ } else if (isDefined(value)) {
+ this.each(function () {
+ if (this.nodeType == 1) {
+ this[name] = value;
+ }
+ });
+ } else {
+ if (self[0] && self[0].nodeType && name in self[0]) {
+ return self[0][name];
+ }
+
+ return value;
+ }
+
+ return self;
+ },
+
+ /**
+ * Sets/gets styles on the elements in the current set.
+ *
+ * @method css
+ * @param {String/Object} name Name of style to get or an object with styles to set.
+ * @param {String} value Optional value to set.
+ * @return {tinymce.dom.DomQuery/String} Current set or the specified style when only the name is specified.
+ */
+ css: function (name, value) {
+ var self = this, elm, hook;
+
+ var camel = function (name) {
+ return name.replace(/-(\D)/g, function (a, b) {
+ return b.toUpperCase();
+ });
+ };
+
+ var dashed = function (name) {
+ return name.replace(/[A-Z]/g, function (a) {
+ return '-' + a;
+ });
+ };
+
+ if (typeof name === "object") {
+ each(name, function (name, value) {
+ self.css(name, value);
+ });
+ } else {
+ if (isDefined(value)) {
+ name = camel(name);
+
+ // Default px suffix on these
+ if (typeof value === 'number' && !numericCssMap[name]) {
+ value += 'px';
+ }
+
+ self.each(function () {
+ var style = this.style;
+
+ hook = cssHooks[name];
+ if (hook && hook.set) {
+ hook.set(this, value);
+ return;
+ }
+
+ try {
+ this.style[cssFix[name] || name] = value;
+ } catch (ex) {
+ // Ignore
+ }
+
+ if (value === null || value === '') {
+ if (style.removeProperty) {
+ style.removeProperty(dashed(name));
+ } else {
+ style.removeAttribute(name);
+ }
+ }
+ });
+ } else {
+ elm = self[0];
+
+ hook = cssHooks[name];
+ if (hook && hook.get) {
+ return hook.get(elm);
+ }
+
+ if (elm.ownerDocument.defaultView) {
+ try {
+ return elm.ownerDocument.defaultView.getComputedStyle(elm, null).getPropertyValue(dashed(name));
+ } catch (ex) {
+ return undef;
+ }
+ } else if (elm.currentStyle) {
+ return elm.currentStyle[camel(name)];
+ }
+ }
+ }
+
+ return self;
+ },
+
+ /**
+ * Removes all nodes in set from the document.
+ *
+ * @method remove
+ * @return {tinymce.dom.DomQuery} Current set with the removed nodes.
+ */
+ remove: function () {
+ var self = this, node, i = this.length;
+
+ while (i--) {
+ node = self[i];
+ Event.clean(node);
+
+ if (node.parentNode) {
+ node.parentNode.removeChild(node);
+ }
+ }
+
+ return this;
+ },
+
+ /**
+ * Empties all elements in set.
+ *
+ * @method empty
+ * @return {tinymce.dom.DomQuery} Current set with the empty nodes.
+ */
+ empty: function () {
+ var self = this, node, i = this.length;
+
+ while (i--) {
+ node = self[i];
+ while (node.firstChild) {
+ node.removeChild(node.firstChild);
+ }
+ }
+
+ return this;
+ },
+
+ /**
+ * Sets or gets the HTML of the current set or first set node.
+ *
+ * @method html
+ * @param {String} value Optional innerHTML value to set on each element.
+ * @return {tinymce.dom.DomQuery/String} Current set or the innerHTML of the first element.
+ */
+ html: function (value) {
+ var self = this, i;
+
+ if (isDefined(value)) {
+ i = self.length;
+
+ try {
+ while (i--) {
+ self[i].innerHTML = value;
+ }
+ } catch (ex) {
+ // Workaround for "Unknown runtime error" when DIV is added to P on IE
+ DomQuery(self[i]).empty().append(value);
+ }
+
+ return self;
+ }
+
+ return self[0] ? self[0].innerHTML : '';
+ },
+
+ /**
+ * Sets or gets the text of the current set or first set node.
+ *
+ * @method text
+ * @param {String} value Optional innerText value to set on each element.
+ * @return {tinymce.dom.DomQuery/String} Current set or the innerText of the first element.
+ */
+ text: function (value) {
+ var self = this, i;
+
+ if (isDefined(value)) {
+ i = self.length;
+ while (i--) {
+ if ("innerText" in self[i]) {
+ self[i].innerText = value;
+ } else {
+ self[0].textContent = value;
+ }
+ }
+
+ return self;
+ }
+
+ return self[0] ? (self[0].innerText || self[0].textContent) : '';
+ },
+
+ /**
+ * Appends the specified node/html or node set to the current set nodes.
+ *
+ * @method append
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to append to each element in set.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ append: function () {
+ return domManipulate(this, arguments, function (node) {
+ // Either element or Shadow Root
+ if (this.nodeType === 1 || (this.host && this.host.nodeType === 1)) {
+ this.appendChild(node);
+ }
+ });
+ },
+
+ /**
+ * Prepends the specified node/html or node set to the current set nodes.
+ *
+ * @method prepend
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to prepend to each element in set.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ prepend: function () {
+ return domManipulate(this, arguments, function (node) {
+ // Either element or Shadow Root
+ if (this.nodeType === 1 || (this.host && this.host.nodeType === 1)) {
+ this.insertBefore(node, this.firstChild);
+ }
+ }, true);
+ },
+
+ /**
+ * Adds the specified elements before current set nodes.
+ *
+ * @method before
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to add before to each element in set.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ before: function () {
+ var self = this;
+
+ if (self[0] && self[0].parentNode) {
+ return domManipulate(self, arguments, function (node) {
+ this.parentNode.insertBefore(node, this);
+ });
+ }
+
+ return self;
+ },
+
+ /**
+ * Adds the specified elements after current set nodes.
+ *
+ * @method after
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to add after to each element in set.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ after: function () {
+ var self = this;
+
+ if (self[0] && self[0].parentNode) {
+ return domManipulate(self, arguments, function (node) {
+ this.parentNode.insertBefore(node, this.nextSibling);
+ }, true);
+ }
+
+ return self;
+ },
+
+ /**
+ * Appends the specified set nodes to the specified selector/instance.
+ *
+ * @method appendTo
+ * @param {String/Element/Array/tinymce.dom.DomQuery} val Item to append the current set to.
+ * @return {tinymce.dom.DomQuery} Current set with the appended nodes.
+ */
+ appendTo: function (val) {
+ DomQuery(val).append(this);
+
+ return this;
+ },
+
+ /**
+ * Prepends the specified set nodes to the specified selector/instance.
+ *
+ * @method prependTo
+ * @param {String/Element/Array/tinymce.dom.DomQuery} val Item to prepend the current set to.
+ * @return {tinymce.dom.DomQuery} Current set with the prepended nodes.
+ */
+ prependTo: function (val) {
+ DomQuery(val).prepend(this);
+
+ return this;
+ },
+
+ /**
+ * Replaces the nodes in set with the specified content.
+ *
+ * @method replaceWith
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to replace nodes with.
+ * @return {tinymce.dom.DomQuery} Set with replaced nodes.
+ */
+ replaceWith: function (content) {
+ return this.before(content).remove();
+ },
+
+ /**
+ * Wraps all elements in set with the specified wrapper.
+ *
+ * @method wrap
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to wrap nodes with.
+ * @return {tinymce.dom.DomQuery} Set with wrapped nodes.
+ */
+ wrap: function (content) {
+ return wrap(this, content);
+ },
+
+ /**
+ * Wraps all nodes in set with the specified wrapper. If the nodes are siblings all of them
+ * will be wrapped in the same wrapper.
+ *
+ * @method wrapAll
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to wrap nodes with.
+ * @return {tinymce.dom.DomQuery} Set with wrapped nodes.
+ */
+ wrapAll: function (content) {
+ return wrap(this, content, true);
+ },
+
+ /**
+ * Wraps all elements inner contents in set with the specified wrapper.
+ *
+ * @method wrapInner
+ * @param {String/Element/Array/tinymce.dom.DomQuery} content Content to wrap nodes with.
+ * @return {tinymce.dom.DomQuery} Set with wrapped nodes.
+ */
+ wrapInner: function (content) {
+ this.each(function () {
+ DomQuery(this).contents().wrapAll(content);
+ });
+
+ return this;
+ },
+
+ /**
+ * Unwraps all elements by removing the parent element of each item in set.
+ *
+ * @method unwrap
+ * @return {tinymce.dom.DomQuery} Set with unwrapped nodes.
+ */
+ unwrap: function () {
+ return this.parent().each(function () {
+ DomQuery(this).replaceWith(this.childNodes);
+ });
+ },
+
+ /**
+ * Clones all nodes in set.
+ *
+ * @method clone
+ * @return {tinymce.dom.DomQuery} Set with cloned nodes.
+ */
+ clone: function () {
+ var result = [];
+
+ this.each(function () {
+ result.push(this.cloneNode(true));
+ });
+
+ return DomQuery(result);
+ },
+
+ /**
+ * Adds the specified class name to the current set elements.
+ *
+ * @method addClass
+ * @param {String} className Class name to add.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ addClass: function (className) {
+ return this.toggleClass(className, true);
+ },
+
+ /**
+ * Removes the specified class name to the current set elements.
+ *
+ * @method removeClass
+ * @param {String} className Class name to remove.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ removeClass: function (className) {
+ return this.toggleClass(className, false);
+ },
+
+ /**
+ * Toggles the specified class name on the current set elements.
+ *
+ * @method toggleClass
+ * @param {String} className Class name to add/remove.
+ * @param {Boolean} state Optional state to toggle on/off.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ toggleClass: function (className, state) {
+ var self = this;
+
+ // Functions are not supported
+ if (typeof className != 'string') {
+ return self;
+ }
+
+ if (className.indexOf(' ') !== -1) {
+ each(className.split(' '), function () {
+ self.toggleClass(this, state);
+ });
+ } else {
+ self.each(function (index, node) {
+ var existingClassName, classState;
+
+ classState = hasClass(node, className);
+ if (classState !== state) {
+ existingClassName = node.className;
+
+ if (classState) {
+ node.className = trim((" " + existingClassName + " ").replace(' ' + className + ' ', ' '));
+ } else {
+ node.className += existingClassName ? ' ' + className : className;
+ }
+ }
+ });
+ }
+
+ return self;
+ },
+
+ /**
+ * Returns true/false if the first item in set has the specified class.
+ *
+ * @method hasClass
+ * @param {String} className Class name to check for.
+ * @return {Boolean} True/false if the set has the specified class.
+ */
+ hasClass: function (className) {
+ return hasClass(this[0], className);
+ },
+
+ /**
+ * Executes the callback function for each item DomQuery collection. If you return false in the
+ * callback it will break the loop.
+ *
+ * @method each
+ * @param {function} callback Callback function to execute for each item.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ each: function (callback) {
+ return each(this, callback);
+ },
+
+ /**
+ * Binds an event with callback function to the elements in set.
+ *
+ * @method on
+ * @param {String} name Name of the event to bind.
+ * @param {function} callback Callback function to execute when the event occurs.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ on: function (name, callback) {
+ return this.each(function () {
+ Event.bind(this, name, callback);
+ });
+ },
+
+ /**
+ * Unbinds an event with callback function to the elements in set.
+ *
+ * @method off
+ * @param {String} name Optional name of the event to bind.
+ * @param {function} callback Optional callback function to execute when the event occurs.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ off: function (name, callback) {
+ return this.each(function () {
+ Event.unbind(this, name, callback);
+ });
+ },
+
+ /**
+ * Triggers the specified event by name or event object.
+ *
+ * @method trigger
+ * @param {String/Object} name Name of the event to trigger or event object.
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ trigger: function (name) {
+ return this.each(function () {
+ if (typeof name == 'object') {
+ Event.fire(this, name.type, name);
+ } else {
+ Event.fire(this, name);
+ }
+ });
+ },
+
+ /**
+ * Shows all elements in set.
+ *
+ * @method show
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ show: function () {
+ return this.css('display', '');
+ },
+
+ /**
+ * Hides all elements in set.
+ *
+ * @method hide
+ * @return {tinymce.dom.DomQuery} Current set.
+ */
+ hide: function () {
+ return this.css('display', 'none');
+ },
+
+ /**
+ * Slices the current set.
+ *
+ * @method slice
+ * @param {Number} start Start index to slice at.
+ * @param {Number} end Optional end index to end slice at.
+ * @return {tinymce.dom.DomQuery} Sliced set.
+ */
+ slice: function () {
+ return new DomQuery(slice.apply(this, arguments));
+ },
+
+ /**
+ * Makes the set equal to the specified index.
+ *
+ * @method eq
+ * @param {Number} index Index to set it equal to.
+ * @return {tinymce.dom.DomQuery} Single item set.
+ */
+ eq: function (index) {
+ return index === -1 ? this.slice(index) : this.slice(index, +index + 1);
+ },
+
+ /**
+ * Makes the set equal to first element in set.
+ *
+ * @method first
+ * @return {tinymce.dom.DomQuery} Single item set.
+ */
+ first: function () {
+ return this.eq(0);
+ },
+
+ /**
+ * Makes the set equal to last element in set.
+ *
+ * @method last
+ * @return {tinymce.dom.DomQuery} Single item set.
+ */
+ last: function () {
+ return this.eq(-1);
+ },
+
+ /**
+ * Finds elements by the specified selector for each element in set.
+ *
+ * @method find
+ * @param {String} selector Selector to find elements by.
+ * @return {tinymce.dom.DomQuery} Set with matches elements.
+ */
+ find: function (selector) {
+ var i, l, ret = [];
+
+ for (i = 0, l = this.length; i < l; i++) {
+ DomQuery.find(selector, this[i], ret);
+ }
+
+ return DomQuery(ret);
+ },
+
+ /**
+ * Filters the current set with the specified selector.
+ *
+ * @method filter
+ * @param {String/function} selector Selector to filter elements by.
+ * @return {tinymce.dom.DomQuery} Set with filtered elements.
+ */
+ filter: function (selector) {
+ if (typeof selector == 'function') {
+ return DomQuery(grep(this.toArray(), function (item, i) {
+ return selector(i, item);
+ }));
+ }
+
+ return DomQuery(DomQuery.filter(selector, this.toArray()));
+ },
+
+ /**
+ * Gets the current node or any parent matching the specified selector.
+ *
+ * @method closest
+ * @param {String/Element/tinymce.dom.DomQuery} selector Selector or element to find.
+ * @return {tinymce.dom.DomQuery} Set with closest elements.
+ */
+ closest: function (selector) {
+ var result = [];
+
+ if (selector instanceof DomQuery) {
+ selector = selector[0];
+ }
+
+ this.each(function (i, node) {
+ while (node) {
+ if (typeof selector == 'string' && DomQuery(node).is(selector)) {
+ result.push(node);
+ break;
+ } else if (node == selector) {
+ result.push(node);
+ break;
+ }
+
+ node = node.parentNode;
+ }
+ });
+
+ return DomQuery(result);
+ },
+
+ /**
+ * Returns the offset of the first element in set or sets the top/left css properties of all elements in set.
+ *
+ * @method offset
+ * @param {Object} offset Optional offset object to set on each item.
+ * @return {Object/tinymce.dom.DomQuery} Returns the first element offset or the current set if you specified an offset.
+ */
+ offset: function (offset) {
+ var elm, doc, docElm;
+ var x = 0, y = 0, pos;
+
+ if (!offset) {
+ elm = this[0];
+
+ if (elm) {
+ doc = elm.ownerDocument;
+ docElm = doc.documentElement;
+
+ if (elm.getBoundingClientRect) {
+ pos = elm.getBoundingClientRect();
+ x = pos.left + (docElm.scrollLeft || doc.body.scrollLeft) - docElm.clientLeft;
+ y = pos.top + (docElm.scrollTop || doc.body.scrollTop) - docElm.clientTop;
+ }
+ }
+
+ return {
+ left: x,
+ top: y
+ };
+ }
+
+ return this.css(offset);
+ },
+
+ push: push,
+ sort: [].sort,
+ splice: [].splice
+ };
+
+ // Static members
+ Tools.extend(DomQuery, {
+ /**
+ * Extends the specified object with one or more objects.
+ *
+ * @static
+ * @method extend
+ * @param {Object} target Target object to extend with new items.
+ * @param {Object..} object Object to extend the target with.
+ * @return {Object} Extended input object.
+ */
+ extend: Tools.extend,
+
+ /**
+ * Creates an array out of an array like object.
+ *
+ * @static
+ * @method makeArray
+ * @param {Object} object Object to convert to array.
+ * @return {Array} Array produced from object.
+ */
+ makeArray: function (object) {
+ if (isWindow(object) || object.nodeType) {
+ return [object];
+ }
+
+ return Tools.toArray(object);
+ },
+
+ /**
+ * Returns the index of the specified item inside the array.
+ *
+ * @static
+ * @method inArray
+ * @param {Object} item Item to look for.
+ * @param {Array} array Array to look for item in.
+ * @return {Number} Index of the item or -1.
+ */
+ inArray: inArray,
+
+ /**
+ * Returns true/false if the specified object is an array or not.
+ *
+ * @static
+ * @method isArray
+ * @param {Object} array Object to check if it's an array or not.
+ * @return {Boolean} True/false if the object is an array.
+ */
+ isArray: Tools.isArray,
+
+ /**
+ * Executes the callback function for each item in array/object. If you return false in the
+ * callback it will break the loop.
+ *
+ * @static
+ * @method each
+ * @param {Object} obj Object to iterate.
+ * @param {function} callback Callback function to execute for each item.
+ */
+ each: each,
+
+ /**
+ * Removes whitespace from the beginning and end of a string.
+ *
+ * @static
+ * @method trim
+ * @param {String} str String to remove whitespace from.
+ * @return {String} New string with removed whitespace.
+ */
+ trim: trim,
+
+ /**
+ * Filters out items from the input array by calling the specified function for each item.
+ * If the function returns false the item will be excluded if it returns true it will be included.
+ *
+ * @static
+ * @method grep
+ * @param {Array} array Array of items to loop though.
+ * @param {function} callback Function to call for each item. Include/exclude depends on it's return value.
+ * @return {Array} New array with values imported and filtered based in input.
+ * @example
+ * // Filter out some items, this will return an array with 4 and 5
+ * var items = DomQuery.grep([1, 2, 3, 4, 5], function(v) {return v > 3;});
+ */
+ grep: grep,
+
+ // Sizzle
+ find: Sizzle,
+ expr: Sizzle.selectors,
+ unique: Sizzle.uniqueSort,
+ text: Sizzle.getText,
+ contains: Sizzle.contains,
+ filter: function (expr, elems, not) {
+ var i = elems.length;
+
+ if (not) {
+ expr = ":not(" + expr + ")";
+ }
+
+ while (i--) {
+ if (elems[i].nodeType != 1) {
+ elems.splice(i, 1);
+ }
+ }
+
+ if (elems.length === 1) {
+ elems = DomQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [];
+ } else {
+ elems = DomQuery.find.matches(expr, elems);
+ }
+
+ return elems;
+ }
+ });
+
+ var dir = function (el, prop, until) {
+ var matched = [], cur = el[prop];
+
+ if (typeof until != 'string' && until instanceof DomQuery) {
+ until = until[0];
+ }
+
+ while (cur && cur.nodeType !== 9) {
+ if (until !== undefined) {
+ if (cur === until) {
+ break;
+ }
+
+ if (typeof until == 'string' && DomQuery(cur).is(until)) {
+ break;
+ }
+ }
+
+ if (cur.nodeType === 1) {
+ matched.push(cur);
+ }
+
+ cur = cur[prop];
+ }
+
+ return matched;
+ };
+
+ var sibling = function (node, siblingName, nodeType, until) {
+ var result = [];
+
+ if (until instanceof DomQuery) {
+ until = until[0];
+ }
+
+ for (; node; node = node[siblingName]) {
+ if (nodeType && node.nodeType !== nodeType) {
+ continue;
+ }
+
+ if (until !== undefined) {
+ if (node === until) {
+ break;
+ }
+
+ if (typeof until == 'string' && DomQuery(node).is(until)) {
+ break;
+ }
+ }
+
+ result.push(node);
+ }
+
+ return result;
+ };
+
+ var firstSibling = function (node, siblingName, nodeType) {
+ for (node = node[siblingName]; node; node = node[siblingName]) {
+ if (node.nodeType == nodeType) {
+ return node;
+ }
+ }
+
+ return null;
+ };
+
+ each({
+ /**
+ * Returns a new collection with the parent of each item in current collection matching the optional selector.
+ *
+ * @method parent
+ * @param {Element/tinymce.dom.DomQuery} node Node to match parents against.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching parents.
+ */
+ parent: function (node) {
+ var parent = node.parentNode;
+
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+
+ /**
+ * Returns a new collection with the all the parents of each item in current collection matching the optional selector.
+ *
+ * @method parents
+ * @param {Element/tinymce.dom.DomQuery} node Node to match parents against.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching parents.
+ */
+ parents: function (node) {
+ return dir(node, "parentNode");
+ },
+
+ /**
+ * Returns a new collection with next sibling of each item in current collection matching the optional selector.
+ *
+ * @method next
+ * @param {Element/tinymce.dom.DomQuery} node Node to match the next element against.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching elements.
+ */
+ next: function (node) {
+ return firstSibling(node, 'nextSibling', 1);
+ },
+
+ /**
+ * Returns a new collection with previous sibling of each item in current collection matching the optional selector.
+ *
+ * @method prev
+ * @param {Element/tinymce.dom.DomQuery} node Node to match the previous element against.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching elements.
+ */
+ prev: function (node) {
+ return firstSibling(node, 'previousSibling', 1);
+ },
+
+ /**
+ * Returns all child elements matching the optional selector.
+ *
+ * @method children
+ * @param {Element/tinymce.dom.DomQuery} node Node to match the elements against.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching elements.
+ */
+ children: function (node) {
+ return sibling(node.firstChild, 'nextSibling', 1);
+ },
+
+ /**
+ * Returns all child nodes matching the optional selector.
+ *
+ * @method contents
+ * @param {Element/tinymce.dom.DomQuery} node Node to get the contents of.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching elements.
+ */
+ contents: function (node) {
+ return Tools.toArray((node.nodeName === "iframe" ? node.contentDocument || node.contentWindow.document : node).childNodes);
+ }
+ }, function (name, fn) {
+ DomQuery.fn[name] = function (selector) {
+ var self = this, result = [];
+
+ self.each(function () {
+ var nodes = fn.call(result, this, selector, result);
+
+ if (nodes) {
+ if (DomQuery.isArray(nodes)) {
+ result.push.apply(result, nodes);
+ } else {
+ result.push(nodes);
+ }
+ }
+ });
+
+ // If traversing on multiple elements we might get the same elements twice
+ if (this.length > 1) {
+ if (!skipUniques[name]) {
+ result = DomQuery.unique(result);
+ }
+
+ if (name.indexOf('parents') === 0) {
+ result = result.reverse();
+ }
+ }
+
+ result = DomQuery(result);
+
+ if (selector) {
+ return result.filter(selector);
+ }
+
+ return result;
+ };
+ });
+
+ each({
+ /**
+ * Returns a new collection with the all the parents until the matching selector/element
+ * of each item in current collection matching the optional selector.
+ *
+ * @method parentsUntil
+ * @param {Element/tinymce.dom.DomQuery} node Node to find parent of.
+ * @param {String/Element/tinymce.dom.DomQuery} until Until the matching selector or element.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching parents.
+ */
+ parentsUntil: function (node, until) {
+ return dir(node, "parentNode", until);
+ },
+
+ /**
+ * Returns a new collection with all next siblings of each item in current collection matching the optional selector.
+ *
+ * @method nextUntil
+ * @param {Element/tinymce.dom.DomQuery} node Node to find next siblings on.
+ * @param {String/Element/tinymce.dom.DomQuery} until Until the matching selector or element.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching elements.
+ */
+ nextUntil: function (node, until) {
+ return sibling(node, 'nextSibling', 1, until).slice(1);
+ },
+
+ /**
+ * Returns a new collection with all previous siblings of each item in current collection matching the optional selector.
+ *
+ * @method prevUntil
+ * @param {Element/tinymce.dom.DomQuery} node Node to find previous siblings on.
+ * @param {String/Element/tinymce.dom.DomQuery} until Until the matching selector or element.
+ * @return {tinymce.dom.DomQuery} New DomQuery instance with all matching elements.
+ */
+ prevUntil: function (node, until) {
+ return sibling(node, 'previousSibling', 1, until).slice(1);
+ }
+ }, function (name, fn) {
+ DomQuery.fn[name] = function (selector, filter) {
+ var self = this, result = [];
+
+ self.each(function () {
+ var nodes = fn.call(result, this, selector, result);
+
+ if (nodes) {
+ if (DomQuery.isArray(nodes)) {
+ result.push.apply(result, nodes);
+ } else {
+ result.push(nodes);
+ }
+ }
+ });
+
+ // If traversing on multiple elements we might get the same elements twice
+ if (this.length > 1) {
+ result = DomQuery.unique(result);
+
+ if (name.indexOf('parents') === 0 || name === 'prevUntil') {
+ result = result.reverse();
+ }
+ }
+
+ result = DomQuery(result);
+
+ if (filter) {
+ return result.filter(filter);
+ }
+
+ return result;
+ };
+ });
+
+ /**
+ * Returns true/false if the current set items matches the selector.
+ *
+ * @method is
+ * @param {String} selector Selector to match the elements against.
+ * @return {Boolean} True/false if the current set matches the selector.
+ */
+ DomQuery.fn.is = function (selector) {
+ return !!selector && this.filter(selector).length > 0;
+ };
+
+ DomQuery.fn.init.prototype = DomQuery.fn;
+
+ DomQuery.overrideDefaults = function (callback) {
+ var defaults;
+
+ var sub = function (selector, context) {
+ defaults = defaults || callback();
+
+ if (arguments.length === 0) {
+ selector = defaults.element;
+ }
+
+ if (!context) {
+ context = defaults.context;
+ }
+
+ return new sub.fn.init(selector, context);
+ };
+
+ DomQuery.extend(sub, this);
+
+ return sub;
+ };
+
+ var appendHooks = function (targetHooks, prop, hooks) {
+ each(hooks, function (name, func) {
+ targetHooks[name] = targetHooks[name] || {};
+ targetHooks[name][prop] = func;
+ });
+ };
+
+ if (Env.ie && Env.ie < 8) {
+ appendHooks(attrHooks, 'get', {
+ maxlength: function (elm) {
+ var value = elm.maxLength;
+
+ if (value === 0x7fffffff) {
+ return undef;
+ }
+
+ return value;
+ },
+
+ size: function (elm) {
+ var value = elm.size;
+
+ if (value === 20) {
+ return undef;
+ }
+
+ return value;
+ },
+
+ 'class': function (elm) {
+ return elm.className;
+ },
+
+ style: function (elm) {
+ var value = elm.style.cssText;
+
+ if (value.length === 0) {
+ return undef;
+ }
+
+ return value;
+ }
+ });
+
+ appendHooks(attrHooks, 'set', {
+ 'class': function (elm, value) {
+ elm.className = value;
+ },
+
+ style: function (elm, value) {
+ elm.style.cssText = value;
+ }
+ });
+ }
+
+ if (Env.ie && Env.ie < 9) {
+ /*jshint sub:true */
+ /*eslint dot-notation: 0*/
+ cssFix['float'] = 'styleFloat';
+
+ appendHooks(cssHooks, 'set', {
+ opacity: function (elm, value) {
+ var style = elm.style;
+
+ if (value === null || value === '') {
+ style.removeAttribute('filter');
+ } else {
+ style.zoom = 1;
+ style.filter = 'alpha(opacity=' + (value * 100) + ')';
+ }
+ }
+ });
+ }
+
+ DomQuery.attrHooks = attrHooks;
+ DomQuery.cssHooks = cssHooks;
+
+ return DomQuery;
+ }
+);
+
+define(
+ 'ephox.katamari.api.Thunk',
+
+ [
+ ],
+
+ function () {
+
+ var cached = function (f) {
+ var called = false;
+ var r;
+ return function() {
+ if (!called) {
+ called = true;
+ r = f.apply(null, arguments);
+ }
+ return r;
+ };
+ };
+
+ return {
+ cached: cached
+ };
+ }
+);
+
+defineGlobal("global!Number", Number);
+define(
+ 'ephox.sand.detect.Version',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'global!Number',
+ 'global!String'
+ ],
+
+ function (Arr, Number, String) {
+ var firstMatch = function (regexes, s) {
+ for (var i = 0; i < regexes.length; i++) {
+ var x = regexes[i];
+ if (x.test(s)) return x;
+ }
+ return undefined;
+ };
+
+ var find = function (regexes, agent) {
+ var r = firstMatch(regexes, agent);
+ if (!r) return { major : 0, minor : 0 };
+ var group = function(i) {
+ return Number(agent.replace(r, '$' + i));
+ };
+ return nu(group(1), group(2));
+ };
+
+ var detect = function (versionRegexes, agent) {
+ var cleanedAgent = String(agent).toLowerCase();
+
+ if (versionRegexes.length === 0) return unknown();
+ return find(versionRegexes, cleanedAgent);
+ };
+
+ var unknown = function () {
+ return nu(0, 0);
+ };
+
+ var nu = function (major, minor) {
+ return { major: major, minor: minor };
+ };
+
+ return {
+ nu: nu,
+ detect: detect,
+ unknown: unknown
+ };
+ }
+);
+define(
+ 'ephox.sand.core.Browser',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.sand.detect.Version'
+ ],
+
+ function (Fun, Version) {
+ var edge = 'Edge';
+ var chrome = 'Chrome';
+ var ie = 'IE';
+ var opera = 'Opera';
+ var firefox = 'Firefox';
+ var safari = 'Safari';
+
+ var isBrowser = function (name, current) {
+ return function () {
+ return current === name;
+ };
+ };
+
+ var unknown = function () {
+ return nu({
+ current: undefined,
+ version: Version.unknown()
+ });
+ };
+
+ var nu = function (info) {
+ var current = info.current;
+ var version = info.version;
+
+ return {
+ current: current,
+ version: version,
+
+ // INVESTIGATE: Rename to Edge ?
+ isEdge: isBrowser(edge, current),
+ isChrome: isBrowser(chrome, current),
+ // NOTE: isIe just looks too weird
+ isIE: isBrowser(ie, current),
+ isOpera: isBrowser(opera, current),
+ isFirefox: isBrowser(firefox, current),
+ isSafari: isBrowser(safari, current)
+ };
+ };
+
+ return {
+ unknown: unknown,
+ nu: nu,
+ edge: Fun.constant(edge),
+ chrome: Fun.constant(chrome),
+ ie: Fun.constant(ie),
+ opera: Fun.constant(opera),
+ firefox: Fun.constant(firefox),
+ safari: Fun.constant(safari)
+ };
+ }
+);
+define(
+ 'ephox.sand.core.OperatingSystem',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.sand.detect.Version'
+ ],
+
+ function (Fun, Version) {
+ var windows = 'Windows';
+ var ios = 'iOS';
+ var android = 'Android';
+ var linux = 'Linux';
+ var osx = 'OSX';
+ var solaris = 'Solaris';
+ var freebsd = 'FreeBSD';
+
+ // Though there is a bit of dupe with this and Browser, trying to
+ // reuse code makes it much harder to follow and change.
+ var isOS = function (name, current) {
+ return function () {
+ return current === name;
+ };
+ };
+
+ var unknown = function () {
+ return nu({
+ current: undefined,
+ version: Version.unknown()
+ });
+ };
+
+ var nu = function (info) {
+ var current = info.current;
+ var version = info.version;
+
+ return {
+ current: current,
+ version: version,
+
+ isWindows: isOS(windows, current),
+ // TODO: Fix capitalisation
+ isiOS: isOS(ios, current),
+ isAndroid: isOS(android, current),
+ isOSX: isOS(osx, current),
+ isLinux: isOS(linux, current),
+ isSolaris: isOS(solaris, current),
+ isFreeBSD: isOS(freebsd, current)
+ };
+ };
+
+ return {
+ unknown: unknown,
+ nu: nu,
+
+ windows: Fun.constant(windows),
+ ios: Fun.constant(ios),
+ android: Fun.constant(android),
+ linux: Fun.constant(linux),
+ osx: Fun.constant(osx),
+ solaris: Fun.constant(solaris),
+ freebsd: Fun.constant(freebsd)
+ };
+ }
+);
+define(
+ 'ephox.sand.detect.DeviceType',
+
+ [
+ 'ephox.katamari.api.Fun'
+ ],
+
+ function (Fun) {
+ return function (os, browser, userAgent) {
+ var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
+ var isiPhone = os.isiOS() && !isiPad;
+ var isAndroid3 = os.isAndroid() && os.version.major === 3;
+ var isAndroid4 = os.isAndroid() && os.version.major === 4;
+ var isTablet = isiPad || isAndroid3 || ( isAndroid4 && /mobile/i.test(userAgent) === true );
+ var isTouch = os.isiOS() || os.isAndroid();
+ var isPhone = isTouch && !isTablet;
+
+ var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
+
+ return {
+ isiPad : Fun.constant(isiPad),
+ isiPhone: Fun.constant(isiPhone),
+ isTablet: Fun.constant(isTablet),
+ isPhone: Fun.constant(isPhone),
+ isTouch: Fun.constant(isTouch),
+ isAndroid: os.isAndroid,
+ isiOS: os.isiOS,
+ isWebView: Fun.constant(iOSwebview)
+ };
+ };
+ }
+);
+define(
+ 'ephox.sand.detect.UaString',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.sand.detect.Version',
+ 'global!String'
+ ],
+
+ function (Arr, Version, String) {
+ var detect = function (candidates, userAgent) {
+ var agent = String(userAgent).toLowerCase();
+ return Arr.find(candidates, function (candidate) {
+ return candidate.search(agent);
+ });
+ };
+
+ // They (browser and os) are the same at the moment, but they might
+ // not stay that way.
+ var detectBrowser = function (browsers, userAgent) {
+ return detect(browsers, userAgent).map(function (browser) {
+ var version = Version.detect(browser.versionRegexes, userAgent);
+ return {
+ current: browser.name,
+ version: version
+ };
+ });
+ };
+
+ var detectOs = function (oses, userAgent) {
+ return detect(oses, userAgent).map(function (os) {
+ var version = Version.detect(os.versionRegexes, userAgent);
+ return {
+ current: os.name,
+ version: version
+ };
+ });
+ };
+
+ return {
+ detectBrowser: detectBrowser,
+ detectOs: detectOs
+ };
+ }
+);
+define(
+ 'ephox.katamari.str.StrAppend',
+
+ [
+
+ ],
+
+ function () {
+ var addToStart = function (str, prefix) {
+ return prefix + str;
+ };
+
+ var addToEnd = function (str, suffix) {
+ return str + suffix;
+ };
+
+ var removeFromStart = function (str, numChars) {
+ return str.substring(numChars);
+ };
+
+ var removeFromEnd = function (str, numChars) {
+ return str.substring(0, str.length - numChars);
+ };
+
+ return {
+ addToStart: addToStart,
+ addToEnd: addToEnd,
+ removeFromStart: removeFromStart,
+ removeFromEnd: removeFromEnd
+ };
+ }
+);
+define(
+ 'ephox.katamari.str.StringParts',
+
+ [
+ 'ephox.katamari.api.Option',
+ 'global!Error'
+ ],
+
+ function (Option, Error) {
+ /** Return the first 'count' letters from 'str'.
+- * e.g. first("abcde", 2) === "ab"
+- */
+ var first = function(str, count) {
+ return str.substr(0, count);
+ };
+
+ /** Return the last 'count' letters from 'str'.
+ * e.g. last("abcde", 2) === "de"
+ */
+ var last = function(str, count) {
+ return str.substr(str.length - count, str.length);
+ };
+
+ var head = function(str) {
+ return str === '' ? Option.none() : Option.some(str.substr(0, 1));
+ };
+
+ var tail = function(str) {
+ return str === '' ? Option.none() : Option.some(str.substring(1));
+ };
+
+ return {
+ first: first,
+ last: last,
+ head: head,
+ tail: tail
+ };
+ }
+);
+define(
+ 'ephox.katamari.api.Strings',
+
+ [
+ 'ephox.katamari.str.StrAppend',
+ 'ephox.katamari.str.StringParts',
+ 'global!Error'
+ ],
+
+ function (StrAppend, StringParts, Error) {
+ var checkRange = function(str, substr, start) {
+ if (substr === '') return true;
+ if (str.length < substr.length) return false;
+ var x = str.substr(start, start + substr.length);
+ return x === substr;
+ };
+
+ /** Given a string and object, perform template-replacements on the string, as specified by the object.
+ * Any template fields of the form ${name} are replaced by the string or number specified as obj["name"]
+ * Based on Douglas Crockford's 'supplant' method for template-replace of strings. Uses different template format.
+ */
+ var supplant = function(str, obj) {
+ var isStringOrNumber = function(a) {
+ var t = typeof a;
+ return t === 'string' || t === 'number';
+ };
+
+ return str.replace(/\${([^{}]*)}/g,
+ function (a, b) {
+ var value = obj[b];
+ return isStringOrNumber(value) ? value : a;
+ }
+ );
+ };
+
+ var removeLeading = function (str, prefix) {
+ return startsWith(str, prefix) ? StrAppend.removeFromStart(str, prefix.length) : str;
+ };
+
+ var removeTrailing = function (str, prefix) {
+ return endsWith(str, prefix) ? StrAppend.removeFromEnd(str, prefix.length) : str;
+ };
+
+ var ensureLeading = function (str, prefix) {
+ return startsWith(str, prefix) ? str : StrAppend.addToStart(str, prefix);
+ };
+
+ var ensureTrailing = function (str, prefix) {
+ return endsWith(str, prefix) ? str : StrAppend.addToEnd(str, prefix);
+ };
+
+ var contains = function(str, substr) {
+ return str.indexOf(substr) !== -1;
+ };
+
+ var capitalize = function(str) {
+ return StringParts.head(str).bind(function (head) {
+ return StringParts.tail(str).map(function (tail) {
+ return head.toUpperCase() + tail;
+ });
+ }).getOr(str);
+ };
+
+ /** Does 'str' start with 'prefix'?
+ * Note: all strings start with the empty string.
+ * More formally, for all strings x, startsWith(x, "").
+ * This is so that for all strings x and y, startsWith(y + x, y)
+ */
+ var startsWith = function(str, prefix) {
+ return checkRange(str, prefix, 0);
+ };
+
+ /** Does 'str' end with 'suffix'?
+ * Note: all strings end with the empty string.
+ * More formally, for all strings x, endsWith(x, "").
+ * This is so that for all strings x and y, endsWith(x + y, y)
+ */
+ var endsWith = function(str, suffix) {
+ return checkRange(str, suffix, str.length - suffix.length);
+ };
+
+
+ /** removes all leading and trailing spaces */
+ var trim = function(str) {
+ return str.replace(/^\s+|\s+$/g, '');
+ };
+
+ var lTrim = function(str) {
+ return str.replace(/^\s+/g, '');
+ };
+
+ var rTrim = function(str) {
+ return str.replace(/\s+$/g, '');
+ };
+
+ return {
+ supplant: supplant,
+ startsWith: startsWith,
+ removeLeading: removeLeading,
+ removeTrailing: removeTrailing,
+ ensureLeading: ensureLeading,
+ ensureTrailing: ensureTrailing,
+ endsWith: endsWith,
+ contains: contains,
+ trim: trim,
+ lTrim: lTrim,
+ rTrim: rTrim,
+ capitalize: capitalize
+ };
+ }
+);
+
+define(
+ 'ephox.sand.info.PlatformInfo',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Strings'
+ ],
+
+ function (Fun, Strings) {
+ var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
+
+ var checkContains = function (target) {
+ return function (uastring) {
+ return Strings.contains(uastring, target);
+ };
+ };
+
+ var browsers = [
+ {
+ name : 'Edge',
+ versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
+ search: function (uastring) {
+ var monstrosity = Strings.contains(uastring, 'edge/') && Strings.contains(uastring, 'chrome') && Strings.contains(uastring, 'safari') && Strings.contains(uastring, 'applewebkit');
+ return monstrosity;
+ }
+ },
+ {
+ name : 'Chrome',
+ versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex],
+ search : function (uastring) {
+ return Strings.contains(uastring, 'chrome') && !Strings.contains(uastring, 'chromeframe');
+ }
+ },
+ {
+ name : 'IE',
+ versionRegexes: [/.*?msie\ ?([0-9]+)\.([0-9]+).*/, /.*?rv:([0-9]+)\.([0-9]+).*/],
+ search: function (uastring) {
+ return Strings.contains(uastring, 'msie') || Strings.contains(uastring, 'trident');
+ }
+ },
+ // INVESTIGATE: Is this still the Opera user agent?
+ {
+ name : 'Opera',
+ versionRegexes: [normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/],
+ search : checkContains('opera')
+ },
+ {
+ name : 'Firefox',
+ versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
+ search : checkContains('firefox')
+ },
+ {
+ name : 'Safari',
+ versionRegexes: [normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/],
+ search : function (uastring) {
+ return (Strings.contains(uastring, 'safari') || Strings.contains(uastring, 'mobile/')) && Strings.contains(uastring, 'applewebkit');
+ }
+ }
+ ];
+
+ var oses = [
+ {
+ name : 'Windows',
+ search : checkContains('win'),
+ versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
+ },
+ {
+ name : 'iOS',
+ search : function (uastring) {
+ return Strings.contains(uastring, 'iphone') || Strings.contains(uastring, 'ipad');
+ },
+ versionRegexes: [/.*?version\/\ ?([0-9]+)\.([0-9]+).*/, /.*cpu os ([0-9]+)_([0-9]+).*/, /.*cpu iphone os ([0-9]+)_([0-9]+).*/]
+ },
+ {
+ name : 'Android',
+ search : checkContains('android'),
+ versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
+ },
+ {
+ name : 'OSX',
+ search : checkContains('os x'),
+ versionRegexes: [/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]
+ },
+ {
+ name : 'Linux',
+ search : checkContains('linux'),
+ versionRegexes: [ ]
+ },
+ { name : 'Solaris',
+ search : checkContains('sunos'),
+ versionRegexes: [ ]
+ },
+ {
+ name : 'FreeBSD',
+ search : checkContains('freebsd'),
+ versionRegexes: [ ]
+ }
+ ];
+
+ return {
+ browsers: Fun.constant(browsers),
+ oses: Fun.constant(oses)
+ };
+ }
+);
+define(
+ 'ephox.sand.core.PlatformDetection',
+
+ [
+ 'ephox.sand.core.Browser',
+ 'ephox.sand.core.OperatingSystem',
+ 'ephox.sand.detect.DeviceType',
+ 'ephox.sand.detect.UaString',
+ 'ephox.sand.info.PlatformInfo'
+ ],
+
+ function (Browser, OperatingSystem, DeviceType, UaString, PlatformInfo) {
+ var detect = function (userAgent) {
+ var browsers = PlatformInfo.browsers();
+ var oses = PlatformInfo.oses();
+
+ var browser = UaString.detectBrowser(browsers, userAgent).fold(
+ Browser.unknown,
+ Browser.nu
+ );
+ var os = UaString.detectOs(oses, userAgent).fold(
+ OperatingSystem.unknown,
+ OperatingSystem.nu
+ );
+ var deviceType = DeviceType(os, browser, userAgent);
+
+ return {
+ browser: browser,
+ os: os,
+ deviceType: deviceType
+ };
+ };
+
+ return {
+ detect: detect
+ };
+ }
+);
+define(
+ 'ephox.sand.api.PlatformDetection',
+
+ [
+ 'ephox.katamari.api.Thunk',
+ 'ephox.sand.core.PlatformDetection',
+ 'global!navigator'
+ ],
+
+ function (Thunk, PlatformDetection, navigator) {
+ var detect = Thunk.cached(function () {
+ var userAgent = navigator.userAgent;
+ return PlatformDetection.detect(userAgent);
+ });
+
+ return {
+ detect: detect
+ };
+ }
+);
+define("global!console", [], function () { if (typeof console === "undefined") console = { log: function () {} }; return console; });
+define(
+ 'ephox.sugar.api.node.Element',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'global!Error',
+ 'global!console',
+ 'global!document'
+ ],
+
+ function (Fun, Option, Error, console, document) {
+ var fromHtml = function (html, scope) {
+ var doc = scope || document;
+ var div = doc.createElement('div');
+ div.innerHTML = html;
+ if (!div.hasChildNodes() || div.childNodes.length > 1) {
+ console.error('HTML does not have a single root node', html);
+ throw 'HTML must have a single root node';
+ }
+ return fromDom(div.childNodes[0]);
+ };
+
+ var fromTag = function (tag, scope) {
+ var doc = scope || document;
+ var node = doc.createElement(tag);
+ return fromDom(node);
+ };
+
+ var fromText = function (text, scope) {
+ var doc = scope || document;
+ var node = doc.createTextNode(text);
+ return fromDom(node);
+ };
+
+ var fromDom = function (node) {
+ if (node === null || node === undefined) throw new Error('Node cannot be null or undefined');
+ return {
+ dom: Fun.constant(node)
+ };
+ };
+
+ var fromPoint = function (doc, x, y) {
+ return Option.from(doc.dom().elementFromPoint(x, y)).map(fromDom);
+ };
+
+ return {
+ fromHtml: fromHtml,
+ fromTag: fromTag,
+ fromText: fromText,
+ fromDom: fromDom,
+ fromPoint: fromPoint
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.node.NodeTypes',
+
+ [
+
+ ],
+
+ function () {
+ return {
+ ATTRIBUTE: 2,
+ CDATA_SECTION: 4,
+ COMMENT: 8,
+ DOCUMENT: 9,
+ DOCUMENT_TYPE: 10,
+ DOCUMENT_FRAGMENT: 11,
+ ELEMENT: 1,
+ TEXT: 3,
+ PROCESSING_INSTRUCTION: 7,
+ ENTITY_REFERENCE: 5,
+ ENTITY: 6,
+ NOTATION: 12
+ };
+ }
+);
+define(
+ 'ephox.sugar.api.node.Node',
+
+ [
+ 'ephox.sugar.api.node.NodeTypes'
+ ],
+
+ function (NodeTypes) {
+ var name = function (element) {
+ var r = element.dom().nodeName;
+ return r.toLowerCase();
+ };
+
+ var type = function (element) {
+ return element.dom().nodeType;
+ };
+
+ var value = function (element) {
+ return element.dom().nodeValue;
+ };
+
+ var isType = function (t) {
+ return function (element) {
+ return type(element) === t;
+ };
+ };
+
+ var isComment = function (element) {
+ return type(element) === NodeTypes.COMMENT || name(element) === '#comment';
+ };
+
+ var isElement = isType(NodeTypes.ELEMENT);
+ var isText = isType(NodeTypes.TEXT);
+ var isDocument = isType(NodeTypes.DOCUMENT);
+
+ return {
+ name: name,
+ type: type,
+ value: value,
+ isElement: isElement,
+ isText: isText,
+ isDocument: isDocument,
+ isComment: isComment
+ };
+ }
+);
+
+define(
+ 'ephox.katamari.api.Type',
+
+ [
+ 'global!Array',
+ 'global!String'
+ ],
+
+ function (Array, String) {
+ var typeOf = function(x) {
+ if (x === null) return 'null';
+ var t = typeof x;
+ if (t === 'object' && Array.prototype.isPrototypeOf(x)) return 'array';
+ if (t === 'object' && String.prototype.isPrototypeOf(x)) return 'string';
+ return t;
+ };
+
+ var isType = function (type) {
+ return function (value) {
+ return typeOf(value) === type;
+ };
+ };
+
+ return {
+ isString: isType('string'),
+ isObject: isType('object'),
+ isArray: isType('array'),
+ isNull: isType('null'),
+ isBoolean: isType('boolean'),
+ isUndefined: isType('undefined'),
+ isFunction: isType('function'),
+ isNumber: isType('number')
+ };
+ }
+);
+
+
+define(
+ 'ephox.katamari.api.Obj',
+
+ [
+ 'ephox.katamari.api.Option',
+ 'global!Object'
+ ],
+
+ function (Option, Object) {
+ // There are many variations of Object iteration that are faster than the 'for-in' style:
+ // http://jsperf.com/object-keys-iteration/107
+ //
+ // Use the native keys if it is available (IE9+), otherwise fall back to manually filtering
+ var keys = (function () {
+ var fastKeys = Object.keys;
+
+ // This technically means that 'each' and 'find' on IE8 iterate through the object twice.
+ // This code doesn't run on IE8 much, so it's an acceptable tradeoff.
+ // If it becomes a problem we can always duplicate the feature detection inside each and find as well.
+ var slowKeys = function (o) {
+ var r = [];
+ for (var i in o) {
+ if (o.hasOwnProperty(i)) {
+ r.push(i);
+ }
+ }
+ return r;
+ };
+
+ return fastKeys === undefined ? slowKeys : fastKeys;
+ })();
+
+
+ var each = function (obj, f) {
+ var props = keys(obj);
+ for (var k = 0, len = props.length; k < len; k++) {
+ var i = props[k];
+ var x = obj[i];
+ f(x, i, obj);
+ }
+ };
+
+ /** objectMap :: (JsObj(k, v), (v, k, JsObj(k, v) -> x)) -> JsObj(k, x) */
+ var objectMap = function (obj, f) {
+ return tupleMap(obj, function (x, i, obj) {
+ return {
+ k: i,
+ v: f(x, i, obj)
+ };
+ });
+ };
+
+ /** tupleMap :: (JsObj(k, v), (v, k, JsObj(k, v) -> { k: x, v: y })) -> JsObj(x, y) */
+ var tupleMap = function (obj, f) {
+ var r = {};
+ each(obj, function (x, i) {
+ var tuple = f(x, i, obj);
+ r[tuple.k] = tuple.v;
+ });
+ return r;
+ };
+
+ /** bifilter :: (JsObj(k, v), (v, k -> Bool)) -> { t: JsObj(k, v), f: JsObj(k, v) } */
+ var bifilter = function (obj, pred) {
+ var t = {};
+ var f = {};
+ each(obj, function(x, i) {
+ var branch = pred(x, i) ? t : f;
+ branch[i] = x;
+ });
+ return {
+ t: t,
+ f: f
+ };
+ };
+
+ /** mapToArray :: (JsObj(k, v), (v, k -> a)) -> [a] */
+ var mapToArray = function (obj, f) {
+ var r = [];
+ each(obj, function(value, name) {
+ r.push(f(value, name));
+ });
+ return r;
+ };
+
+ /** find :: (JsObj(k, v), (v, k, JsObj(k, v) -> Bool)) -> Option v */
+ var find = function (obj, pred) {
+ var props = keys(obj);
+ for (var k = 0, len = props.length; k < len; k++) {
+ var i = props[k];
+ var x = obj[i];
+ if (pred(x, i, obj)) {
+ return Option.some(x);
+ }
+ }
+ return Option.none();
+ };
+
+ /** values :: JsObj(k, v) -> [v] */
+ var values = function (obj) {
+ return mapToArray(obj, function (v) {
+ return v;
+ });
+ };
+
+ var size = function (obj) {
+ return values(obj).length;
+ };
+
+ return {
+ bifilter: bifilter,
+ each: each,
+ map: objectMap,
+ mapToArray: mapToArray,
+ tupleMap: tupleMap,
+ find: find,
+ keys: keys,
+ values: values,
+ size: size
+ };
+ }
+);
+define(
+ 'ephox.sugar.api.properties.Attr',
+
+ [
+ 'ephox.katamari.api.Type',
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Obj',
+ 'ephox.sugar.api.node.Node',
+ 'global!Error',
+ 'global!console'
+ ],
+
+ /*
+ * Direct attribute manipulation has been around since IE8, but
+ * was apparently unstable until IE10.
+ */
+ function (Type, Arr, Obj, Node, Error, console) {
+ var rawSet = function (dom, key, value) {
+ /*
+ * JQuery coerced everything to a string, and silently did nothing on text node/null/undefined.
+ *
+ * We fail on those invalid cases, only allowing numbers and booleans.
+ */
+ if (Type.isString(value) || Type.isBoolean(value) || Type.isNumber(value)) {
+ dom.setAttribute(key, value + '');
+ } else {
+ console.error('Invalid call to Attr.set. Key ', key, ':: Value ', value, ':: Element ', dom);
+ throw new Error('Attribute value was not simple');
+ }
+ };
+
+ var set = function (element, key, value) {
+ rawSet(element.dom(), key, value);
+ };
+
+ var setAll = function (element, attrs) {
+ var dom = element.dom();
+ Obj.each(attrs, function (v, k) {
+ rawSet(dom, k, v);
+ });
+ };
+
+ var get = function (element, key) {
+ var v = element.dom().getAttribute(key);
+
+ // undefined is the more appropriate value for JS, and this matches JQuery
+ return v === null ? undefined : v;
+ };
+
+ var has = function (element, key) {
+ var dom = element.dom();
+
+ // return false for non-element nodes, no point in throwing an error
+ return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;
+ };
+
+ var remove = function (element, key) {
+ element.dom().removeAttribute(key);
+ };
+
+ var hasNone = function (element) {
+ var attrs = element.dom().attributes;
+ return attrs === undefined || attrs === null || attrs.length === 0;
+ };
+
+ var clone = function (element) {
+ return Arr.foldl(element.dom().attributes, function (acc, attr) {
+ acc[attr.name] = attr.value;
+ return acc;
+ }, {});
+ };
+
+ var transferOne = function (source, destination, attr) {
+ // NOTE: We don't want to clobber any existing attributes
+ if (has(source, attr) && !has(destination, attr)) set(destination, attr, get(source, attr));
+ };
+
+ // Transfer attributes(attrs) from source to destination, unless they are already present
+ var transfer = function (source, destination, attrs) {
+ if (!Node.isElement(source) || !Node.isElement(destination)) return;
+ Arr.each(attrs, function (attr) {
+ transferOne(source, destination, attr);
+ });
+ };
+
+ return {
+ clone: clone,
+ set: set,
+ setAll: setAll,
+ get: get,
+ has: has,
+ remove: remove,
+ hasNone: hasNone,
+ transfer: transfer
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.node.Body',
+
+ [
+ 'ephox.katamari.api.Thunk',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'global!document'
+ ],
+
+ function (Thunk, Element, Node, document) {
+
+ // Node.contains() is very, very, very good performance
+ // http://jsperf.com/closest-vs-contains/5
+ var inBody = function (element) {
+ // Technically this is only required on IE, where contains() returns false for text nodes.
+ // But it's cheap enough to run everywhere and Sugar doesn't have platform detection (yet).
+ var dom = Node.isText(element) ? element.dom().parentNode : element.dom();
+
+ // use ownerDocument.body to ensure this works inside iframes.
+ // Normally contains is bad because an element "contains" itself, but here we want that.
+ return dom !== undefined && dom !== null && dom.ownerDocument.body.contains(dom);
+ };
+
+ var body = Thunk.cached(function() {
+ return getBody(Element.fromDom(document));
+ });
+
+ var getBody = function (doc) {
+ var body = doc.dom().body;
+ if (body === null || body === undefined) throw 'Body is not available yet';
+ return Element.fromDom(body);
+ };
+
+ return {
+ body: body,
+ getBody: getBody,
+ inBody: inBody
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.impl.Style',
+
+ [
+
+ ],
+
+ function () {
+ // some elements, such as mathml, don't have style attributes
+ var isSupported = function (dom) {
+ return dom.style !== undefined;
+ };
+
+ return {
+ isSupported: isSupported
+ };
+ }
+);
+define(
+ 'ephox.sugar.api.properties.Css',
+
+ [
+ 'ephox.katamari.api.Type',
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Obj',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.properties.Attr',
+ 'ephox.sugar.api.node.Body',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'ephox.sugar.impl.Style',
+ 'ephox.katamari.api.Strings',
+ 'global!Error',
+ 'global!console',
+ 'global!window'
+ ],
+
+ function (Type, Arr, Obj, Option, Attr, Body, Element, Node, Style, Strings, Error, console, window) {
+ var internalSet = function (dom, property, value) {
+ // This is going to hurt. Apologies.
+ // JQuery coerces numbers to pixels for certain property names, and other times lets numbers through.
+ // we're going to be explicit; strings only.
+ if (!Type.isString(value)) {
+ console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
+ throw new Error('CSS value must be a string: ' + value);
+ }
+
+ // removed: support for dom().style[property] where prop is camel case instead of normal property name
+ if (Style.isSupported(dom)) dom.style.setProperty(property, value);
+ };
+
+ var internalRemove = function (dom, property) {
+ /*
+ * IE9 and above - MDN doesn't have details, but here's a couple of random internet claims
+ *
+ * http://help.dottoro.com/ljopsjck.php
+ * http://stackoverflow.com/a/7901886/7546
+ */
+ if (Style.isSupported(dom)) dom.style.removeProperty(property);
+ };
+
+ var set = function (element, property, value) {
+ var dom = element.dom();
+ internalSet(dom, property, value);
+ };
+
+ var setAll = function (element, css) {
+ var dom = element.dom();
+
+ Obj.each(css, function (v, k) {
+ internalSet(dom, k, v);
+ });
+ };
+
+ var setOptions = function(element, css) {
+ var dom = element.dom();
+
+ Obj.each(css, function (v, k) {
+ v.fold(function () {
+ internalRemove(dom, k);
+ }, function (value) {
+ internalSet(dom, k, value);
+ });
+ });
+ };
+
+ /*
+ * NOTE: For certain properties, this returns the "used value" which is subtly different to the "computed value" (despite calling getComputedStyle).
+ * Blame CSS 2.0.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
+ */
+ var get = function (element, property) {
+ var dom = element.dom();
+ /*
+ * IE9 and above per
+ * https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle
+ *
+ * Not in numerosity, because it doesn't memoize and looking this up dynamically in performance critical code would be horrendous.
+ *
+ * JQuery has some magic here for IE popups, but we don't really need that.
+ * It also uses element.ownerDocument.defaultView to handle iframes but that hasn't been required since FF 3.6.
+ */
+ var styles = window.getComputedStyle(dom);
+ var r = styles.getPropertyValue(property);
+
+ // jquery-ism: If r is an empty string, check that the element is not in a document. If it isn't, return the raw value.
+ // Turns out we do this a lot.
+ var v = (r === '' && !Body.inBody(element)) ? getUnsafeProperty(dom, property) : r;
+
+ // undefined is the more appropriate value for JS. JQuery coerces to an empty string, but screw that!
+ return v === null ? undefined : v;
+ };
+
+ var getUnsafeProperty = function (dom, property) {
+ // removed: support for dom().style[property] where prop is camel case instead of normal property name
+ // empty string is what the browsers (IE11 and Chrome) return when the propertyValue doesn't exists.
+ return Style.isSupported(dom) ? dom.style.getPropertyValue(property) : '';
+ };
+
+ /*
+ * Gets the raw value from the style attribute. Useful for retrieving "used values" from the DOM:
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/used_value
+ *
+ * Returns NONE if the property isn't set, or the value is an empty string.
+ */
+ var getRaw = function (element, property) {
+ var dom = element.dom();
+ var raw = getUnsafeProperty(dom, property);
+
+ return Option.from(raw).filter(function (r) { return r.length > 0; });
+ };
+
+ var getAllRaw = function (element) {
+ var css = {};
+ var dom = element.dom();
+
+ if (Style.isSupported(dom)) {
+ for (var i = 0; i < dom.style.length; i++) {
+ var ruleName = dom.style.item(i);
+ css[ruleName] = dom.style[ruleName];
+ }
+ }
+ return css;
+ };
+
+ var isValidValue = function (tag, property, value) {
+ var element = Element.fromTag(tag);
+ set(element, property, value);
+ var style = getRaw(element, property);
+ return style.isSome();
+ };
+
+ var remove = function (element, property) {
+ var dom = element.dom();
+
+ internalRemove(dom, property);
+
+ if (Attr.has(element, 'style') && Strings.trim(Attr.get(element, 'style')) === '') {
+ // No more styles left, remove the style attribute as well
+ Attr.remove(element, 'style');
+ }
+ };
+
+ var preserve = function (element, f) {
+ var oldStyles = Attr.get(element, 'style');
+ var result = f(element);
+ var restore = oldStyles === undefined ? Attr.remove : Attr.set;
+ restore(element, 'style', oldStyles);
+ return result;
+ };
+
+ var copy = function (source, target) {
+ var sourceDom = source.dom();
+ var targetDom = target.dom();
+ if (Style.isSupported(sourceDom) && Style.isSupported(targetDom)) {
+ targetDom.style.cssText = sourceDom.style.cssText;
+ }
+ };
+
+ var reflow = function (e) {
+ /* NOTE:
+ * do not rely on this return value.
+ * It's here so the closure compiler doesn't optimise the property access away.
+ */
+ return e.dom().offsetWidth;
+ };
+
+ var transferOne = function (source, destination, style) {
+ getRaw(source, style).each(function (value) {
+ // NOTE: We don't want to clobber any existing inline styles.
+ if (getRaw(destination, style).isNone()) set(destination, style, value);
+ });
+ };
+
+ var transfer = function (source, destination, styles) {
+ if (!Node.isElement(source) || !Node.isElement(destination)) return;
+ Arr.each(styles, function (style) {
+ transferOne(source, destination, style);
+ });
+ };
+
+ return {
+ copy: copy,
+ set: set,
+ preserve: preserve,
+ setAll: setAll,
+ setOptions: setOptions,
+ remove: remove,
+ get: get,
+ getRaw: getRaw,
+ getAllRaw: getAllRaw,
+ isValidValue: isValidValue,
+ reflow: reflow,
+ transfer: transfer
+ };
+ }
+);
+
+define(
+ 'ephox.katamari.data.Immutable',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'global!Array',
+ 'global!Error'
+ ],
+
+ function (Arr, Fun, Array, Error) {
+ return function () {
+ var fields = arguments;
+ return function(/* values */) {
+ // Don't use array slice(arguments), makes the whole function unoptimisable on Chrome
+ var values = new Array(arguments.length);
+ for (var i = 0; i < values.length; i++) values[i] = arguments[i];
+
+ if (fields.length !== values.length)
+ throw new Error('Wrong number of arguments to struct. Expected "[' + fields.length + ']", got ' + values.length + ' arguments');
+
+ var struct = {};
+ Arr.each(fields, function (name, i) {
+ struct[name] = Fun.constant(values[i]);
+ });
+ return struct;
+ };
+ };
+ }
+);
+
+define(
+ 'ephox.katamari.util.BagUtils',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Type',
+ 'global!Error'
+ ],
+
+ function (Arr, Type, Error) {
+ var sort = function (arr) {
+ return arr.slice(0).sort();
+ };
+
+ var reqMessage = function (required, keys) {
+ throw new Error('All required keys (' + sort(required).join(', ') + ') were not specified. Specified keys were: ' + sort(keys).join(', ') + '.');
+ };
+
+ var unsuppMessage = function (unsupported) {
+ throw new Error('Unsupported keys for object: ' + sort(unsupported).join(', '));
+ };
+
+ var validateStrArr = function (label, array) {
+ if (!Type.isArray(array)) throw new Error('The ' + label + ' fields must be an array. Was: ' + array + '.');
+ Arr.each(array, function (a) {
+ if (!Type.isString(a)) throw new Error('The value ' + a + ' in the ' + label + ' fields was not a string.');
+ });
+ };
+
+ var invalidTypeMessage = function (incorrect, type) {
+ throw new Error('All values need to be of type: ' + type + '. Keys (' + sort(incorrect).join(', ') + ') were not.');
+ };
+
+ var checkDupes = function (everything) {
+ var sorted = sort(everything);
+ var dupe = Arr.find(sorted, function (s, i) {
+ return i < sorted.length -1 && s === sorted[i + 1];
+ });
+
+ dupe.each(function (d) {
+ throw new Error('The field: ' + d + ' occurs more than once in the combined fields: [' + sorted.join(', ') + '].');
+ });
+ };
+
+ return {
+ sort: sort,
+ reqMessage: reqMessage,
+ unsuppMessage: unsuppMessage,
+ validateStrArr: validateStrArr,
+ invalidTypeMessage: invalidTypeMessage,
+ checkDupes: checkDupes
+ };
+ }
+);
+define(
+ 'ephox.katamari.data.MixedBag',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Obj',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.util.BagUtils',
+ 'global!Error',
+ 'global!Object'
+ ],
+
+ function (Arr, Fun, Obj, Option, BagUtils, Error, Object) {
+
+ return function (required, optional) {
+ var everything = required.concat(optional);
+ if (everything.length === 0) throw new Error('You must specify at least one required or optional field.');
+
+ BagUtils.validateStrArr('required', required);
+ BagUtils.validateStrArr('optional', optional);
+
+ BagUtils.checkDupes(everything);
+
+ return function (obj) {
+ var keys = Obj.keys(obj);
+
+ // Ensure all required keys are present.
+ var allReqd = Arr.forall(required, function (req) {
+ return Arr.contains(keys, req);
+ });
+
+ if (! allReqd) BagUtils.reqMessage(required, keys);
+
+ var unsupported = Arr.filter(keys, function (key) {
+ return !Arr.contains(everything, key);
+ });
+
+ if (unsupported.length > 0) BagUtils.unsuppMessage(unsupported);
+
+ var r = {};
+ Arr.each(required, function (req) {
+ r[req] = Fun.constant(obj[req]);
+ });
+
+ Arr.each(optional, function (opt) {
+ r[opt] = Fun.constant(Object.prototype.hasOwnProperty.call(obj, opt) ? Option.some(obj[opt]): Option.none());
+ });
+
+ return r;
+ };
+ };
+ }
+);
+define(
+ 'ephox.katamari.api.Struct',
+
+ [
+ 'ephox.katamari.data.Immutable',
+ 'ephox.katamari.data.MixedBag'
+ ],
+
+ function (Immutable, MixedBag) {
+ return {
+ immutable: Immutable,
+ immutableBag: MixedBag
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.alien.Recurse',
+
+ [
+
+ ],
+
+ function () {
+ /**
+ * Applies f repeatedly until it completes (by returning Option.none()).
+ *
+ * Normally would just use recursion, but JavaScript lacks tail call optimisation.
+ *
+ * This is what recursion looks like when manually unravelled :)
+ */
+ var toArray = function (target, f) {
+ var r = [];
+
+ var recurse = function (e) {
+ r.push(e);
+ return f(e);
+ };
+
+ var cur = f(target);
+ do {
+ cur = cur.bind(recurse);
+ } while (cur.isSome());
+
+ return r;
+ };
+
+ return {
+ toArray: toArray
+ };
+ }
+);
+define(
+ 'ephox.sand.api.Node',
+
+ [
+ 'ephox.sand.util.Global'
+ ],
+
+ function (Global) {
+ /*
+ * MDN says (yes) for IE, but it's undefined on IE8
+ */
+ var node = function () {
+ var f = Global.getOrDie('Node');
+ return f;
+ };
+
+ /*
+ * Most of numerosity doesn't alter the methods on the object.
+ * We're making an exception for Node, because bitwise and is so easy to get wrong.
+ *
+ * Might be nice to ADT this at some point instead of having individual methods.
+ */
+
+ var compareDocumentPosition = function (a, b, match) {
+ // Returns: 0 if e1 and e2 are the same node, or a bitmask comparing the positions
+ // of nodes e1 and e2 in their documents. See the URL below for bitmask interpretation
+ // https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition
+ return (a.compareDocumentPosition(b) & match) !== 0;
+ };
+
+ var documentPositionPreceding = function (a, b) {
+ return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_PRECEDING);
+ };
+
+ var documentPositionContainedBy = function (a, b) {
+ return compareDocumentPosition(a, b, node().DOCUMENT_POSITION_CONTAINED_BY);
+ };
+
+ return {
+ documentPositionPreceding: documentPositionPreceding,
+ documentPositionContainedBy: documentPositionContainedBy
+ };
+ }
+);
+define(
+ 'ephox.sugar.api.search.Selectors',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.NodeTypes',
+ 'global!Error',
+ 'global!document'
+ ],
+
+ function (Arr, Option, Element, NodeTypes, Error, document) {
+ var ELEMENT = NodeTypes.ELEMENT;
+ var DOCUMENT = NodeTypes.DOCUMENT;
+
+ var is = function (element, selector) {
+ var elem = element.dom();
+ if (elem.nodeType !== ELEMENT) return false; // documents have querySelector but not matches
+
+ // As of Chrome 34 / Safari 7.1 / FireFox 34, everyone except IE has the unprefixed function.
+ // Still check for the others, but do it last.
+ else if (elem.matches !== undefined) return elem.matches(selector);
+ else if (elem.msMatchesSelector !== undefined) return elem.msMatchesSelector(selector);
+ else if (elem.webkitMatchesSelector !== undefined) return elem.webkitMatchesSelector(selector);
+ else if (elem.mozMatchesSelector !== undefined) return elem.mozMatchesSelector(selector);
+ else throw new Error('Browser lacks native selectors'); // unfortunately we can't throw this on startup :(
+ };
+
+ var bypassSelector = function (dom) {
+ // Only elements and documents support querySelector
+ return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT ||
+ // IE fix for complex queries on empty nodes: http://jsfiddle.net/spyder/fv9ptr5L/
+ dom.childElementCount === 0;
+ };
+
+ var all = function (selector, scope) {
+ var base = scope === undefined ? document : scope.dom();
+ return bypassSelector(base) ? [] : Arr.map(base.querySelectorAll(selector), Element.fromDom);
+ };
+
+ var one = function (selector, scope) {
+ var base = scope === undefined ? document : scope.dom();
+ return bypassSelector(base) ? Option.none() : Option.from(base.querySelector(selector)).map(Element.fromDom);
+ };
+
+ return {
+ all: all,
+ is: is,
+ one: one
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.dom.Compare',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.sand.api.Node',
+ 'ephox.sand.api.PlatformDetection',
+ 'ephox.sugar.api.search.Selectors'
+ ],
+
+ function (Arr, Fun, Node, PlatformDetection, Selectors) {
+
+ var eq = function (e1, e2) {
+ return e1.dom() === e2.dom();
+ };
+
+ var isEqualNode = function (e1, e2) {
+ return e1.dom().isEqualNode(e2.dom());
+ };
+
+ var member = function (element, elements) {
+ return Arr.exists(elements, Fun.curry(eq, element));
+ };
+
+ // DOM contains() method returns true if e1===e2, we define our contains() to return false (a node does not contain itself).
+ var regularContains = function (e1, e2) {
+ var d1 = e1.dom(), d2 = e2.dom();
+ return d1 === d2 ? false : d1.contains(d2);
+ };
+
+ var ieContains = function (e1, e2) {
+ // IE only implements the contains() method for Element nodes.
+ // It fails for Text nodes, so implement it using compareDocumentPosition()
+ // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect
+ // Note that compareDocumentPosition returns CONTAINED_BY if 'e2 *is_contained_by* e1':
+ // Also, compareDocumentPosition defines a node containing itself as false.
+ return Node.documentPositionContainedBy(e1.dom(), e2.dom());
+ };
+
+ var browser = PlatformDetection.detect().browser;
+
+ // Returns: true if node e1 contains e2, otherwise false.
+ // (returns false if e1===e2: A node does not contain itself).
+ var contains = browser.isIE() ? ieContains : regularContains;
+
+ return {
+ eq: eq,
+ isEqualNode: isEqualNode,
+ member: member,
+ contains: contains,
+
+ // Only used by DomUniverse. Remove (or should Selectors.is move here?)
+ is: Selectors.is
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.search.Traverse',
+
+ [
+ 'ephox.katamari.api.Type',
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Struct',
+ 'ephox.sugar.alien.Recurse',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element'
+ ],
+
+ function (Type, Arr, Fun, Option, Struct, Recurse, Compare, Element) {
+ // The document associated with the current element
+ var owner = function (element) {
+ return Element.fromDom(element.dom().ownerDocument);
+ };
+
+ var documentElement = function (element) {
+ // TODO: Avoid unnecessary wrap/unwrap here
+ var doc = owner(element);
+ return Element.fromDom(doc.dom().documentElement);
+ };
+
+ // The window element associated with the element
+ var defaultView = function (element) {
+ var el = element.dom();
+ var defaultView = el.ownerDocument.defaultView;
+ return Element.fromDom(defaultView);
+ };
+
+ var parent = function (element) {
+ var dom = element.dom();
+ return Option.from(dom.parentNode).map(Element.fromDom);
+ };
+
+ var findIndex = function (element) {
+ return parent(element).bind(function (p) {
+ // TODO: Refactor out children so we can avoid the constant unwrapping
+ var kin = children(p);
+ return Arr.findIndex(kin, function (elem) {
+ return Compare.eq(element, elem);
+ });
+ });
+ };
+
+ var parents = function (element, isRoot) {
+ var stop = Type.isFunction(isRoot) ? isRoot : Fun.constant(false);
+
+ // This is used a *lot* so it needs to be performant, not recursive
+ var dom = element.dom();
+ var ret = [];
+
+ while (dom.parentNode !== null && dom.parentNode !== undefined) {
+ var rawParent = dom.parentNode;
+ var parent = Element.fromDom(rawParent);
+ ret.push(parent);
+
+ if (stop(parent) === true) break;
+ else dom = rawParent;
+ }
+ return ret;
+ };
+
+ var siblings = function (element) {
+ // TODO: Refactor out children so we can just not add self instead of filtering afterwards
+ var filterSelf = function (elements) {
+ return Arr.filter(elements, function (x) {
+ return !Compare.eq(element, x);
+ });
+ };
+
+ return parent(element).map(children).map(filterSelf).getOr([]);
+ };
+
+ var offsetParent = function (element) {
+ var dom = element.dom();
+ return Option.from(dom.offsetParent).map(Element.fromDom);
+ };
+
+ var prevSibling = function (element) {
+ var dom = element.dom();
+ return Option.from(dom.previousSibling).map(Element.fromDom);
+ };
+
+ var nextSibling = function (element) {
+ var dom = element.dom();
+ return Option.from(dom.nextSibling).map(Element.fromDom);
+ };
+
+ var prevSiblings = function (element) {
+ // This one needs to be reversed, so they're still in DOM order
+ return Arr.reverse(Recurse.toArray(element, prevSibling));
+ };
+
+ var nextSiblings = function (element) {
+ return Recurse.toArray(element, nextSibling);
+ };
+
+ var children = function (element) {
+ var dom = element.dom();
+ return Arr.map(dom.childNodes, Element.fromDom);
+ };
+
+ var child = function (element, index) {
+ var children = element.dom().childNodes;
+ return Option.from(children[index]).map(Element.fromDom);
+ };
+
+ var firstChild = function (element) {
+ return child(element, 0);
+ };
+
+ var lastChild = function (element) {
+ return child(element, element.dom().childNodes.length - 1);
+ };
+
+ var childNodesCount = function (element) {
+ return element.dom().childNodes.length;
+ };
+
+ var hasChildNodes = function (element) {
+ return element.dom().hasChildNodes();
+ };
+
+ var spot = Struct.immutable('element', 'offset');
+ var leaf = function (element, offset) {
+ var cs = children(element);
+ return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset);
+ };
+
+ return {
+ owner: owner,
+ defaultView: defaultView,
+ documentElement: documentElement,
+ parent: parent,
+ findIndex: findIndex,
+ parents: parents,
+ siblings: siblings,
+ prevSibling: prevSibling,
+ offsetParent: offsetParent,
+ prevSiblings: prevSiblings,
+ nextSibling: nextSibling,
+ nextSiblings: nextSiblings,
+ children: children,
+ child: child,
+ firstChild: firstChild,
+ lastChild: lastChild,
+ childNodesCount: childNodesCount,
+ hasChildNodes: hasChildNodes,
+ leaf: leaf
+ };
+ }
+);
+
+/**
+ * Position.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.dom.Position',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.sand.api.PlatformDetection',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'ephox.sugar.api.properties.Css',
+ 'ephox.sugar.api.search.Traverse'
+ ],
+ function (Arr, PlatformDetection, Element, Node, Css, Traverse) {
+ var browser = PlatformDetection.detect().browser;
+
+ var firstElement = function (nodes) {
+ return Arr.find(nodes, Node.isElement);
+ };
+
+ // Firefox has a bug where caption height is not included correctly in offset calculations of tables
+ // this tries to compensate for that by detecting if that offsets are incorrect and then remove the height
+ var getTableCaptionDeltaY = function (elm) {
+ if (browser.isFirefox() && Node.name(elm) === 'table') {
+ return firstElement(Traverse.children(elm)).filter(function (elm) {
+ return Node.name(elm) === 'caption';
+ }).bind(function (caption) {
+ return firstElement(Traverse.nextSiblings(caption)).map(function (body) {
+ var bodyTop = body.dom().offsetTop;
+ var captionTop = caption.dom().offsetTop;
+ var captionHeight = caption.dom().offsetHeight;
+ return bodyTop <= captionTop ? -captionHeight : 0;
+ });
+ }).getOr(0);
+ } else {
+ return 0;
+ }
+ };
+
+ var getPos = function (body, elm, rootElm) {
+ var x = 0, y = 0, offsetParent, doc = body.ownerDocument, pos;
+
+ rootElm = rootElm ? rootElm : body;
+
+ if (elm) {
+ // Use getBoundingClientRect if it exists since it's faster than looping offset nodes
+ // Fallback to offsetParent calculations if the body isn't static better since it stops at the body root
+ if (rootElm === body && elm.getBoundingClientRect && Css.get(Element.fromDom(body), 'position') === 'static') {
+ pos = elm.getBoundingClientRect();
+
+ // Add scroll offsets from documentElement or body since IE with the wrong box model will use d.body and so do WebKit
+ // Also remove the body/documentelement clientTop/clientLeft on IE 6, 7 since they offset the position
+ x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;
+ y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;
+
+ return { x: x, y: y };
+ }
+
+ offsetParent = elm;
+ while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType) {
+ x += offsetParent.offsetLeft || 0;
+ y += offsetParent.offsetTop || 0;
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ offsetParent = elm.parentNode;
+ while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType) {
+ x -= offsetParent.scrollLeft || 0;
+ y -= offsetParent.scrollTop || 0;
+ offsetParent = offsetParent.parentNode;
+ }
+
+ y += getTableCaptionDeltaY(Element.fromDom(elm));
+ }
+
+ return { x: x, y: y };
+ };
+
+ return {
+ getPos: getPos
+ };
+ }
+);
+define(
+ 'ephox.katamari.api.LazyValue',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Option',
+ 'global!setTimeout'
+ ],
+
+ function (Arr, Option, setTimeout) {
+ var nu = function (baseFn) {
+ var data = Option.none();
+ var callbacks = [];
+
+ /** map :: this LazyValue a -> (a -> b) -> LazyValue b */
+ var map = function (f) {
+ return nu(function (nCallback) {
+ get(function (data) {
+ nCallback(f(data));
+ });
+ });
+ };
+
+ var get = function (nCallback) {
+ if (isReady()) call(nCallback);
+ else callbacks.push(nCallback);
+ };
+
+ var set = function (x) {
+ data = Option.some(x);
+ run(callbacks);
+ callbacks = [];
+ };
+
+ var isReady = function () {
+ return data.isSome();
+ };
+
+ var run = function (cbs) {
+ Arr.each(cbs, call);
+ };
+
+ var call = function(cb) {
+ data.each(function(x) {
+ setTimeout(function() {
+ cb(x);
+ }, 0);
+ });
+ };
+
+ // Lazy values cache the value and kick off immediately
+ baseFn(set);
+
+ return {
+ get: get,
+ map: map,
+ isReady: isReady
+ };
+ };
+
+ var pure = function (a) {
+ return nu(function (callback) {
+ callback(a);
+ });
+ };
+
+ return {
+ nu: nu,
+ pure: pure
+ };
+ }
+);
+define(
+ 'ephox.katamari.async.Bounce',
+
+ [
+ 'global!Array',
+ 'global!setTimeout'
+ ],
+
+ function (Array, setTimeout) {
+
+ var bounce = function(f) {
+ return function() {
+ var args = Array.prototype.slice.call(arguments);
+ var me = this;
+ setTimeout(function() {
+ f.apply(me, args);
+ }, 0);
+ };
+ };
+
+ return {
+ bounce: bounce
+ };
+ }
+);
+
+define(
+ 'ephox.katamari.api.Future',
+
+ [
+ 'ephox.katamari.api.LazyValue',
+ 'ephox.katamari.async.Bounce'
+ ],
+
+ /** A future value that is evaluated on demand. The base function is re-evaluated each time 'get' is called. */
+ function (LazyValue, Bounce) {
+ var nu = function (baseFn) {
+ var get = function(callback) {
+ baseFn(Bounce.bounce(callback));
+ };
+
+ /** map :: this Future a -> (a -> b) -> Future b */
+ var map = function (fab) {
+ return nu(function (callback) {
+ get(function (a) {
+ var value = fab(a);
+ callback(value);
+ });
+ });
+ };
+
+ /** bind :: this Future a -> (a -> Future b) -> Future b */
+ var bind = function (aFutureB) {
+ return nu(function (callback) {
+ get(function (a) {
+ aFutureB(a).get(callback);
+ });
+ });
+ };
+
+ /** anonBind :: this Future a -> Future b -> Future b
+ * Returns a future, which evaluates the first future, ignores the result, then evaluates the second.
+ */
+ var anonBind = function (futureB) {
+ return nu(function (callback) {
+ get(function (a) {
+ futureB.get(callback);
+ });
+ });
+ };
+
+ var toLazy = function () {
+ return LazyValue.nu(get);
+ };
+
+ return {
+ map: map,
+ bind: bind,
+ anonBind: anonBind,
+ toLazy: toLazy,
+ get: get
+ };
+
+ };
+
+ /** a -> Future a */
+ var pure = function (a) {
+ return nu(function (callback) {
+ callback(a);
+ });
+ };
+
+ return {
+ nu: nu,
+ pure: pure
+ };
+ }
+);
+
+define(
+ 'ephox.katamari.async.AsyncValues',
+
+ [
+ 'ephox.katamari.api.Arr'
+ ],
+
+ function (Arr) {
+ /*
+ * NOTE: an `asyncValue` must have a `get` function which gets given a callback and calls
+ * that callback with a value once it is ready
+ *
+ * e.g
+ * {
+ * get: function (callback) { callback(10); }
+ * }
+ */
+ var par = function (asyncValues, nu) {
+ return nu(function(callback) {
+ var r = [];
+ var count = 0;
+
+ var cb = function(i) {
+ return function(value) {
+ r[i] = value;
+ count++;
+ if (count >= asyncValues.length) {
+ callback(r);
+ }
+ };
+ };
+
+ if (asyncValues.length === 0) {
+ callback([]);
+ } else {
+ Arr.each(asyncValues, function(asyncValue, i) {
+ asyncValue.get(cb(i));
+ });
+ }
+ });
+ };
+
+ return {
+ par: par
+ };
+ }
+);
+define(
+ 'ephox.katamari.api.Futures',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Future',
+ 'ephox.katamari.async.AsyncValues'
+ ],
+
+ function (Arr, Future, AsyncValues) {
+ /** par :: [Future a] -> Future [a] */
+ var par = function(futures) {
+ return AsyncValues.par(futures, Future.nu);
+ };
+
+ /** mapM :: [a] -> (a -> Future b) -> Future [b] */
+ var mapM = function(array, fn) {
+ var futures = Arr.map(array, fn);
+ return par(futures);
+ };
+
+ /** Kleisli composition of two functions: a -> Future b.
+ * Note the order of arguments: g is invoked first, then the result passed to f.
+ * This is in line with f . g = \x -> f (g a)
+ *
+ * compose :: ((b -> Future c), (a -> Future b)) -> a -> Future c
+ */
+ var compose = function (f, g) {
+ return function (a) {
+ return g(a).bind(f);
+ };
+ };
+
+ return {
+ par: par,
+ mapM: mapM,
+ compose: compose
+ };
+ }
+);
+define(
+ 'ephox.katamari.api.Result',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option'
+ ],
+
+ function (Fun, Option) {
+ /* The type signatures for Result
+ * is :: this Result a -> a -> Bool
+ * or :: this Result a -> Result a -> Result a
+ * orThunk :: this Result a -> (_ -> Result a) -> Result a
+ * map :: this Result a -> (a -> b) -> Result b
+ * each :: this Result a -> (a -> _) -> _
+ * bind :: this Result a -> (a -> Result b) -> Result b
+ * fold :: this Result a -> (_ -> b, a -> b) -> b
+ * exists :: this Result a -> (a -> Bool) -> Bool
+ * forall :: this Result a -> (a -> Bool) -> Bool
+ * toOption :: this Result a -> Option a
+ * isValue :: this Result a -> Bool
+ * isError :: this Result a -> Bool
+ * getOr :: this Result a -> a -> a
+ * getOrThunk :: this Result a -> (_ -> a) -> a
+ * getOrDie :: this Result a -> a (or throws error)
+ */
+
+ var value = function (o) {
+ var is = function (v) {
+ return o === v;
+ };
+
+ var or = function (opt) {
+ return value(o);
+ };
+
+ var orThunk = function (f) {
+ return value(o);
+ };
+
+ var map = function (f) {
+ return value(f(o));
+ };
+
+ var each = function (f) {
+ f(o);
+ };
+
+ var bind = function (f) {
+ return f(o);
+ };
+
+ var fold = function (_, onValue) {
+ return onValue(o);
+ };
+
+ var exists = function (f) {
+ return f(o);
+ };
+
+ var forall = function (f) {
+ return f(o);
+ };
+
+ var toOption = function () {
+ return Option.some(o);
+ };
+
+ return {
+ is: is,
+ isValue: Fun.constant(true),
+ isError: Fun.constant(false),
+ getOr: Fun.constant(o),
+ getOrThunk: Fun.constant(o),
+ getOrDie: Fun.constant(o),
+ or: or,
+ orThunk: orThunk,
+ fold: fold,
+ map: map,
+ each: each,
+ bind: bind,
+ exists: exists,
+ forall: forall,
+ toOption: toOption
+ };
+ };
+
+ var error = function (message) {
+ var getOrThunk = function (f) {
+ return f();
+ };
+
+ var getOrDie = function () {
+ return Fun.die(message)();
+ };
+
+ var or = function (opt) {
+ return opt;
+ };
+
+ var orThunk = function (f) {
+ return f();
+ };
+
+ var map = function (f) {
+ return error(message);
+ };
+
+ var bind = function (f) {
+ return error(message);
+ };
+
+ var fold = function (onError, _) {
+ return onError(message);
+ };
+
+ return {
+ is: Fun.constant(false),
+ isValue: Fun.constant(false),
+ isError: Fun.constant(true),
+ getOr: Fun.identity,
+ getOrThunk: getOrThunk,
+ getOrDie: getOrDie,
+ or: or,
+ orThunk: orThunk,
+ fold: fold,
+ map: map,
+ each: Fun.noop,
+ bind: bind,
+ exists: Fun.constant(false),
+ forall: Fun.constant(true),
+ toOption: Option.none
+ };
+ };
+
+ return {
+ value: value,
+ error: error
+ };
+ }
+);
+
+/**
+ * StyleSheetLoader.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class handles loading of external stylesheets and fires events when these are loaded.
+ *
+ * @class tinymce.dom.StyleSheetLoader
+ * @private
+ */
+define(
+ 'tinymce.core.dom.StyleSheetLoader',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Future',
+ 'ephox.katamari.api.Futures',
+ 'ephox.katamari.api.Result',
+ 'global!navigator',
+ 'tinymce.core.util.Delay',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Arr, Fun, Future, Futures, Result, navigator, Delay, Tools) {
+ "use strict";
+
+ return function (document, settings) {
+ var idCount = 0, loadedStates = {}, maxLoadTime;
+
+ settings = settings || {};
+ maxLoadTime = settings.maxLoadTime || 5000;
+
+ var appendToHead = function (node) {
+ document.getElementsByTagName('head')[0].appendChild(node);
+ };
+
+ /**
+ * Loads the specified css style sheet file and call the loadedCallback once it's finished loading.
+ *
+ * @method load
+ * @param {String} url Url to be loaded.
+ * @param {Function} loadedCallback Callback to be executed when loaded.
+ * @param {Function} errorCallback Callback to be executed when failed loading.
+ */
+ var load = function (url, loadedCallback, errorCallback) {
+ var link, style, startTime, state;
+
+ var passed = function () {
+ var callbacks = state.passed, i = callbacks.length;
+
+ while (i--) {
+ callbacks[i]();
+ }
+
+ state.status = 2;
+ state.passed = [];
+ state.failed = [];
+ };
+
+ var failed = function () {
+ var callbacks = state.failed, i = callbacks.length;
+
+ while (i--) {
+ callbacks[i]();
+ }
+
+ state.status = 3;
+ state.passed = [];
+ state.failed = [];
+ };
+
+ // Sniffs for older WebKit versions that have the link.onload but a broken one
+ var isOldWebKit = function () {
+ var webKitChunks = navigator.userAgent.match(/WebKit\/(\d*)/);
+ return !!(webKitChunks && webKitChunks[1] < 536);
+ };
+
+ // Calls the waitCallback until the test returns true or the timeout occurs
+ var wait = function (testCallback, waitCallback) {
+ if (!testCallback()) {
+ // Wait for timeout
+ if ((new Date().getTime()) - startTime < maxLoadTime) {
+ Delay.setTimeout(waitCallback);
+ } else {
+ failed();
+ }
+ }
+ };
+
+ // Workaround for WebKit that doesn't properly support the onload event for link elements
+ // Or WebKit that fires the onload event before the StyleSheet is added to the document
+ var waitForWebKitLinkLoaded = function () {
+ wait(function () {
+ var styleSheets = document.styleSheets, styleSheet, i = styleSheets.length, owner;
+
+ while (i--) {
+ styleSheet = styleSheets[i];
+ owner = styleSheet.ownerNode ? styleSheet.ownerNode : styleSheet.owningElement;
+ if (owner && owner.id === link.id) {
+ passed();
+ return true;
+ }
+ }
+ }, waitForWebKitLinkLoaded);
+ };
+
+ // Workaround for older Geckos that doesn't have any onload event for StyleSheets
+ var waitForGeckoLinkLoaded = function () {
+ wait(function () {
+ try {
+ // Accessing the cssRules will throw an exception until the CSS file is loaded
+ var cssRules = style.sheet.cssRules;
+ passed();
+ return !!cssRules;
+ } catch (ex) {
+ // Ignore
+ }
+ }, waitForGeckoLinkLoaded);
+ };
+
+ url = Tools._addCacheSuffix(url);
+
+ if (!loadedStates[url]) {
+ state = {
+ passed: [],
+ failed: []
+ };
+
+ loadedStates[url] = state;
+ } else {
+ state = loadedStates[url];
+ }
+
+ if (loadedCallback) {
+ state.passed.push(loadedCallback);
+ }
+
+ if (errorCallback) {
+ state.failed.push(errorCallback);
+ }
+
+ // Is loading wait for it to pass
+ if (state.status == 1) {
+ return;
+ }
+
+ // Has finished loading and was success
+ if (state.status == 2) {
+ passed();
+ return;
+ }
+
+ // Has finished loading and was a failure
+ if (state.status == 3) {
+ failed();
+ return;
+ }
+
+ // Start loading
+ state.status = 1;
+ link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ link.id = 'u' + (idCount++);
+ link.async = false;
+ link.defer = false;
+ startTime = new Date().getTime();
+
+ // Feature detect onload on link element and sniff older webkits since it has an broken onload event
+ if ("onload" in link && !isOldWebKit()) {
+ link.onload = waitForWebKitLinkLoaded;
+ link.onerror = failed;
+ } else {
+ // Sniff for old Firefox that doesn't support the onload event on link elements
+ // TODO: Remove this in the future when everyone uses modern browsers
+ if (navigator.userAgent.indexOf("Firefox") > 0) {
+ style = document.createElement('style');
+ style.textContent = '@import "' + url + '"';
+ waitForGeckoLinkLoaded();
+ appendToHead(style);
+ return;
+ }
+
+ // Use the id owner on older webkits
+ waitForWebKitLinkLoaded();
+ }
+
+ appendToHead(link);
+ link.href = url;
+ };
+
+ var loadF = function (url) {
+ return Future.nu(function (resolve) {
+ load(
+ url,
+ Fun.compose(resolve, Fun.constant(Result.value(url))),
+ Fun.compose(resolve, Fun.constant(Result.error(url)))
+ );
+ });
+ };
+
+ var unbox = function (result) {
+ return result.fold(Fun.identity, Fun.identity);
+ };
+
+ var loadAll = function (urls, success, failure) {
+ Futures.par(Arr.map(urls, loadF)).get(function (result) {
+ var parts = Arr.partition(result, function (r) {
+ return r.isValue();
+ });
+
+ if (parts.fail.length > 0) {
+ failure(parts.fail.map(unbox));
+ } else {
+ success(parts.pass.map(unbox));
+ }
+ });
+ };
+
+ return {
+ load: load,
+ loadAll: loadAll
+ };
+ };
+ }
+);
+
+/**
+ * TreeWalker.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * TreeWalker class enables you to walk the DOM in a linear manner.
+ *
+ * @class tinymce.dom.TreeWalker
+ * @example
+ * var walker = new tinymce.dom.TreeWalker(startNode);
+ *
+ * do {
+ * console.log(walker.current());
+ * } while (walker.next());
+ */
+define(
+ 'tinymce.core.dom.TreeWalker',
+ [
+ ],
+ function () {
+ /**
+ * Constructs a new TreeWalker instance.
+ *
+ * @constructor
+ * @method TreeWalker
+ * @param {Node} startNode Node to start walking from.
+ * @param {node} rootNode Optional root node to never walk out of.
+ */
+ return function (startNode, rootNode) {
+ var node = startNode;
+
+ var findSibling = function (node, startName, siblingName, shallow) {
+ var sibling, parent;
+
+ if (node) {
+ // Walk into nodes if it has a start
+ if (!shallow && node[startName]) {
+ return node[startName];
+ }
+
+ // Return the sibling if it has one
+ if (node != rootNode) {
+ sibling = node[siblingName];
+ if (sibling) {
+ return sibling;
+ }
+
+ // Walk up the parents to look for siblings
+ for (parent = node.parentNode; parent && parent != rootNode; parent = parent.parentNode) {
+ sibling = parent[siblingName];
+ if (sibling) {
+ return sibling;
+ }
+ }
+ }
+ }
+ };
+
+ var findPreviousNode = function (node, startName, siblingName, shallow) {
+ var sibling, parent, child;
+
+ if (node) {
+ sibling = node[siblingName];
+ if (rootNode && sibling === rootNode) {
+ return;
+ }
+
+ if (sibling) {
+ if (!shallow) {
+ // Walk up the parents to look for siblings
+ for (child = sibling[startName]; child; child = child[startName]) {
+ if (!child[startName]) {
+ return child;
+ }
+ }
+ }
+
+ return sibling;
+ }
+
+ parent = node.parentNode;
+ if (parent && parent !== rootNode) {
+ return parent;
+ }
+ }
+ };
+
+ /**
+ * Returns the current node.
+ *
+ * @method current
+ * @return {Node} Current node where the walker is.
+ */
+ this.current = function () {
+ return node;
+ };
+
+ /**
+ * Walks to the next node in tree.
+ *
+ * @method next
+ * @return {Node} Current node where the walker is after moving to the next node.
+ */
+ this.next = function (shallow) {
+ node = findSibling(node, 'firstChild', 'nextSibling', shallow);
+ return node;
+ };
+
+ /**
+ * Walks to the previous node in tree.
+ *
+ * @method prev
+ * @return {Node} Current node where the walker is after moving to the previous node.
+ */
+ this.prev = function (shallow) {
+ node = findSibling(node, 'lastChild', 'previousSibling', shallow);
+ return node;
+ };
+
+ this.prev2 = function (shallow) {
+ node = findPreviousNode(node, 'lastChild', 'previousSibling', shallow);
+ return node;
+ };
+ };
+ }
+);
+
+/**
+ * ElementType.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.dom.ElementType',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.sugar.api.node.Node'
+ ],
+ function (Arr, Fun, Node) {
+ var blocks = [
+ 'article', 'aside', 'details', 'div', 'dt', 'figcaption', 'footer',
+ 'form', 'fieldset', 'header', 'hgroup', 'html', 'main', 'nav',
+ 'section', 'summary', 'body', 'p', 'dl', 'multicol', 'dd', 'figure',
+ 'address', 'center', 'blockquote', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
+ 'listing', 'xmp', 'pre', 'plaintext', 'menu', 'dir', 'ul', 'ol', 'li', 'hr',
+ 'table', 'tbody', 'thead', 'tfoot', 'th', 'tr', 'td', 'caption'
+ ];
+
+ var voids = [
+ 'area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input',
+ 'isindex', 'link', 'meta', 'param', 'embed', 'source', 'wbr', 'track'
+ ];
+
+ var tableCells = ['td', 'th'];
+ var tableSections = ['thead', 'tbody', 'tfoot'];
+
+ var textBlocks = [
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'div', 'address', 'pre', 'form',
+ 'blockquote', 'center', 'dir', 'fieldset', 'header', 'footer', 'article',
+ 'section', 'hgroup', 'aside', 'nav', 'figure'
+ ];
+
+ var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
+ var listItems = ['li', 'dd', 'dt'];
+ var lists = ['ul', 'ol', 'dl'];
+
+ var lazyLookup = function (items) {
+ var lookup;
+ return function (node) {
+ lookup = lookup ? lookup : Arr.mapToObject(items, Fun.constant(true));
+ return lookup.hasOwnProperty(Node.name(node));
+ };
+ };
+
+ var isHeading = lazyLookup(headings);
+
+ var isBlock = lazyLookup(blocks);
+
+ var isInline = function (node) {
+ return Node.isElement(node) && !isBlock(node);
+ };
+
+ var isBr = function (node) {
+ return Node.isElement(node) && Node.name(node) === 'br';
+ };
+
+ return {
+ isBlock: isBlock,
+ isInline: isInline,
+ isHeading: isHeading,
+ isTextBlock: lazyLookup(textBlocks),
+ isList: lazyLookup(lists),
+ isListItem: lazyLookup(listItems),
+ isVoid: lazyLookup(voids),
+ isTableSection: lazyLookup(tableSections),
+ isTableCell: lazyLookup(tableCells),
+ isBr: isBr
+ };
+ }
+);
+
+/**
+ * NodeType.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Contains various node validation functions.
+ *
+ * @private
+ * @class tinymce.dom.NodeType
+ */
+define(
+ 'tinymce.core.dom.NodeType',
+ [
+ ],
+ function () {
+ var isNodeType = function (type) {
+ return function (node) {
+ return !!node && node.nodeType == type;
+ };
+ };
+
+ var isElement = isNodeType(1);
+
+ var matchNodeNames = function (names) {
+ names = names.toLowerCase().split(' ');
+
+ return function (node) {
+ var i, name;
+
+ if (node && node.nodeType) {
+ name = node.nodeName.toLowerCase();
+
+ for (i = 0; i < names.length; i++) {
+ if (name === names[i]) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ };
+ };
+
+ var matchStyleValues = function (name, values) {
+ values = values.toLowerCase().split(' ');
+
+ return function (node) {
+ var i, cssValue;
+
+ if (isElement(node)) {
+ for (i = 0; i < values.length; i++) {
+ cssValue = node.ownerDocument.defaultView.getComputedStyle(node, null).getPropertyValue(name);
+ if (cssValue === values[i]) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ };
+ };
+
+ var hasPropValue = function (propName, propValue) {
+ return function (node) {
+ return isElement(node) && node[propName] === propValue;
+ };
+ };
+
+ var hasAttribute = function (attrName, attrValue) {
+ return function (node) {
+ return isElement(node) && node.hasAttribute(attrName);
+ };
+ };
+
+ var hasAttributeValue = function (attrName, attrValue) {
+ return function (node) {
+ return isElement(node) && node.getAttribute(attrName) === attrValue;
+ };
+ };
+
+ var isBogus = function (node) {
+ return isElement(node) && node.hasAttribute('data-mce-bogus');
+ };
+
+ var hasContentEditableState = function (value) {
+ return function (node) {
+ if (isElement(node)) {
+ if (node.contentEditable === value) {
+ return true;
+ }
+
+ if (node.getAttribute('data-mce-contenteditable') === value) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+ };
+
+ return {
+ isText: isNodeType(3),
+ isElement: isElement,
+ isComment: isNodeType(8),
+ isDocument: isNodeType(9),
+ isBr: matchNodeNames('br'),
+ isContentEditableTrue: hasContentEditableState('true'),
+ isContentEditableFalse: hasContentEditableState('false'),
+ matchNodeNames: matchNodeNames,
+ hasPropValue: hasPropValue,
+ hasAttribute: hasAttribute,
+ hasAttributeValue: hasAttributeValue,
+ matchStyleValues: matchStyleValues,
+ isBogus: isBogus
+ };
+ }
+);
+define(
+ 'tinymce.core.dom.TrimNode',
+
+ [
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.dom.ElementType',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.util.Tools'
+ ],
+
+ function (Element, ElementType, NodeType, Tools) {
+ var surroundedBySpans = function (node) {
+ var previousIsSpan = node.previousSibling && node.previousSibling.nodeName === 'SPAN';
+ var nextIsSpan = node.nextSibling && node.nextSibling.nodeName === 'SPAN';
+ return previousIsSpan && nextIsSpan;
+ };
+
+ var isBookmarkNode = function (node) {
+ return node && node.tagName === 'SPAN' && node.getAttribute('data-mce-type') === 'bookmark';
+ };
+
+ // W3C valid browsers tend to leave empty nodes to the left/right side of the contents - this makes sense
+ // but we don't want that in our code since it serves no purpose for the end user
+ // For example splitting this html at the bold element:
+ //
text 1CHOPtext 2
+ // would produce:
+ //
text 1
CHOP
text 2
+ // this function will then trim off empty edges and produce:
+ //
text 1
CHOP
text 2
+ var trimNode = function (dom, node) {
+ var i, children = node.childNodes;
+
+ if (NodeType.isElement(node) && isBookmarkNode(node)) {
+ return;
+ }
+
+ for (i = children.length - 1; i >= 0; i--) {
+ trimNode(dom, children[i]);
+ }
+
+ if (NodeType.isDocument(node) === false) {
+ // Keep non whitespace text nodes
+ if (NodeType.isText(node) && node.nodeValue.length > 0) {
+ // Keep if parent element is a block or if there is some useful content
+ var trimmedLength = Tools.trim(node.nodeValue).length;
+ if (dom.isBlock(node.parentNode) || trimmedLength > 0) {
+ return;
+ }
+ // Also keep text nodes with only spaces if surrounded by spans.
+ // eg. "
ab
" should keep space between a and b
+ if (trimmedLength === 0 && surroundedBySpans(node)) {
+ return;
+ }
+ } else if (NodeType.isElement(node)) {
+ // If the only child is a bookmark then move it up
+ children = node.childNodes;
+
+ if (children.length === 1 && isBookmarkNode(children[0])) {
+ node.parentNode.insertBefore(children[0], node);
+ }
+
+ // Keep non empty elements and void elements
+ if (children.length || ElementType.isVoid(Element.fromDom(node))) {
+ return;
+ }
+ }
+
+ dom.remove(node);
+ }
+ return node;
+ };
+
+ return {
+ trimNode: trimNode
+ };
+ }
+);
+
+/**
+ * Entities.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/*jshint bitwise:false */
+/*eslint no-bitwise:0 */
+
+/**
+ * Entity encoder class.
+ *
+ * @class tinymce.html.Entities
+ * @static
+ * @version 3.4
+ */
+define(
+ 'tinymce.core.html.Entities',
+ [
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Element, Tools) {
+ var makeMap = Tools.makeMap;
+
+ var namedEntities, baseEntities, reverseEntities,
+ attrsCharsRegExp = /[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+ textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
+ rawCharsRegExp = /[<>&\"\']/g,
+ entityRegExp = /([a-z0-9]+);?|&([a-z0-9]+);/gi,
+ asciiMap = {
+ 128: "\u20AC", 130: "\u201A", 131: "\u0192", 132: "\u201E", 133: "\u2026", 134: "\u2020",
+ 135: "\u2021", 136: "\u02C6", 137: "\u2030", 138: "\u0160", 139: "\u2039", 140: "\u0152",
+ 142: "\u017D", 145: "\u2018", 146: "\u2019", 147: "\u201C", 148: "\u201D", 149: "\u2022",
+ 150: "\u2013", 151: "\u2014", 152: "\u02DC", 153: "\u2122", 154: "\u0161", 155: "\u203A",
+ 156: "\u0153", 158: "\u017E", 159: "\u0178"
+ };
+
+ // Raw entities
+ baseEntities = {
+ '\"': '"', // Needs to be escaped since the YUI compressor would otherwise break the code
+ "'": ''',
+ '<': '<',
+ '>': '>',
+ '&': '&',
+ '\u0060': '`'
+ };
+
+ // Reverse lookup table for raw entities
+ reverseEntities = {
+ '<': '<',
+ '>': '>',
+ '&': '&',
+ '"': '"',
+ ''': "'"
+ };
+
+ // Decodes text by using the browser
+ var nativeDecode = function (text) {
+ var elm;
+
+ elm = Element.fromTag("div").dom();
+ elm.innerHTML = text;
+
+ return elm.textContent || elm.innerText || text;
+ };
+
+ // Build a two way lookup table for the entities
+ var buildEntitiesLookup = function (items, radix) {
+ var i, chr, entity, lookup = {};
+
+ if (items) {
+ items = items.split(',');
+ radix = radix || 10;
+
+ // Build entities lookup table
+ for (i = 0; i < items.length; i += 2) {
+ chr = String.fromCharCode(parseInt(items[i], radix));
+
+ // Only add non base entities
+ if (!baseEntities[chr]) {
+ entity = '&' + items[i + 1] + ';';
+ lookup[chr] = entity;
+ lookup[entity] = chr;
+ }
+ }
+
+ return lookup;
+ }
+ };
+
+ // Unpack entities lookup where the numbers are in radix 32 to reduce the size
+ namedEntities = buildEntitiesLookup(
+ '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' +
+ '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' +
+ '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' +
+ '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' +
+ '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' +
+ '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' +
+ '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' +
+ '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' +
+ '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' +
+ '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' +
+ 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' +
+ 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' +
+ 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' +
+ 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' +
+ 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' +
+ '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' +
+ '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' +
+ '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' +
+ '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' +
+ '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' +
+ 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' +
+ 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' +
+ 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' +
+ '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' +
+ '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32);
+
+ var Entities = {
+ /**
+ * Encodes the specified string using raw entities. This means only the required XML base entities will be encoded.
+ *
+ * @method encodeRaw
+ * @param {String} text Text to encode.
+ * @param {Boolean} attr Optional flag to specify if the text is attribute contents.
+ * @return {String} Entity encoded text.
+ */
+ encodeRaw: function (text, attr) {
+ return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
+ return baseEntities[chr] || chr;
+ });
+ },
+
+ /**
+ * Encoded the specified text with both the attributes and text entities. This function will produce larger text contents
+ * since it doesn't know if the context is within a attribute or text node. This was added for compatibility
+ * and is exposed as the DOMUtils.encode function.
+ *
+ * @method encodeAllRaw
+ * @param {String} text Text to encode.
+ * @return {String} Entity encoded text.
+ */
+ encodeAllRaw: function (text) {
+ return ('' + text).replace(rawCharsRegExp, function (chr) {
+ return baseEntities[chr] || chr;
+ });
+ },
+
+ /**
+ * Encodes the specified string using numeric entities. The core entities will be
+ * encoded as named ones but all non lower ascii characters will be encoded into numeric entities.
+ *
+ * @method encodeNumeric
+ * @param {String} text Text to encode.
+ * @param {Boolean} attr Optional flag to specify if the text is attribute contents.
+ * @return {String} Entity encoded text.
+ */
+ encodeNumeric: function (text, attr) {
+ return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
+ // Multi byte sequence convert it to a single entity
+ if (chr.length > 1) {
+ return '' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';';
+ }
+
+ return baseEntities[chr] || '' + chr.charCodeAt(0) + ';';
+ });
+ },
+
+ /**
+ * Encodes the specified string using named entities. The core entities will be encoded
+ * as named ones but all non lower ascii characters will be encoded into named entities.
+ *
+ * @method encodeNamed
+ * @param {String} text Text to encode.
+ * @param {Boolean} attr Optional flag to specify if the text is attribute contents.
+ * @param {Object} entities Optional parameter with entities to use.
+ * @return {String} Entity encoded text.
+ */
+ encodeNamed: function (text, attr, entities) {
+ entities = entities || namedEntities;
+
+ return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
+ return baseEntities[chr] || entities[chr] || chr;
+ });
+ },
+
+ /**
+ * Returns an encode function based on the name(s) and it's optional entities.
+ *
+ * @method getEncodeFunc
+ * @param {String} name Comma separated list of encoders for example named,numeric.
+ * @param {String} entities Optional parameter with entities to use instead of the built in set.
+ * @return {function} Encode function to be used.
+ */
+ getEncodeFunc: function (name, entities) {
+ entities = buildEntitiesLookup(entities) || namedEntities;
+
+ var encodeNamedAndNumeric = function (text, attr) {
+ return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function (chr) {
+ if (baseEntities[chr] !== undefined) {
+ return baseEntities[chr];
+ }
+
+ if (entities[chr] !== undefined) {
+ return entities[chr];
+ }
+
+ // Convert multi-byte sequences to a single entity.
+ if (chr.length > 1) {
+ return '' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';';
+ }
+
+ return '' + chr.charCodeAt(0) + ';';
+ });
+ };
+
+ var encodeCustomNamed = function (text, attr) {
+ return Entities.encodeNamed(text, attr, entities);
+ };
+
+ // Replace + with , to be compatible with previous TinyMCE versions
+ name = makeMap(name.replace(/\+/g, ','));
+
+ // Named and numeric encoder
+ if (name.named && name.numeric) {
+ return encodeNamedAndNumeric;
+ }
+
+ // Named encoder
+ if (name.named) {
+ // Custom names
+ if (entities) {
+ return encodeCustomNamed;
+ }
+
+ return Entities.encodeNamed;
+ }
+
+ // Numeric
+ if (name.numeric) {
+ return Entities.encodeNumeric;
+ }
+
+ // Raw encoder
+ return Entities.encodeRaw;
+ },
+
+ /**
+ * Decodes the specified string, this will replace entities with raw UTF characters.
+ *
+ * @method decode
+ * @param {String} text Text to entity decode.
+ * @return {String} Entity decoded string.
+ */
+ decode: function (text) {
+ return text.replace(entityRegExp, function (all, numeric) {
+ if (numeric) {
+ if (numeric.charAt(0).toLowerCase() === 'x') {
+ numeric = parseInt(numeric.substr(1), 16);
+ } else {
+ numeric = parseInt(numeric, 10);
+ }
+
+ // Support upper UTF
+ if (numeric > 0xFFFF) {
+ numeric -= 0x10000;
+
+ return String.fromCharCode(0xD800 + (numeric >> 10), 0xDC00 + (numeric & 0x3FF));
+ }
+
+ return asciiMap[numeric] || String.fromCharCode(numeric);
+ }
+
+ return reverseEntities[all] || namedEntities[all] || nativeDecode(all);
+ });
+ }
+ };
+
+ return Entities;
+ }
+);
+
+/**
+ * Schema.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Schema validator class.
+ *
+ * @class tinymce.html.Schema
+ * @example
+ * if (tinymce.activeEditor.schema.isValidChild('p', 'span'))
+ * alert('span is valid child of p.');
+ *
+ * if (tinymce.activeEditor.schema.getElementRule('p'))
+ * alert('P is a valid element.');
+ *
+ * @class tinymce.html.Schema
+ * @version 3.4
+ */
+define(
+ 'tinymce.core.html.Schema',
+ [
+ "tinymce.core.util.Tools"
+ ],
+ function (Tools) {
+ var mapCache = {}, dummyObj = {};
+ var makeMap = Tools.makeMap, each = Tools.each, extend = Tools.extend, explode = Tools.explode, inArray = Tools.inArray;
+
+ var split = function (items, delim) {
+ items = Tools.trim(items);
+ return items ? items.split(delim || ' ') : [];
+ };
+
+ /**
+ * Builds a schema lookup table
+ *
+ * @private
+ * @param {String} type html4, html5 or html5-strict schema type.
+ * @return {Object} Schema lookup table.
+ */
+ var compileSchema = function (type) {
+ var schema = {}, globalAttributes, blockContent;
+ var phrasingContent, flowContent, html4BlockContent, html4PhrasingContent;
+
+ var add = function (name, attributes, children) {
+ var ni, attributesOrder, element;
+
+ var arrayToMap = function (array, obj) {
+ var map = {}, i, l;
+
+ for (i = 0, l = array.length; i < l; i++) {
+ map[array[i]] = obj || {};
+ }
+
+ return map;
+ };
+
+ children = children || [];
+ attributes = attributes || "";
+
+ if (typeof children === "string") {
+ children = split(children);
+ }
+
+ name = split(name);
+ ni = name.length;
+ while (ni--) {
+ attributesOrder = split([globalAttributes, attributes].join(' '));
+
+ element = {
+ attributes: arrayToMap(attributesOrder),
+ attributesOrder: attributesOrder,
+ children: arrayToMap(children, dummyObj)
+ };
+
+ schema[name[ni]] = element;
+ }
+ };
+
+ var addAttrs = function (name, attributes) {
+ var ni, schemaItem, i, l;
+
+ name = split(name);
+ ni = name.length;
+ attributes = split(attributes);
+ while (ni--) {
+ schemaItem = schema[name[ni]];
+ for (i = 0, l = attributes.length; i < l; i++) {
+ schemaItem.attributes[attributes[i]] = {};
+ schemaItem.attributesOrder.push(attributes[i]);
+ }
+ }
+ };
+
+ // Use cached schema
+ if (mapCache[type]) {
+ return mapCache[type];
+ }
+
+ // Attributes present on all elements
+ globalAttributes = "id accesskey class dir lang style tabindex title role";
+
+ // Event attributes can be opt-in/opt-out
+ /*eventAttributes = split("onabort onblur oncancel oncanplay oncanplaythrough onchange onclick onclose oncontextmenu oncuechange " +
+ "ondblclick ondrag ondragend ondragenter ondragleave ondragover ondragstart ondrop ondurationchange onemptied onended " +
+ "onerror onfocus oninput oninvalid onkeydown onkeypress onkeyup onload onloadeddata onloadedmetadata onloadstart " +
+ "onmousedown onmousemove onmouseout onmouseover onmouseup onmousewheel onpause onplay onplaying onprogress onratechange " +
+ "onreset onscroll onseeked onseeking onseeking onselect onshow onstalled onsubmit onsuspend ontimeupdate onvolumechange " +
+ "onwaiting"
+ );*/
+
+ // Block content elements
+ blockContent =
+ "address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul";
+
+ // Phrasing content elements from the HTML5 spec (inline)
+ phrasingContent =
+ "a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd " +
+ "label map noscript object q s samp script select small span strong sub sup " +
+ "textarea u var #text #comment"
+ ;
+
+ // Add HTML5 items to globalAttributes, blockContent, phrasingContent
+ if (type != "html4") {
+ globalAttributes += " contenteditable contextmenu draggable dropzone " +
+ "hidden spellcheck translate";
+ blockContent += " article aside details dialog figure header footer hgroup section nav";
+ phrasingContent += " audio canvas command datalist mark meter output picture " +
+ "progress time wbr video ruby bdi keygen";
+ }
+
+ // Add HTML4 elements unless it's html5-strict
+ if (type != "html5-strict") {
+ globalAttributes += " xml:lang";
+
+ html4PhrasingContent = "acronym applet basefont big font strike tt";
+ phrasingContent = [phrasingContent, html4PhrasingContent].join(' ');
+
+ each(split(html4PhrasingContent), function (name) {
+ add(name, "", phrasingContent);
+ });
+
+ html4BlockContent = "center dir isindex noframes";
+ blockContent = [blockContent, html4BlockContent].join(' ');
+
+ // Flow content elements from the HTML5 spec (block+inline)
+ flowContent = [blockContent, phrasingContent].join(' ');
+
+ each(split(html4BlockContent), function (name) {
+ add(name, "", flowContent);
+ });
+ }
+
+ // Flow content elements from the HTML5 spec (block+inline)
+ flowContent = flowContent || [blockContent, phrasingContent].join(" ");
+
+ // HTML4 base schema TODO: Move HTML5 specific attributes to HTML5 specific if statement
+ // Schema items , ,
+ add("html", "manifest", "head body");
+ add("head", "", "base command link meta noscript script style title");
+ add("title hr noscript br");
+ add("base", "href target");
+ add("link", "href rel media hreflang type sizes hreflang");
+ add("meta", "name http-equiv content charset");
+ add("style", "media type scoped");
+ add("script", "src async defer type charset");
+ add("body", "onafterprint onbeforeprint onbeforeunload onblur onerror onfocus " +
+ "onhashchange onload onmessage onoffline ononline onpagehide onpageshow " +
+ "onpopstate onresize onscroll onstorage onunload", flowContent);
+ add("address dt dd div caption", "", flowContent);
+ add("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn", "", phrasingContent);
+ add("blockquote", "cite", flowContent);
+ add("ol", "reversed start type", "li");
+ add("ul", "", "li");
+ add("li", "value", flowContent);
+ add("dl", "", "dt dd");
+ add("a", "href target rel media hreflang type", phrasingContent);
+ add("q", "cite", phrasingContent);
+ add("ins del", "cite datetime", flowContent);
+ add("img", "src sizes srcset alt usemap ismap width height");
+ add("iframe", "src name width height", flowContent);
+ add("embed", "src type width height");
+ add("object", "data type typemustmatch name usemap form width height", [flowContent, "param"].join(' '));
+ add("param", "name value");
+ add("map", "name", [flowContent, "area"].join(' '));
+ add("area", "alt coords shape href target rel media hreflang type");
+ add("table", "border", "caption colgroup thead tfoot tbody tr" + (type == "html4" ? " col" : ""));
+ add("colgroup", "span", "col");
+ add("col", "span");
+ add("tbody thead tfoot", "", "tr");
+ add("tr", "", "td th");
+ add("td", "colspan rowspan headers", flowContent);
+ add("th", "colspan rowspan headers scope abbr", flowContent);
+ add("form", "accept-charset action autocomplete enctype method name novalidate target", flowContent);
+ add("fieldset", "disabled form name", [flowContent, "legend"].join(' '));
+ add("label", "form for", phrasingContent);
+ add("input", "accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate " +
+ "formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"
+ );
+ add("button", "disabled form formaction formenctype formmethod formnovalidate formtarget name type value",
+ type == "html4" ? flowContent : phrasingContent);
+ add("select", "disabled form multiple name required size", "option optgroup");
+ add("optgroup", "disabled label", "option");
+ add("option", "disabled label selected value");
+ add("textarea", "cols dirname disabled form maxlength name readonly required rows wrap");
+ add("menu", "type label", [flowContent, "li"].join(' '));
+ add("noscript", "", flowContent);
+
+ // Extend with HTML5 elements
+ if (type != "html4") {
+ add("wbr");
+ add("ruby", "", [phrasingContent, "rt rp"].join(' '));
+ add("figcaption", "", flowContent);
+ add("mark rt rp summary bdi", "", phrasingContent);
+ add("canvas", "width height", flowContent);
+ add("video", "src crossorigin poster preload autoplay mediagroup loop " +
+ "muted controls width height buffered", [flowContent, "track source"].join(' '));
+ add("audio", "src crossorigin preload autoplay mediagroup loop muted controls " +
+ "buffered volume", [flowContent, "track source"].join(' '));
+ add("picture", "", "img source");
+ add("source", "src srcset type media sizes");
+ add("track", "kind src srclang label default");
+ add("datalist", "", [phrasingContent, "option"].join(' '));
+ add("article section nav aside header footer", "", flowContent);
+ add("hgroup", "", "h1 h2 h3 h4 h5 h6");
+ add("figure", "", [flowContent, "figcaption"].join(' '));
+ add("time", "datetime", phrasingContent);
+ add("dialog", "open", flowContent);
+ add("command", "type label icon disabled checked radiogroup command");
+ add("output", "for form name", phrasingContent);
+ add("progress", "value max", phrasingContent);
+ add("meter", "value min max low high optimum", phrasingContent);
+ add("details", "open", [flowContent, "summary"].join(' '));
+ add("keygen", "autofocus challenge disabled form keytype name");
+ }
+
+ // Extend with HTML4 attributes unless it's html5-strict
+ if (type != "html5-strict") {
+ addAttrs("script", "language xml:space");
+ addAttrs("style", "xml:space");
+ addAttrs("object", "declare classid code codebase codetype archive standby align border hspace vspace");
+ addAttrs("embed", "align name hspace vspace");
+ addAttrs("param", "valuetype type");
+ addAttrs("a", "charset name rev shape coords");
+ addAttrs("br", "clear");
+ addAttrs("applet", "codebase archive code object alt name width height align hspace vspace");
+ addAttrs("img", "name longdesc align border hspace vspace");
+ addAttrs("iframe", "longdesc frameborder marginwidth marginheight scrolling align");
+ addAttrs("font basefont", "size color face");
+ addAttrs("input", "usemap align");
+ addAttrs("select", "onchange");
+ addAttrs("textarea");
+ addAttrs("h1 h2 h3 h4 h5 h6 div p legend caption", "align");
+ addAttrs("ul", "type compact");
+ addAttrs("li", "type");
+ addAttrs("ol dl menu dir", "compact");
+ addAttrs("pre", "width xml:space");
+ addAttrs("hr", "align noshade size width");
+ addAttrs("isindex", "prompt");
+ addAttrs("table", "summary width frame rules cellspacing cellpadding align bgcolor");
+ addAttrs("col", "width align char charoff valign");
+ addAttrs("colgroup", "width align char charoff valign");
+ addAttrs("thead", "align char charoff valign");
+ addAttrs("tr", "align char charoff valign bgcolor");
+ addAttrs("th", "axis align char charoff valign nowrap bgcolor width height");
+ addAttrs("form", "accept");
+ addAttrs("td", "abbr axis scope align char charoff valign nowrap bgcolor width height");
+ addAttrs("tfoot", "align char charoff valign");
+ addAttrs("tbody", "align char charoff valign");
+ addAttrs("area", "nohref");
+ addAttrs("body", "background bgcolor text link vlink alink");
+ }
+
+ // Extend with HTML5 attributes unless it's html4
+ if (type != "html4") {
+ addAttrs("input button select textarea", "autofocus");
+ addAttrs("input textarea", "placeholder");
+ addAttrs("a", "download");
+ addAttrs("link script img", "crossorigin");
+ addAttrs("iframe", "sandbox seamless allowfullscreen"); // Excluded: srcdoc
+ }
+
+ // Special: iframe, ruby, video, audio, label
+
+ // Delete children of the same name from it's parent
+ // For example: form can't have a child of the name form
+ each(split('a form meter progress dfn'), function (name) {
+ if (schema[name]) {
+ delete schema[name].children[name];
+ }
+ });
+
+ // Delete header, footer, sectioning and heading content descendants
+ /*each('dt th address', function(name) {
+ delete schema[name].children[name];
+ });*/
+
+ // Caption can't have tables
+ delete schema.caption.children.table;
+
+ // Delete scripts by default due to possible XSS
+ delete schema.script;
+
+ // TODO: LI:s can only have value if parent is OL
+
+ // TODO: Handle transparent elements
+ // a ins del canvas map
+
+ mapCache[type] = schema;
+
+ return schema;
+ };
+
+ var compileElementMap = function (value, mode) {
+ var styles;
+
+ if (value) {
+ styles = {};
+
+ if (typeof value == 'string') {
+ value = {
+ '*': value
+ };
+ }
+
+ // Convert styles into a rule list
+ each(value, function (value, key) {
+ styles[key] = styles[key.toUpperCase()] = mode == 'map' ? makeMap(value, /[, ]/) : explode(value, /[, ]/);
+ });
+ }
+
+ return styles;
+ };
+
+ /**
+ * Constructs a new Schema instance.
+ *
+ * @constructor
+ * @method Schema
+ * @param {Object} settings Name/value settings object.
+ */
+ return function (settings) {
+ var self = this, elements = {}, children = {}, patternElements = [], validStyles, invalidStyles, schemaItems;
+ var whiteSpaceElementsMap, selfClosingElementsMap, shortEndedElementsMap, boolAttrMap, validClasses;
+ var blockElementsMap, nonEmptyElementsMap, moveCaretBeforeOnEnterElementsMap, textBlockElementsMap, textInlineElementsMap;
+ var customElementsMap = {}, specialElements = {};
+
+ // Creates an lookup table map object for the specified option or the default value
+ var createLookupTable = function (option, defaultValue, extendWith) {
+ var value = settings[option];
+
+ if (!value) {
+ // Get cached default map or make it if needed
+ value = mapCache[option];
+
+ if (!value) {
+ value = makeMap(defaultValue, ' ', makeMap(defaultValue.toUpperCase(), ' '));
+ value = extend(value, extendWith);
+
+ mapCache[option] = value;
+ }
+ } else {
+ // Create custom map
+ value = makeMap(value, /[, ]/, makeMap(value.toUpperCase(), /[, ]/));
+ }
+
+ return value;
+ };
+
+ settings = settings || {};
+ schemaItems = compileSchema(settings.schema);
+
+ // Allow all elements and attributes if verify_html is set to false
+ if (settings.verify_html === false) {
+ settings.valid_elements = '*[*]';
+ }
+
+ validStyles = compileElementMap(settings.valid_styles);
+ invalidStyles = compileElementMap(settings.invalid_styles, 'map');
+ validClasses = compileElementMap(settings.valid_classes, 'map');
+
+ // Setup map objects
+ whiteSpaceElementsMap = createLookupTable(
+ 'whitespace_elements',
+ 'pre script noscript style textarea video audio iframe object code'
+ );
+ selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr');
+ shortEndedElementsMap = createLookupTable('short_ended_elements', 'area base basefont br col frame hr img input isindex link ' +
+ 'meta param embed source wbr track');
+ boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize ' +
+ 'noshade nowrap readonly selected autoplay loop controls');
+ nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object ' +
+ 'script pre code', shortEndedElementsMap);
+ moveCaretBeforeOnEnterElementsMap = createLookupTable('move_caret_before_on_enter_elements', 'table', nonEmptyElementsMap);
+ textBlockElementsMap = createLookupTable('text_block_elements', 'h1 h2 h3 h4 h5 h6 p div address pre form ' +
+ 'blockquote center dir fieldset header footer article section hgroup aside nav figure');
+ blockElementsMap = createLookupTable('block_elements', 'hr table tbody thead tfoot ' +
+ 'th tr td li ol ul caption dl dt dd noscript menu isindex option ' +
+ 'datalist select optgroup figcaption', textBlockElementsMap);
+ textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font strike u var cite ' +
+ 'dfn code mark q sup sub samp');
+
+ each((settings.special || 'script noscript noframes noembed title style textarea xmp').split(' '), function (name) {
+ specialElements[name] = new RegExp('<\/' + name + '[^>]*>', 'gi');
+ });
+
+ // Converts a wildcard expression string to a regexp for example *a will become /.*a/.
+ var patternToRegExp = function (str) {
+ return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$');
+ };
+
+ // Parses the specified valid_elements string and adds to the current rules
+ // This function is a bit hard to read since it's heavily optimized for speed
+ var addValidElements = function (validElements) {
+ var ei, el, ai, al, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder,
+ prefix, outputName, globalAttributes, globalAttributesOrder, key, value,
+ elementRuleRegExp = /^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)\])?$/,
+ attrRuleRegExp = /^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/,
+ hasPatternsRegExp = /[*?+]/;
+
+ if (validElements) {
+ // Split valid elements into an array with rules
+ validElements = split(validElements, ',');
+
+ if (elements['@']) {
+ globalAttributes = elements['@'].attributes;
+ globalAttributesOrder = elements['@'].attributesOrder;
+ }
+
+ // Loop all rules
+ for (ei = 0, el = validElements.length; ei < el; ei++) {
+ // Parse element rule
+ matches = elementRuleRegExp.exec(validElements[ei]);
+ if (matches) {
+ // Setup local names for matches
+ prefix = matches[1];
+ elementName = matches[2];
+ outputName = matches[3];
+ attrData = matches[5];
+
+ // Create new attributes and attributesOrder
+ attributes = {};
+ attributesOrder = [];
+
+ // Create the new element
+ element = {
+ attributes: attributes,
+ attributesOrder: attributesOrder
+ };
+
+ // Padd empty elements prefix
+ if (prefix === '#') {
+ element.paddEmpty = true;
+ }
+
+ // Remove empty elements prefix
+ if (prefix === '-') {
+ element.removeEmpty = true;
+ }
+
+ if (matches[4] === '!') {
+ element.removeEmptyAttrs = true;
+ }
+
+ // Copy attributes from global rule into current rule
+ if (globalAttributes) {
+ for (key in globalAttributes) {
+ attributes[key] = globalAttributes[key];
+ }
+
+ attributesOrder.push.apply(attributesOrder, globalAttributesOrder);
+ }
+
+ // Attributes defined
+ if (attrData) {
+ attrData = split(attrData, '|');
+ for (ai = 0, al = attrData.length; ai < al; ai++) {
+ matches = attrRuleRegExp.exec(attrData[ai]);
+ if (matches) {
+ attr = {};
+ attrType = matches[1];
+ attrName = matches[2].replace(/[\\:]:/g, ':');
+ prefix = matches[3];
+ value = matches[4];
+
+ // Required
+ if (attrType === '!') {
+ element.attributesRequired = element.attributesRequired || [];
+ element.attributesRequired.push(attrName);
+ attr.required = true;
+ }
+
+ // Denied from global
+ if (attrType === '-') {
+ delete attributes[attrName];
+ attributesOrder.splice(inArray(attributesOrder, attrName), 1);
+ continue;
+ }
+
+ // Default value
+ if (prefix) {
+ // Default value
+ if (prefix === '=') {
+ element.attributesDefault = element.attributesDefault || [];
+ element.attributesDefault.push({ name: attrName, value: value });
+ attr.defaultValue = value;
+ }
+
+ // Forced value
+ if (prefix === ':') {
+ element.attributesForced = element.attributesForced || [];
+ element.attributesForced.push({ name: attrName, value: value });
+ attr.forcedValue = value;
+ }
+
+ // Required values
+ if (prefix === '<') {
+ attr.validValues = makeMap(value, '?');
+ }
+ }
+
+ // Check for attribute patterns
+ if (hasPatternsRegExp.test(attrName)) {
+ element.attributePatterns = element.attributePatterns || [];
+ attr.pattern = patternToRegExp(attrName);
+ element.attributePatterns.push(attr);
+ } else {
+ // Add attribute to order list if it doesn't already exist
+ if (!attributes[attrName]) {
+ attributesOrder.push(attrName);
+ }
+
+ attributes[attrName] = attr;
+ }
+ }
+ }
+ }
+
+ // Global rule, store away these for later usage
+ if (!globalAttributes && elementName == '@') {
+ globalAttributes = attributes;
+ globalAttributesOrder = attributesOrder;
+ }
+
+ // Handle substitute elements such as b/strong
+ if (outputName) {
+ element.outputName = elementName;
+ elements[outputName] = element;
+ }
+
+ // Add pattern or exact element
+ if (hasPatternsRegExp.test(elementName)) {
+ element.pattern = patternToRegExp(elementName);
+ patternElements.push(element);
+ } else {
+ elements[elementName] = element;
+ }
+ }
+ }
+ }
+ };
+
+ var setValidElements = function (validElements) {
+ elements = {};
+ patternElements = [];
+
+ addValidElements(validElements);
+
+ each(schemaItems, function (element, name) {
+ children[name] = element.children;
+ });
+ };
+
+ // Adds custom non HTML elements to the schema
+ var addCustomElements = function (customElements) {
+ var customElementRegExp = /^(~)?(.+)$/;
+
+ if (customElements) {
+ // Flush cached items since we are altering the default maps
+ mapCache.text_block_elements = mapCache.block_elements = null;
+
+ each(split(customElements, ','), function (rule) {
+ var matches = customElementRegExp.exec(rule),
+ inline = matches[1] === '~',
+ cloneName = inline ? 'span' : 'div',
+ name = matches[2];
+
+ children[name] = children[cloneName];
+ customElementsMap[name] = cloneName;
+
+ // If it's not marked as inline then add it to valid block elements
+ if (!inline) {
+ blockElementsMap[name.toUpperCase()] = {};
+ blockElementsMap[name] = {};
+ }
+
+ // Add elements clone if needed
+ if (!elements[name]) {
+ var customRule = elements[cloneName];
+
+ customRule = extend({}, customRule);
+ delete customRule.removeEmptyAttrs;
+ delete customRule.removeEmpty;
+
+ elements[name] = customRule;
+ }
+
+ // Add custom elements at span/div positions
+ each(children, function (element, elmName) {
+ if (element[cloneName]) {
+ children[elmName] = element = extend({}, children[elmName]);
+ element[name] = element[cloneName];
+ }
+ });
+ });
+ }
+ };
+
+ // Adds valid children to the schema object
+ var addValidChildren = function (validChildren) {
+ var childRuleRegExp = /^([+\-]?)(\w+)\[([^\]]+)\]$/;
+
+ // Invalidate the schema cache if the schema is mutated
+ mapCache[settings.schema] = null;
+
+ if (validChildren) {
+ each(split(validChildren, ','), function (rule) {
+ var matches = childRuleRegExp.exec(rule), parent, prefix;
+
+ if (matches) {
+ prefix = matches[1];
+
+ // Add/remove items from default
+ if (prefix) {
+ parent = children[matches[2]];
+ } else {
+ parent = children[matches[2]] = { '#comment': {} };
+ }
+
+ parent = children[matches[2]];
+
+ each(split(matches[3], '|'), function (child) {
+ if (prefix === '-') {
+ delete parent[child];
+ } else {
+ parent[child] = {};
+ }
+ });
+ }
+ });
+ }
+ };
+
+ var getElementRule = function (name) {
+ var element = elements[name], i;
+
+ // Exact match found
+ if (element) {
+ return element;
+ }
+
+ // No exact match then try the patterns
+ i = patternElements.length;
+ while (i--) {
+ element = patternElements[i];
+
+ if (element.pattern.test(name)) {
+ return element;
+ }
+ }
+ };
+
+ if (!settings.valid_elements) {
+ // No valid elements defined then clone the elements from the schema spec
+ each(schemaItems, function (element, name) {
+ elements[name] = {
+ attributes: element.attributes,
+ attributesOrder: element.attributesOrder
+ };
+
+ children[name] = element.children;
+ });
+
+ // Switch these on HTML4
+ if (settings.schema != "html5") {
+ each(split('strong/b em/i'), function (item) {
+ item = split(item, '/');
+ elements[item[1]].outputName = item[0];
+ });
+ }
+
+ // Add default alt attribute for images, removed since alt="" is treated as presentational.
+ // elements.img.attributesDefault = [{name: 'alt', value: ''}];
+
+ // Remove these if they are empty by default
+ each(split('ol ul sub sup blockquote span font a table tbody tr strong em b i'), function (name) {
+ if (elements[name]) {
+ elements[name].removeEmpty = true;
+ }
+ });
+
+ // Padd these by default
+ each(split('p h1 h2 h3 h4 h5 h6 th td pre div address caption li'), function (name) {
+ elements[name].paddEmpty = true;
+ });
+
+ // Remove these if they have no attributes
+ each(split('span'), function (name) {
+ elements[name].removeEmptyAttrs = true;
+ });
+
+ // Remove these by default
+ // TODO: Reenable in 4.1
+ /*each(split('script style'), function(name) {
+ delete elements[name];
+ });*/
+ } else {
+ setValidElements(settings.valid_elements);
+ }
+
+ addCustomElements(settings.custom_elements);
+ addValidChildren(settings.valid_children);
+ addValidElements(settings.extended_valid_elements);
+
+ // Todo: Remove this when we fix list handling to be valid
+ addValidChildren('+ol[ul|ol],+ul[ul|ol]');
+
+
+ // Some elements are not valid by themselves - require parents
+ each({
+ dd: 'dl',
+ dt: 'dl',
+ li: 'ul ol',
+ td: 'tr',
+ th: 'tr',
+ tr: 'tbody thead tfoot',
+ tbody: 'table',
+ thead: 'table',
+ tfoot: 'table',
+ legend: 'fieldset',
+ area: 'map',
+ param: 'video audio object'
+ }, function (parents, item) {
+ if (elements[item]) {
+ elements[item].parentsRequired = split(parents);
+ }
+ });
+
+
+ // Delete invalid elements
+ if (settings.invalid_elements) {
+ each(explode(settings.invalid_elements), function (item) {
+ if (elements[item]) {
+ delete elements[item];
+ }
+ });
+ }
+
+ // If the user didn't allow span only allow internal spans
+ if (!getElementRule('span')) {
+ addValidElements('span[!data-mce-type|*]');
+ }
+
+ /**
+ * Name/value map object with valid parents and children to those parents.
+ *
+ * @example
+ * children = {
+ * div:{p:{}, h1:{}}
+ * };
+ * @field children
+ * @type Object
+ */
+ self.children = children;
+
+ /**
+ * Name/value map object with valid styles for each element.
+ *
+ * @method getValidStyles
+ * @type Object
+ */
+ self.getValidStyles = function () {
+ return validStyles;
+ };
+
+ /**
+ * Name/value map object with valid styles for each element.
+ *
+ * @method getInvalidStyles
+ * @type Object
+ */
+ self.getInvalidStyles = function () {
+ return invalidStyles;
+ };
+
+ /**
+ * Name/value map object with valid classes for each element.
+ *
+ * @method getValidClasses
+ * @type Object
+ */
+ self.getValidClasses = function () {
+ return validClasses;
+ };
+
+ /**
+ * Returns a map with boolean attributes.
+ *
+ * @method getBoolAttrs
+ * @return {Object} Name/value lookup map for boolean attributes.
+ */
+ self.getBoolAttrs = function () {
+ return boolAttrMap;
+ };
+
+ /**
+ * Returns a map with block elements.
+ *
+ * @method getBlockElements
+ * @return {Object} Name/value lookup map for block elements.
+ */
+ self.getBlockElements = function () {
+ return blockElementsMap;
+ };
+
+ /**
+ * Returns a map with text block elements. Such as: p,h1-h6,div,address
+ *
+ * @method getTextBlockElements
+ * @return {Object} Name/value lookup map for block elements.
+ */
+ self.getTextBlockElements = function () {
+ return textBlockElementsMap;
+ };
+
+ /**
+ * Returns a map of inline text format nodes for example strong/span or ins.
+ *
+ * @method getTextInlineElements
+ * @return {Object} Name/value lookup map for text format elements.
+ */
+ self.getTextInlineElements = function () {
+ return textInlineElementsMap;
+ };
+
+ /**
+ * Returns a map with short ended elements such as BR or IMG.
+ *
+ * @method getShortEndedElements
+ * @return {Object} Name/value lookup map for short ended elements.
+ */
+ self.getShortEndedElements = function () {
+ return shortEndedElementsMap;
+ };
+
+ /**
+ * Returns a map with self closing tags such as
.
+ *
+ * @method getSelfClosingElements
+ * @return {Object} Name/value lookup map for self closing tags elements.
+ */
+ self.getSelfClosingElements = function () {
+ return selfClosingElementsMap;
+ };
+
+ /**
+ * Returns a map with elements that should be treated as contents regardless if it has text
+ * content in them or not such as TD, VIDEO or IMG.
+ *
+ * @method getNonEmptyElements
+ * @return {Object} Name/value lookup map for non empty elements.
+ */
+ self.getNonEmptyElements = function () {
+ return nonEmptyElementsMap;
+ };
+
+ /**
+ * Returns a map with elements that the caret should be moved in front of after enter is
+ * pressed
+ *
+ * @method getMoveCaretBeforeOnEnterElements
+ * @return {Object} Name/value lookup map for elements to place the caret in front of.
+ */
+ self.getMoveCaretBeforeOnEnterElements = function () {
+ return moveCaretBeforeOnEnterElementsMap;
+ };
+
+ /**
+ * Returns a map with elements where white space is to be preserved like PRE or SCRIPT.
+ *
+ * @method getWhiteSpaceElements
+ * @return {Object} Name/value lookup map for white space elements.
+ */
+ self.getWhiteSpaceElements = function () {
+ return whiteSpaceElementsMap;
+ };
+
+ /**
+ * Returns a map with special elements. These are elements that needs to be parsed
+ * in a special way such as script, style, textarea etc. The map object values
+ * are regexps used to find the end of the element.
+ *
+ * @method getSpecialElements
+ * @return {Object} Name/value lookup map for special elements.
+ */
+ self.getSpecialElements = function () {
+ return specialElements;
+ };
+
+ /**
+ * Returns true/false if the specified element and it's child is valid or not
+ * according to the schema.
+ *
+ * @method isValidChild
+ * @param {String} name Element name to check for.
+ * @param {String} child Element child to verify.
+ * @return {Boolean} True/false if the element is a valid child of the specified parent.
+ */
+ self.isValidChild = function (name, child) {
+ var parent = children[name.toLowerCase()];
+
+ return !!(parent && parent[child.toLowerCase()]);
+ };
+
+ /**
+ * Returns true/false if the specified element name and optional attribute is
+ * valid according to the schema.
+ *
+ * @method isValid
+ * @param {String} name Name of element to check.
+ * @param {String} attr Optional attribute name to check for.
+ * @return {Boolean} True/false if the element and attribute is valid.
+ */
+ self.isValid = function (name, attr) {
+ var attrPatterns, i, rule = getElementRule(name);
+
+ // Check if it's a valid element
+ if (rule) {
+ if (attr) {
+ // Check if attribute name exists
+ if (rule.attributes[attr]) {
+ return true;
+ }
+
+ // Check if attribute matches a regexp pattern
+ attrPatterns = rule.attributePatterns;
+ if (attrPatterns) {
+ i = attrPatterns.length;
+ while (i--) {
+ if (attrPatterns[i].pattern.test(name)) {
+ return true;
+ }
+ }
+ }
+ } else {
+ return true;
+ }
+ }
+
+ // No match
+ return false;
+ };
+
+ /**
+ * Returns true/false if the specified element is valid or not
+ * according to the schema.
+ *
+ * @method getElementRule
+ * @param {String} name Element name to check for.
+ * @return {Object} Element object or undefined if the element isn't valid.
+ */
+ self.getElementRule = getElementRule;
+
+ /**
+ * Returns an map object of all custom elements.
+ *
+ * @method getCustomElements
+ * @return {Object} Name/value map object of all custom elements.
+ */
+ self.getCustomElements = function () {
+ return customElementsMap;
+ };
+
+ /**
+ * Parses a valid elements string and adds it to the schema. The valid elements
+ * format is for example "element[attr=default|otherattr]".
+ * Existing rules will be replaced with the ones specified, so this extends the schema.
+ *
+ * @method addValidElements
+ * @param {String} valid_elements String in the valid elements format to be parsed.
+ */
+ self.addValidElements = addValidElements;
+
+ /**
+ * Parses a valid elements string and sets it to the schema. The valid elements
+ * format is for example "element[attr=default|otherattr]".
+ * Existing rules will be replaced with the ones specified, so this extends the schema.
+ *
+ * @method setValidElements
+ * @param {String} valid_elements String in the valid elements format to be parsed.
+ */
+ self.setValidElements = setValidElements;
+
+ /**
+ * Adds custom non HTML elements to the schema.
+ *
+ * @method addCustomElements
+ * @param {String} custom_elements Comma separated list of custom elements to add.
+ */
+ self.addCustomElements = addCustomElements;
+
+ /**
+ * Parses a valid children string and adds them to the schema structure. The valid children
+ * format is for example: "element[child1|child2]".
+ *
+ * @method addValidChildren
+ * @param {String} valid_children Valid children elements string to parse
+ */
+ self.addValidChildren = addValidChildren;
+
+ self.elements = elements;
+ };
+ }
+);
+
+/**
+ * Styles.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class is used to parse CSS styles it also compresses styles to reduce the output size.
+ *
+ * @example
+ * var Styles = new tinymce.html.Styles({
+ * url_converter: function(url) {
+ * return url;
+ * }
+ * });
+ *
+ * styles = Styles.parse('border: 1px solid red');
+ * styles.color = 'red';
+ *
+ * console.log(new tinymce.html.StyleSerializer().serialize(styles));
+ *
+ * @class tinymce.html.Styles
+ * @version 3.4
+ */
+define(
+ 'tinymce.core.html.Styles',
+ [
+ ],
+ function () {
+ return function (settings, schema) {
+ /*jshint maxlen:255 */
+ /*eslint max-len:0 */
+ var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,
+ urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,
+ styleRegExp = /\s*([^:]+):\s*([^;]+);?/g,
+ trimRightRegExp = /\s+$/,
+ i, encodingLookup = {}, encodingItems, validStyles, invalidStyles, invisibleChar = '\uFEFF';
+
+ settings = settings || {};
+
+ if (schema) {
+ validStyles = schema.getValidStyles();
+ invalidStyles = schema.getInvalidStyles();
+ }
+
+ encodingItems = ('\\" \\\' \\; \\: ; : ' + invisibleChar).split(' ');
+ for (i = 0; i < encodingItems.length; i++) {
+ encodingLookup[encodingItems[i]] = invisibleChar + i;
+ encodingLookup[invisibleChar + i] = encodingItems[i];
+ }
+
+ var toHex = function (match, r, g, b) {
+ var hex = function (val) {
+ val = parseInt(val, 10).toString(16);
+
+ return val.length > 1 ? val : '0' + val; // 0 -> 00
+ };
+
+ return '#' + hex(r) + hex(g) + hex(b);
+ };
+
+ return {
+ /**
+ * Parses the specified RGB color value and returns a hex version of that color.
+ *
+ * @method toHex
+ * @param {String} color RGB string value like rgb(1,2,3)
+ * @return {String} Hex version of that RGB value like #FF00FF.
+ */
+ toHex: function (color) {
+ return color.replace(rgbRegExp, toHex);
+ },
+
+ /**
+ * Parses the specified style value into an object collection. This parser will also
+ * merge and remove any redundant items that browsers might have added. It will also convert non hex
+ * colors to hex values. Urls inside the styles will also be converted to absolute/relative based on settings.
+ *
+ * @method parse
+ * @param {String} css Style value to parse for example: border:1px solid red;.
+ * @return {Object} Object representation of that style like {border: '1px solid red'}
+ */
+ parse: function (css) {
+ var styles = {}, matches, name, value, isEncoded, urlConverter = settings.url_converter;
+ var urlConverterScope = settings.url_converter_scope || this;
+
+ var compress = function (prefix, suffix, noJoin) {
+ var top, right, bottom, left;
+
+ top = styles[prefix + '-top' + suffix];
+ if (!top) {
+ return;
+ }
+
+ right = styles[prefix + '-right' + suffix];
+ if (!right) {
+ return;
+ }
+
+ bottom = styles[prefix + '-bottom' + suffix];
+ if (!bottom) {
+ return;
+ }
+
+ left = styles[prefix + '-left' + suffix];
+ if (!left) {
+ return;
+ }
+
+ var box = [top, right, bottom, left];
+ i = box.length - 1;
+ while (i--) {
+ if (box[i] !== box[i + 1]) {
+ break;
+ }
+ }
+
+ if (i > -1 && noJoin) {
+ return;
+ }
+
+ styles[prefix + suffix] = i == -1 ? box[0] : box.join(' ');
+ delete styles[prefix + '-top' + suffix];
+ delete styles[prefix + '-right' + suffix];
+ delete styles[prefix + '-bottom' + suffix];
+ delete styles[prefix + '-left' + suffix];
+ };
+
+ /**
+ * Checks if the specific style can be compressed in other words if all border-width are equal.
+ */
+ var canCompress = function (key) {
+ var value = styles[key], i;
+
+ if (!value) {
+ return;
+ }
+
+ value = value.split(' ');
+ i = value.length;
+ while (i--) {
+ if (value[i] !== value[0]) {
+ return false;
+ }
+ }
+
+ styles[key] = value[0];
+
+ return true;
+ };
+
+ /**
+ * Compresses multiple styles into one style.
+ */
+ var compress2 = function (target, a, b, c) {
+ if (!canCompress(a)) {
+ return;
+ }
+
+ if (!canCompress(b)) {
+ return;
+ }
+
+ if (!canCompress(c)) {
+ return;
+ }
+
+ // Compress
+ styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c];
+ delete styles[a];
+ delete styles[b];
+ delete styles[c];
+ };
+
+ // Encodes the specified string by replacing all \" \' ; : with _
+ var encode = function (str) {
+ isEncoded = true;
+
+ return encodingLookup[str];
+ };
+
+ // Decodes the specified string by replacing all _ with it's original value \" \' etc
+ // It will also decode the \" \' if keepSlashes is set to fale or omitted
+ var decode = function (str, keepSlashes) {
+ if (isEncoded) {
+ str = str.replace(/\uFEFF[0-9]/g, function (str) {
+ return encodingLookup[str];
+ });
+ }
+
+ if (!keepSlashes) {
+ str = str.replace(/\\([\'\";:])/g, "$1");
+ }
+
+ return str;
+ };
+
+ var decodeSingleHexSequence = function (escSeq) {
+ return String.fromCharCode(parseInt(escSeq.slice(1), 16));
+ };
+
+ var decodeHexSequences = function (value) {
+ return value.replace(/\\[0-9a-f]+/gi, decodeSingleHexSequence);
+ };
+
+ var processUrl = function (match, url, url2, url3, str, str2) {
+ str = str || str2;
+
+ if (str) {
+ str = decode(str);
+
+ // Force strings into single quote format
+ return "'" + str.replace(/\'/g, "\\'") + "'";
+ }
+
+ url = decode(url || url2 || url3);
+
+ if (!settings.allow_script_urls) {
+ var scriptUrl = url.replace(/[\s\r\n]+/g, '');
+
+ if (/(java|vb)script:/i.test(scriptUrl)) {
+ return "";
+ }
+
+ if (!settings.allow_svg_data_urls && /^data:image\/svg/i.test(scriptUrl)) {
+ return "";
+ }
+ }
+
+ // Convert the URL to relative/absolute depending on config
+ if (urlConverter) {
+ url = urlConverter.call(urlConverterScope, url, 'style');
+ }
+
+ // Output new URL format
+ return "url('" + url.replace(/\'/g, "\\'") + "')";
+ };
+
+ if (css) {
+ css = css.replace(/[\u0000-\u001F]/g, '');
+
+ // Encode \" \' % and ; and : inside strings so they don't interfere with the style parsing
+ css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function (str) {
+ return str.replace(/[;:]/g, encode);
+ });
+
+ // Parse styles
+ while ((matches = styleRegExp.exec(css))) {
+ styleRegExp.lastIndex = matches.index + matches[0].length;
+ name = matches[1].replace(trimRightRegExp, '').toLowerCase();
+ value = matches[2].replace(trimRightRegExp, '');
+
+ if (name && value) {
+ // Decode escaped sequences like \65 -> e
+ name = decodeHexSequences(name);
+ value = decodeHexSequences(value);
+
+ // Skip properties with double quotes and sequences like \" \' in their names
+ // See 'mXSS Attacks: Attacking well-secured Web-Applications by using innerHTML Mutations'
+ // https://cure53.de/fp170.pdf
+ if (name.indexOf(invisibleChar) !== -1 || name.indexOf('"') !== -1) {
+ continue;
+ }
+
+ // Don't allow behavior name or expression/comments within the values
+ if (!settings.allow_script_urls && (name == "behavior" || /expression\s*\(|\/\*|\*\//.test(value))) {
+ continue;
+ }
+
+ // Opera will produce 700 instead of bold in their style values
+ if (name === 'font-weight' && value === '700') {
+ value = 'bold';
+ } else if (name === 'color' || name === 'background-color') { // Lowercase colors like RED
+ value = value.toLowerCase();
+ }
+
+ // Convert RGB colors to HEX
+ value = value.replace(rgbRegExp, toHex);
+
+ // Convert URLs and force them into url('value') format
+ value = value.replace(urlOrStrRegExp, processUrl);
+ styles[name] = isEncoded ? decode(value, true) : value;
+ }
+ }
+ // Compress the styles to reduce it's size for example IE will expand styles
+ compress("border", "", true);
+ compress("border", "-width");
+ compress("border", "-color");
+ compress("border", "-style");
+ compress("padding", "");
+ compress("margin", "");
+ compress2('border', 'border-width', 'border-style', 'border-color');
+
+ // Remove pointless border, IE produces these
+ if (styles.border === 'medium none') {
+ delete styles.border;
+ }
+
+ // IE 11 will produce a border-image: none when getting the style attribute from
+ // So let us assume it shouldn't be there
+ if (styles['border-image'] === 'none') {
+ delete styles['border-image'];
+ }
+ }
+
+ return styles;
+ },
+
+ /**
+ * Serializes the specified style object into a string.
+ *
+ * @method serialize
+ * @param {Object} styles Object to serialize as string for example: {border: '1px solid red'}
+ * @param {String} elementName Optional element name, if specified only the styles that matches the schema will be serialized.
+ * @return {String} String representation of the style object for example: border: 1px solid red.
+ */
+ serialize: function (styles, elementName) {
+ var css = '', name, value;
+
+ var serializeStyles = function (name) {
+ var styleList, i, l, value;
+
+ styleList = validStyles[name];
+ if (styleList) {
+ for (i = 0, l = styleList.length; i < l; i++) {
+ name = styleList[i];
+ value = styles[name];
+
+ if (value) {
+ css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
+ }
+ }
+ }
+ };
+
+ var isValid = function (name, elementName) {
+ var styleMap;
+
+ styleMap = invalidStyles['*'];
+ if (styleMap && styleMap[name]) {
+ return false;
+ }
+
+ styleMap = invalidStyles[elementName];
+ if (styleMap && styleMap[name]) {
+ return false;
+ }
+
+ return true;
+ };
+
+ // Serialize styles according to schema
+ if (elementName && validStyles) {
+ // Serialize global styles and element specific styles
+ serializeStyles('*');
+ serializeStyles(elementName);
+ } else {
+ // Output the styles in the order they are inside the object
+ for (name in styles) {
+ value = styles[name];
+
+ if (value && (!invalidStyles || isValid(name, elementName))) {
+ css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';';
+ }
+ }
+ }
+
+ return css;
+ }
+ };
+ };
+ }
+);
+
+/**
+ * DOMUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Utility class for various DOM manipulation and retrieval functions.
+ *
+ * @class tinymce.dom.DOMUtils
+ * @example
+ * // Add a class to an element by id in the page
+ * tinymce.DOM.addClass('someid', 'someclass');
+ *
+ * // Add a class to an element by id inside the editor
+ * tinymce.activeEditor.dom.addClass('someid', 'someclass');
+ */
+define(
+ 'tinymce.core.dom.DOMUtils',
+ [
+ 'global!document',
+ 'global!window',
+ 'tinymce.core.Env',
+ 'tinymce.core.dom.DomQuery',
+ 'tinymce.core.dom.EventUtils',
+ 'tinymce.core.dom.Position',
+ 'tinymce.core.dom.Sizzle',
+ 'tinymce.core.dom.StyleSheetLoader',
+ 'tinymce.core.dom.TreeWalker',
+ 'tinymce.core.dom.TrimNode',
+ 'tinymce.core.html.Entities',
+ 'tinymce.core.html.Schema',
+ 'tinymce.core.html.Styles',
+ 'tinymce.core.util.Tools'
+ ],
+ function (document, window, Env, DomQuery, EventUtils, Position, Sizzle, StyleSheetLoader, TreeWalker, TrimNode, Entities, Schema, Styles, Tools) {
+ // Shorten names
+ var each = Tools.each, is = Tools.is, grep = Tools.grep;
+ var isIE = Env.ie;
+ var simpleSelectorRe = /^([a-z0-9],?)+$/i;
+ var whiteSpaceRegExp = /^[ \t\r\n]*$/;
+
+ var setupAttrHooks = function (domUtils, settings) {
+ var attrHooks = {}, keepValues = settings.keep_values, keepUrlHook;
+
+ keepUrlHook = {
+ set: function ($elm, value, name) {
+ if (settings.url_converter) {
+ value = settings.url_converter.call(settings.url_converter_scope || domUtils, value, name, $elm[0]);
+ }
+
+ $elm.attr('data-mce-' + name, value).attr(name, value);
+ },
+
+ get: function ($elm, name) {
+ return $elm.attr('data-mce-' + name) || $elm.attr(name);
+ }
+ };
+
+ attrHooks = {
+ style: {
+ set: function ($elm, value) {
+ if (value !== null && typeof value === 'object') {
+ $elm.css(value);
+ return;
+ }
+
+ if (keepValues) {
+ $elm.attr('data-mce-style', value);
+ }
+
+ $elm.attr('style', value);
+ },
+
+ get: function ($elm) {
+ var value = $elm.attr('data-mce-style') || $elm.attr('style');
+
+ value = domUtils.serializeStyle(domUtils.parseStyle(value), $elm[0].nodeName);
+
+ return value;
+ }
+ }
+ };
+
+ if (keepValues) {
+ attrHooks.href = attrHooks.src = keepUrlHook;
+ }
+
+ return attrHooks;
+ };
+
+ var updateInternalStyleAttr = function (domUtils, $elm) {
+ var value = $elm.attr('style');
+
+ value = domUtils.serializeStyle(domUtils.parseStyle(value), $elm[0].nodeName);
+
+ if (!value) {
+ value = null;
+ }
+
+ $elm.attr('data-mce-style', value);
+ };
+
+ var nodeIndex = function (node, normalized) {
+ var idx = 0, lastNodeType, nodeType;
+
+ if (node) {
+ for (lastNodeType = node.nodeType, node = node.previousSibling; node; node = node.previousSibling) {
+ nodeType = node.nodeType;
+
+ // Normalize text nodes
+ if (normalized && nodeType == 3) {
+ if (nodeType == lastNodeType || !node.nodeValue.length) {
+ continue;
+ }
+ }
+ idx++;
+ lastNodeType = nodeType;
+ }
+ }
+
+ return idx;
+ };
+
+ /**
+ * Constructs a new DOMUtils instance. Consult the Wiki for more details on settings etc for this class.
+ *
+ * @constructor
+ * @method DOMUtils
+ * @param {Document} doc Document reference to bind the utility class to.
+ * @param {settings} settings Optional settings collection.
+ */
+ var DOMUtils = function (doc, settings) {
+ var self = this, blockElementsMap;
+
+ self.doc = doc;
+ self.win = window;
+ self.files = {};
+ self.counter = 0;
+ self.stdMode = !isIE || doc.documentMode >= 8;
+ self.boxModel = !isIE || doc.compatMode == "CSS1Compat" || self.stdMode;
+ self.styleSheetLoader = new StyleSheetLoader(doc);
+ self.boundEvents = [];
+ self.settings = settings = settings || {};
+ self.schema = settings.schema ? settings.schema : new Schema({});
+ self.styles = new Styles({
+ url_converter: settings.url_converter,
+ url_converter_scope: settings.url_converter_scope
+ }, settings.schema);
+
+ self.fixDoc(doc);
+ self.events = settings.ownEvents ? new EventUtils(settings.proxy) : EventUtils.Event;
+ self.attrHooks = setupAttrHooks(self, settings);
+ blockElementsMap = self.schema.getBlockElements();
+ self.$ = DomQuery.overrideDefaults(function () {
+ return {
+ context: doc,
+ element: self.getRoot()
+ };
+ });
+
+ /**
+ * Returns true/false if the specified element is a block element or not.
+ *
+ * @method isBlock
+ * @param {Node/String} node Element/Node to check.
+ * @return {Boolean} True/False state if the node is a block element or not.
+ */
+ self.isBlock = function (node) {
+ // Fix for #5446
+ if (!node) {
+ return false;
+ }
+
+ // This function is called in module pattern style since it might be executed with the wrong this scope
+ var type = node.nodeType;
+
+ // If it's a node then check the type and use the nodeName
+ if (type) {
+ return !!(type === 1 && blockElementsMap[node.nodeName]);
+ }
+
+ return !!blockElementsMap[node];
+ };
+ };
+
+ DOMUtils.prototype = {
+ $$: function (elm) {
+ if (typeof elm == 'string') {
+ elm = this.get(elm);
+ }
+
+ return this.$(elm);
+ },
+
+ root: null,
+
+ fixDoc: function (doc) {
+ var settings = this.settings, name;
+
+ if (isIE && settings.schema) {
+ // Add missing HTML 4/5 elements to IE
+ ('abbr article aside audio canvas ' +
+ 'details figcaption figure footer ' +
+ 'header hgroup mark menu meter nav ' +
+ 'output progress section summary ' +
+ 'time video').replace(/\w+/g, function (name) {
+ doc.createElement(name);
+ });
+
+ // Create all custom elements
+ for (name in settings.schema.getCustomElements()) {
+ doc.createElement(name);
+ }
+ }
+ },
+
+ clone: function (node, deep) {
+ var self = this, clone, doc;
+
+ // TODO: Add feature detection here in the future
+ if (!isIE || node.nodeType !== 1 || deep) {
+ return node.cloneNode(deep);
+ }
+
+ doc = self.doc;
+
+ // Make a HTML5 safe shallow copy
+ if (!deep) {
+ clone = doc.createElement(node.nodeName);
+
+ // Copy attribs
+ each(self.getAttribs(node), function (attr) {
+ self.setAttrib(clone, attr.nodeName, self.getAttrib(node, attr.nodeName));
+ });
+
+ return clone;
+ }
+
+ return clone.firstChild;
+ },
+
+ /**
+ * Returns the root node of the document. This is normally the body but might be a DIV. Parents like getParent will not
+ * go above the point of this root node.
+ *
+ * @method getRoot
+ * @return {Element} Root element for the utility class.
+ */
+ getRoot: function () {
+ var self = this;
+
+ return self.settings.root_element || self.doc.body;
+ },
+
+ /**
+ * Returns the viewport of the window.
+ *
+ * @method getViewPort
+ * @param {Window} win Optional window to get viewport of.
+ * @return {Object} Viewport object with fields x, y, w and h.
+ */
+ getViewPort: function (win) {
+ var doc, rootElm;
+
+ win = !win ? this.win : win;
+ doc = win.document;
+ rootElm = this.boxModel ? doc.documentElement : doc.body;
+
+ // Returns viewport size excluding scrollbars
+ return {
+ x: win.pageXOffset || rootElm.scrollLeft,
+ y: win.pageYOffset || rootElm.scrollTop,
+ w: win.innerWidth || rootElm.clientWidth,
+ h: win.innerHeight || rootElm.clientHeight
+ };
+ },
+
+ /**
+ * Returns the rectangle for a specific element.
+ *
+ * @method getRect
+ * @param {Element/String} elm Element object or element ID to get rectangle from.
+ * @return {object} Rectangle for specified element object with x, y, w, h fields.
+ */
+ getRect: function (elm) {
+ var self = this, pos, size;
+
+ elm = self.get(elm);
+ pos = self.getPos(elm);
+ size = self.getSize(elm);
+
+ return {
+ x: pos.x, y: pos.y,
+ w: size.w, h: size.h
+ };
+ },
+
+ /**
+ * Returns the size dimensions of the specified element.
+ *
+ * @method getSize
+ * @param {Element/String} elm Element object or element ID to get rectangle from.
+ * @return {object} Rectangle for specified element object with w, h fields.
+ */
+ getSize: function (elm) {
+ var self = this, w, h;
+
+ elm = self.get(elm);
+ w = self.getStyle(elm, 'width');
+ h = self.getStyle(elm, 'height');
+
+ // Non pixel value, then force offset/clientWidth
+ if (w.indexOf('px') === -1) {
+ w = 0;
+ }
+
+ // Non pixel value, then force offset/clientWidth
+ if (h.indexOf('px') === -1) {
+ h = 0;
+ }
+
+ return {
+ w: parseInt(w, 10) || elm.offsetWidth || elm.clientWidth,
+ h: parseInt(h, 10) || elm.offsetHeight || elm.clientHeight
+ };
+ },
+
+ /**
+ * Returns a node by the specified selector function. This function will
+ * loop through all parent nodes and call the specified function for each node.
+ * If the function then returns true indicating that it has found what it was looking for, the loop execution will then end
+ * and the node it found will be returned.
+ *
+ * @method getParent
+ * @param {Node/String} node DOM node to search parents on or ID string.
+ * @param {function} selector Selection function or CSS selector to execute on each node.
+ * @param {Node} root Optional root element, never go beyond this point.
+ * @return {Node} DOM Node or null if it wasn't found.
+ */
+ getParent: function (node, selector, root) {
+ return this.getParents(node, selector, root, false);
+ },
+
+ /**
+ * Returns a node list of all parents matching the specified selector function or pattern.
+ * If the function then returns true indicating that it has found what it was looking for and that node will be collected.
+ *
+ * @method getParents
+ * @param {Node/String} node DOM node to search parents on or ID string.
+ * @param {function} selector Selection function to execute on each node or CSS pattern.
+ * @param {Node} root Optional root element, never go beyond this point.
+ * @return {Array} Array of nodes or null if it wasn't found.
+ */
+ getParents: function (node, selector, root, collect) {
+ var self = this, selectorVal, result = [];
+
+ node = self.get(node);
+ collect = collect === undefined;
+
+ // Default root on inline mode
+ root = root || (self.getRoot().nodeName != 'BODY' ? self.getRoot().parentNode : null);
+
+ // Wrap node name as func
+ if (is(selector, 'string')) {
+ selectorVal = selector;
+
+ if (selector === '*') {
+ selector = function (node) {
+ return node.nodeType == 1;
+ };
+ } else {
+ selector = function (node) {
+ return self.is(node, selectorVal);
+ };
+ }
+ }
+
+ while (node) {
+ if (node == root || !node.nodeType || node.nodeType === 9) {
+ break;
+ }
+
+ if (!selector || selector(node)) {
+ if (collect) {
+ result.push(node);
+ } else {
+ return node;
+ }
+ }
+
+ node = node.parentNode;
+ }
+
+ return collect ? result : null;
+ },
+
+ /**
+ * Returns the specified element by ID or the input element if it isn't a string.
+ *
+ * @method get
+ * @param {String/Element} n Element id to look for or element to just pass though.
+ * @return {Element} Element matching the specified id or null if it wasn't found.
+ */
+ get: function (elm) {
+ var name;
+
+ if (elm && this.doc && typeof elm == 'string') {
+ name = elm;
+ elm = this.doc.getElementById(elm);
+
+ // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick
+ if (elm && elm.id !== name) {
+ return this.doc.getElementsByName(name)[1];
+ }
+ }
+
+ return elm;
+ },
+
+ /**
+ * Returns the next node that matches selector or function
+ *
+ * @method getNext
+ * @param {Node} node Node to find siblings from.
+ * @param {String/function} selector Selector CSS expression or function.
+ * @return {Node} Next node item matching the selector or null if it wasn't found.
+ */
+ getNext: function (node, selector) {
+ return this._findSib(node, selector, 'nextSibling');
+ },
+
+ /**
+ * Returns the previous node that matches selector or function
+ *
+ * @method getPrev
+ * @param {Node} node Node to find siblings from.
+ * @param {String/function} selector Selector CSS expression or function.
+ * @return {Node} Previous node item matching the selector or null if it wasn't found.
+ */
+ getPrev: function (node, selector) {
+ return this._findSib(node, selector, 'previousSibling');
+ },
+
+ // #ifndef jquery
+
+ /**
+ * Selects specific elements by a CSS level 3 pattern. For example "div#a1 p.test".
+ * This function is optimized for the most common patterns needed in TinyMCE but it also performs well enough
+ * on more complex patterns.
+ *
+ * @method select
+ * @param {String} selector CSS level 3 pattern to select/find elements by.
+ * @param {Object} scope Optional root element/scope element to search in.
+ * @return {Array} Array with all matched elements.
+ * @example
+ * // Adds a class to all paragraphs in the currently active editor
+ * tinymce.activeEditor.dom.addClass(tinymce.activeEditor.dom.select('p'), 'someclass');
+ *
+ * // Adds a class to all spans that have the test class in the currently active editor
+ * tinymce.activeEditor.dom.addClass(tinymce.activeEditor.dom.select('span.test'), 'someclass')
+ */
+ select: function (selector, scope) {
+ var self = this;
+
+ /*eslint new-cap:0 */
+ return Sizzle(selector, self.get(scope) || self.settings.root_element || self.doc, []);
+ },
+
+ /**
+ * Returns true/false if the specified element matches the specified css pattern.
+ *
+ * @method is
+ * @param {Node/NodeList} elm DOM node to match or an array of nodes to match.
+ * @param {String} selector CSS pattern to match the element against.
+ */
+ is: function (elm, selector) {
+ var i;
+
+ if (!elm) {
+ return false;
+ }
+
+ // If it isn't an array then try to do some simple selectors instead of Sizzle for to boost performance
+ if (elm.length === undefined) {
+ // Simple all selector
+ if (selector === '*') {
+ return elm.nodeType == 1;
+ }
+
+ // Simple selector just elements
+ if (simpleSelectorRe.test(selector)) {
+ selector = selector.toLowerCase().split(/,/);
+ elm = elm.nodeName.toLowerCase();
+
+ for (i = selector.length - 1; i >= 0; i--) {
+ if (selector[i] == elm) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ }
+
+ // Is non element
+ if (elm.nodeType && elm.nodeType != 1) {
+ return false;
+ }
+
+ var elms = elm.nodeType ? [elm] : elm;
+
+ /*eslint new-cap:0 */
+ return Sizzle(selector, elms[0].ownerDocument || elms[0], null, elms).length > 0;
+ },
+
+ // #endif
+
+ /**
+ * Adds the specified element to another element or elements.
+ *
+ * @method add
+ * @param {String/Element/Array} parentElm Element id string, DOM node element or array of ids or elements to add to.
+ * @param {String/Element} name Name of new element to add or existing element to add.
+ * @param {Object} attrs Optional object collection with arguments to add to the new element(s).
+ * @param {String} html Optional inner HTML contents to add for each element.
+ * @param {Boolean} create Optional flag if the element should be created or added.
+ * @return {Element/Array} Element that got created, or an array of created elements if multiple input elements
+ * were passed in.
+ * @example
+ * // Adds a new paragraph to the end of the active editor
+ * tinymce.activeEditor.dom.add(tinymce.activeEditor.getBody(), 'p', {title: 'my title'}, 'Some content');
+ */
+ add: function (parentElm, name, attrs, html, create) {
+ var self = this;
+
+ return this.run(parentElm, function (parentElm) {
+ var newElm;
+
+ newElm = is(name, 'string') ? self.doc.createElement(name) : name;
+ self.setAttribs(newElm, attrs);
+
+ if (html) {
+ if (html.nodeType) {
+ newElm.appendChild(html);
+ } else {
+ self.setHTML(newElm, html);
+ }
+ }
+
+ return !create ? parentElm.appendChild(newElm) : newElm;
+ });
+ },
+
+ /**
+ * Creates a new element.
+ *
+ * @method create
+ * @param {String} name Name of new element.
+ * @param {Object} attrs Optional object name/value collection with element attributes.
+ * @param {String} html Optional HTML string to set as inner HTML of the element.
+ * @return {Element} HTML DOM node element that got created.
+ * @example
+ * // Adds an element where the caret/selection is in the active editor
+ * var el = tinymce.activeEditor.dom.create('div', {id: 'test', 'class': 'myclass'}, 'some content');
+ * tinymce.activeEditor.selection.setNode(el);
+ */
+ create: function (name, attrs, html) {
+ return this.add(this.doc.createElement(name), name, attrs, html, 1);
+ },
+
+ /**
+ * Creates HTML string for element. The element will be closed unless an empty inner HTML string is passed in.
+ *
+ * @method createHTML
+ * @param {String} name Name of new element.
+ * @param {Object} attrs Optional object name/value collection with element attributes.
+ * @param {String} html Optional HTML string to set as inner HTML of the element.
+ * @return {String} String with new HTML element, for example: test.
+ * @example
+ * // Creates a html chunk and inserts it at the current selection/caret location
+ * tinymce.activeEditor.selection.setContent(tinymce.activeEditor.dom.createHTML('a', {href: 'test.html'}, 'some line'));
+ */
+ createHTML: function (name, attrs, html) {
+ var outHtml = '', key;
+
+ outHtml += '<' + name;
+
+ for (key in attrs) {
+ if (attrs.hasOwnProperty(key) && attrs[key] !== null && typeof attrs[key] != 'undefined') {
+ outHtml += ' ' + key + '="' + this.encode(attrs[key]) + '"';
+ }
+ }
+
+ // A call to tinymce.is doesn't work for some odd reason on IE9 possible bug inside their JS runtime
+ if (typeof html != "undefined") {
+ return outHtml + '>' + html + '' + name + '>';
+ }
+
+ return outHtml + ' />';
+ },
+
+ /**
+ * Creates a document fragment out of the specified HTML string.
+ *
+ * @method createFragment
+ * @param {String} html Html string to create fragment from.
+ * @return {DocumentFragment} Document fragment node.
+ */
+ createFragment: function (html) {
+ var frag, node, doc = this.doc, container;
+
+ container = doc.createElement("div");
+ frag = doc.createDocumentFragment();
+
+ if (html) {
+ container.innerHTML = html;
+ }
+
+ while ((node = container.firstChild)) {
+ frag.appendChild(node);
+ }
+
+ return frag;
+ },
+
+ /**
+ * Removes/deletes the specified element(s) from the DOM.
+ *
+ * @method remove
+ * @param {String/Element/Array} node ID of element or DOM element object or array containing multiple elements/ids.
+ * @param {Boolean} keepChildren Optional state to keep children or not. If set to true all children will be
+ * placed at the location of the removed element.
+ * @return {Element/Array} HTML DOM element that got removed, or an array of removed elements if multiple input elements
+ * were passed in.
+ * @example
+ * // Removes all paragraphs in the active editor
+ * tinymce.activeEditor.dom.remove(tinymce.activeEditor.dom.select('p'));
+ *
+ * // Removes an element by id in the document
+ * tinymce.DOM.remove('mydiv');
+ */
+ remove: function (node, keepChildren) {
+ node = this.$$(node);
+
+ if (keepChildren) {
+ node.each(function () {
+ var child;
+
+ while ((child = this.firstChild)) {
+ if (child.nodeType == 3 && child.data.length === 0) {
+ this.removeChild(child);
+ } else {
+ this.parentNode.insertBefore(child, this);
+ }
+ }
+ }).remove();
+ } else {
+ node.remove();
+ }
+
+ return node.length > 1 ? node.toArray() : node[0];
+ },
+
+ /**
+ * Sets the CSS style value on a HTML element. The name can be a camelcase string
+ * or the CSS style name like background-color.
+ *
+ * @method setStyle
+ * @param {String/Element/Array} elm HTML element/Array of elements to set CSS style value on.
+ * @param {String} name Name of the style value to set.
+ * @param {String} value Value to set on the style.
+ * @example
+ * // Sets a style value on all paragraphs in the currently active editor
+ * tinymce.activeEditor.dom.setStyle(tinymce.activeEditor.dom.select('p'), 'background-color', 'red');
+ *
+ * // Sets a style value to an element by id in the current document
+ * tinymce.DOM.setStyle('mydiv', 'background-color', 'red');
+ */
+ setStyle: function (elm, name, value) {
+ elm = this.$$(elm).css(name, value);
+
+ if (this.settings.update_styles) {
+ updateInternalStyleAttr(this, elm);
+ }
+ },
+
+ /**
+ * Returns the current style or runtime/computed value of an element.
+ *
+ * @method getStyle
+ * @param {String/Element} elm HTML element or element id string to get style from.
+ * @param {String} name Style name to return.
+ * @param {Boolean} computed Computed style.
+ * @return {String} Current style or computed style value of an element.
+ */
+ getStyle: function (elm, name, computed) {
+ elm = this.$$(elm);
+
+ if (computed) {
+ return elm.css(name);
+ }
+
+ // Camelcase it, if needed
+ name = name.replace(/-(\D)/g, function (a, b) {
+ return b.toUpperCase();
+ });
+
+ if (name == 'float') {
+ name = Env.ie && Env.ie < 12 ? 'styleFloat' : 'cssFloat';
+ }
+
+ return elm[0] && elm[0].style ? elm[0].style[name] : undefined;
+ },
+
+ /**
+ * Sets multiple styles on the specified element(s).
+ *
+ * @method setStyles
+ * @param {Element/String/Array} elm DOM element, element id string or array of elements/ids to set styles on.
+ * @param {Object} styles Name/Value collection of style items to add to the element(s).
+ * @example
+ * // Sets styles on all paragraphs in the currently active editor
+ * tinymce.activeEditor.dom.setStyles(tinymce.activeEditor.dom.select('p'), {'background-color': 'red', 'color': 'green'});
+ *
+ * // Sets styles to an element by id in the current document
+ * tinymce.DOM.setStyles('mydiv', {'background-color': 'red', 'color': 'green'});
+ */
+ setStyles: function (elm, styles) {
+ elm = this.$$(elm).css(styles);
+
+ if (this.settings.update_styles) {
+ updateInternalStyleAttr(this, elm);
+ }
+ },
+
+ /**
+ * Removes all attributes from an element or elements.
+ *
+ * @method removeAllAttribs
+ * @param {Element/String/Array} e DOM element, element id string or array of elements/ids to remove attributes from.
+ */
+ removeAllAttribs: function (e) {
+ return this.run(e, function (e) {
+ var i, attrs = e.attributes;
+ for (i = attrs.length - 1; i >= 0; i--) {
+ e.removeAttributeNode(attrs.item(i));
+ }
+ });
+ },
+
+ /**
+ * Sets the specified attribute of an element or elements.
+ *
+ * @method setAttrib
+ * @param {Element/String/Array} elm DOM element, element id string or array of elements/ids to set attribute on.
+ * @param {String} name Name of attribute to set.
+ * @param {String} value Value to set on the attribute - if this value is falsy like null, 0 or '' it will remove
+ * the attribute instead.
+ * @example
+ * // Sets class attribute on all paragraphs in the active editor
+ * tinymce.activeEditor.dom.setAttrib(tinymce.activeEditor.dom.select('p'), 'class', 'myclass');
+ *
+ * // Sets class attribute on a specific element in the current page
+ * tinymce.dom.setAttrib('mydiv', 'class', 'myclass');
+ */
+ setAttrib: function (elm, name, value) {
+ var self = this, originalValue, hook, settings = self.settings;
+
+ if (value === '') {
+ value = null;
+ }
+
+ elm = self.$$(elm);
+ originalValue = elm.attr(name);
+
+ if (!elm.length) {
+ return;
+ }
+
+ hook = self.attrHooks[name];
+ if (hook && hook.set) {
+ hook.set(elm, value, name);
+ } else {
+ elm.attr(name, value);
+ }
+
+ if (originalValue != value && settings.onSetAttrib) {
+ settings.onSetAttrib({
+ attrElm: elm,
+ attrName: name,
+ attrValue: value
+ });
+ }
+ },
+
+ /**
+ * Sets two or more specified attributes of an element or elements.
+ *
+ * @method setAttribs
+ * @param {Element/String/Array} elm DOM element, element id string or array of elements/ids to set attributes on.
+ * @param {Object} attrs Name/Value collection of attribute items to add to the element(s).
+ * @example
+ * // Sets class and title attributes on all paragraphs in the active editor
+ * tinymce.activeEditor.dom.setAttribs(tinymce.activeEditor.dom.select('p'), {'class': 'myclass', title: 'some title'});
+ *
+ * // Sets class and title attributes on a specific element in the current page
+ * tinymce.DOM.setAttribs('mydiv', {'class': 'myclass', title: 'some title'});
+ */
+ setAttribs: function (elm, attrs) {
+ var self = this;
+
+ self.$$(elm).each(function (i, node) {
+ each(attrs, function (value, name) {
+ self.setAttrib(node, name, value);
+ });
+ });
+ },
+
+ /**
+ * Returns the specified attribute by name.
+ *
+ * @method getAttrib
+ * @param {String/Element} elm Element string id or DOM element to get attribute from.
+ * @param {String} name Name of attribute to get.
+ * @param {String} defaultVal Optional default value to return if the attribute didn't exist.
+ * @return {String} Attribute value string, default value or null if the attribute wasn't found.
+ */
+ getAttrib: function (elm, name, defaultVal) {
+ var self = this, hook, value;
+
+ elm = self.$$(elm);
+
+ if (elm.length) {
+ hook = self.attrHooks[name];
+
+ if (hook && hook.get) {
+ value = hook.get(elm, name);
+ } else {
+ value = elm.attr(name);
+ }
+ }
+
+ if (typeof value == 'undefined') {
+ value = defaultVal || '';
+ }
+
+ return value;
+ },
+
+ /**
+ * Returns the absolute x, y position of a node. The position will be returned in an object with x, y fields.
+ *
+ * @method getPos
+ * @param {Element/String} elm HTML element or element id to get x, y position from.
+ * @param {Element} rootElm Optional root element to stop calculations at.
+ * @return {object} Absolute position of the specified element object with x, y fields.
+ */
+ getPos: function (elm, rootElm) {
+ return Position.getPos(this.doc.body, this.get(elm), rootElm);
+ },
+
+ /**
+ * Parses the specified style value into an object collection. This parser will also
+ * merge and remove any redundant items that browsers might have added. It will also convert non-hex
+ * colors to hex values. Urls inside the styles will also be converted to absolute/relative based on settings.
+ *
+ * @method parseStyle
+ * @param {String} cssText Style value to parse, for example: border:1px solid red;.
+ * @return {Object} Object representation of that style, for example: {border: '1px solid red'}
+ */
+ parseStyle: function (cssText) {
+ return this.styles.parse(cssText);
+ },
+
+ /**
+ * Serializes the specified style object into a string.
+ *
+ * @method serializeStyle
+ * @param {Object} styles Object to serialize as string, for example: {border: '1px solid red'}
+ * @param {String} name Optional element name.
+ * @return {String} String representation of the style object, for example: border: 1px solid red.
+ */
+ serializeStyle: function (styles, name) {
+ return this.styles.serialize(styles, name);
+ },
+
+ /**
+ * Adds a style element at the top of the document with the specified cssText content.
+ *
+ * @method addStyle
+ * @param {String} cssText CSS Text style to add to top of head of document.
+ */
+ addStyle: function (cssText) {
+ var self = this, doc = self.doc, head, styleElm;
+
+ // Prevent inline from loading the same styles twice
+ if (self !== DOMUtils.DOM && doc === document) {
+ var addedStyles = DOMUtils.DOM.addedStyles;
+
+ addedStyles = addedStyles || [];
+ if (addedStyles[cssText]) {
+ return;
+ }
+
+ addedStyles[cssText] = true;
+ DOMUtils.DOM.addedStyles = addedStyles;
+ }
+
+ // Create style element if needed
+ styleElm = doc.getElementById('mceDefaultStyles');
+ if (!styleElm) {
+ styleElm = doc.createElement('style');
+ styleElm.id = 'mceDefaultStyles';
+ styleElm.type = 'text/css';
+
+ head = doc.getElementsByTagName('head')[0];
+ if (head.firstChild) {
+ head.insertBefore(styleElm, head.firstChild);
+ } else {
+ head.appendChild(styleElm);
+ }
+ }
+
+ // Append style data to old or new style element
+ if (styleElm.styleSheet) {
+ styleElm.styleSheet.cssText += cssText;
+ } else {
+ styleElm.appendChild(doc.createTextNode(cssText));
+ }
+ },
+
+ /**
+ * Imports/loads the specified CSS file into the document bound to the class.
+ *
+ * @method loadCSS
+ * @param {String} url URL to CSS file to load.
+ * @example
+ * // Loads a CSS file dynamically into the current document
+ * tinymce.DOM.loadCSS('somepath/some.css');
+ *
+ * // Loads a CSS file into the currently active editor instance
+ * tinymce.activeEditor.dom.loadCSS('somepath/some.css');
+ *
+ * // Loads a CSS file into an editor instance by id
+ * tinymce.get('someid').dom.loadCSS('somepath/some.css');
+ *
+ * // Loads multiple CSS files into the current document
+ * tinymce.DOM.loadCSS('somepath/some.css,somepath/someother.css');
+ */
+ loadCSS: function (url) {
+ var self = this, doc = self.doc, head;
+
+ // Prevent inline from loading the same CSS file twice
+ if (self !== DOMUtils.DOM && doc === document) {
+ DOMUtils.DOM.loadCSS(url);
+ return;
+ }
+
+ if (!url) {
+ url = '';
+ }
+
+ head = doc.getElementsByTagName('head')[0];
+
+ each(url.split(','), function (url) {
+ var link;
+
+ url = Tools._addCacheSuffix(url);
+
+ if (self.files[url]) {
+ return;
+ }
+
+ self.files[url] = true;
+ link = self.create('link', { rel: 'stylesheet', href: url });
+
+ // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug
+ // This fix seems to resolve that issue by recalcing the document once a stylesheet finishes loading
+ // It's ugly but it seems to work fine.
+ if (isIE && doc.documentMode && doc.recalc) {
+ link.onload = function () {
+ if (doc.recalc) {
+ doc.recalc();
+ }
+
+ link.onload = null;
+ };
+ }
+
+ head.appendChild(link);
+ });
+ },
+
+ /**
+ * Adds a class to the specified element or elements.
+ *
+ * @method addClass
+ * @param {String/Element/Array} elm Element ID string or DOM element or array with elements or IDs.
+ * @param {String} cls Class name to add to each element.
+ * @return {String/Array} String with new class value or array with new class values for all elements.
+ * @example
+ * // Adds a class to all paragraphs in the active editor
+ * tinymce.activeEditor.dom.addClass(tinymce.activeEditor.dom.select('p'), 'myclass');
+ *
+ * // Adds a class to a specific element in the current page
+ * tinymce.DOM.addClass('mydiv', 'myclass');
+ */
+ addClass: function (elm, cls) {
+ this.$$(elm).addClass(cls);
+ },
+
+ /**
+ * Removes a class from the specified element or elements.
+ *
+ * @method removeClass
+ * @param {String/Element/Array} elm Element ID string or DOM element or array with elements or IDs.
+ * @param {String} cls Class name to remove from each element.
+ * @return {String/Array} String of remaining class name(s), or an array of strings if multiple input elements
+ * were passed in.
+ * @example
+ * // Removes a class from all paragraphs in the active editor
+ * tinymce.activeEditor.dom.removeClass(tinymce.activeEditor.dom.select('p'), 'myclass');
+ *
+ * // Removes a class from a specific element in the current page
+ * tinymce.DOM.removeClass('mydiv', 'myclass');
+ */
+ removeClass: function (elm, cls) {
+ this.toggleClass(elm, cls, false);
+ },
+
+ /**
+ * Returns true if the specified element has the specified class.
+ *
+ * @method hasClass
+ * @param {String/Element} elm HTML element or element id string to check CSS class on.
+ * @param {String} cls CSS class to check for.
+ * @return {Boolean} true/false if the specified element has the specified class.
+ */
+ hasClass: function (elm, cls) {
+ return this.$$(elm).hasClass(cls);
+ },
+
+ /**
+ * Toggles the specified class on/off.
+ *
+ * @method toggleClass
+ * @param {Element} elm Element to toggle class on.
+ * @param {[type]} cls Class to toggle on/off.
+ * @param {[type]} state Optional state to set.
+ */
+ toggleClass: function (elm, cls, state) {
+ this.$$(elm).toggleClass(cls, state).each(function () {
+ if (this.className === '') {
+ DomQuery(this).attr('class', null);
+ }
+ });
+ },
+
+ /**
+ * Shows the specified element(s) by ID by setting the "display" style.
+ *
+ * @method show
+ * @param {String/Element/Array} elm ID of DOM element or DOM element or array with elements or IDs to show.
+ */
+ show: function (elm) {
+ this.$$(elm).show();
+ },
+
+ /**
+ * Hides the specified element(s) by ID by setting the "display" style.
+ *
+ * @method hide
+ * @param {String/Element/Array} elm ID of DOM element or DOM element or array with elements or IDs to hide.
+ * @example
+ * // Hides an element by id in the document
+ * tinymce.DOM.hide('myid');
+ */
+ hide: function (elm) {
+ this.$$(elm).hide();
+ },
+
+ /**
+ * Returns true/false if the element is hidden or not by checking the "display" style.
+ *
+ * @method isHidden
+ * @param {String/Element} elm Id or element to check display state on.
+ * @return {Boolean} true/false if the element is hidden or not.
+ */
+ isHidden: function (elm) {
+ return this.$$(elm).css('display') == 'none';
+ },
+
+ /**
+ * Returns a unique id. This can be useful when generating elements on the fly.
+ * This method will not check if the element already exists.
+ *
+ * @method uniqueId
+ * @param {String} prefix Optional prefix to add in front of all ids - defaults to "mce_".
+ * @return {String} Unique id.
+ */
+ uniqueId: function (prefix) {
+ return (!prefix ? 'mce_' : prefix) + (this.counter++);
+ },
+
+ /**
+ * Sets the specified HTML content inside the element or elements. The HTML will first be processed. This means
+ * URLs will get converted, hex color values fixed etc. Check processHTML for details.
+ *
+ * @method setHTML
+ * @param {Element/String/Array} elm DOM element, element id string or array of elements/ids to set HTML inside of.
+ * @param {String} html HTML content to set as inner HTML of the element.
+ * @example
+ * // Sets the inner HTML of all paragraphs in the active editor
+ * tinymce.activeEditor.dom.setHTML(tinymce.activeEditor.dom.select('p'), 'some inner html');
+ *
+ * // Sets the inner HTML of an element by id in the document
+ * tinymce.DOM.setHTML('mydiv', 'some inner html');
+ */
+ setHTML: function (elm, html) {
+ elm = this.$$(elm);
+
+ if (isIE) {
+ elm.each(function (i, target) {
+ if (target.canHaveHTML === false) {
+ return;
+ }
+
+ // Remove all child nodes, IE keeps empty text nodes in DOM
+ while (target.firstChild) {
+ target.removeChild(target.firstChild);
+ }
+
+ try {
+ // IE will remove comments from the beginning
+ // unless you padd the contents with something
+ target.innerHTML = ' ' + html;
+ target.removeChild(target.firstChild);
+ } catch (ex) {
+ // IE sometimes produces an unknown runtime error on innerHTML if it's a div inside a p
+ DomQuery('').html(' ' + html).contents().slice(1).appendTo(target);
+ }
+
+ return html;
+ });
+ } else {
+ elm.html(html);
+ }
+ },
+
+ /**
+ * Returns the outer HTML of an element.
+ *
+ * @method getOuterHTML
+ * @param {String/Element} elm Element ID or element object to get outer HTML from.
+ * @return {String} Outer HTML string.
+ * @example
+ * tinymce.DOM.getOuterHTML(editorElement);
+ * tinymce.activeEditor.getOuterHTML(tinymce.activeEditor.getBody());
+ */
+ getOuterHTML: function (elm) {
+ elm = this.get(elm);
+
+ // Older FF doesn't have outerHTML 3.6 is still used by some orgaizations
+ return elm.nodeType == 1 && "outerHTML" in elm ? elm.outerHTML : DomQuery('').append(DomQuery(elm).clone()).html();
+ },
+
+ /**
+ * Sets the specified outer HTML on an element or elements.
+ *
+ * @method setOuterHTML
+ * @param {Element/String/Array} elm DOM element, element id string or array of elements/ids to set outer HTML on.
+ * @param {Object} html HTML code to set as outer value for the element.
+ * @example
+ * // Sets the outer HTML of all paragraphs in the active editor
+ * tinymce.activeEditor.dom.setOuterHTML(tinymce.activeEditor.dom.select('p'), '
some html
');
+ *
+ * // Sets the outer HTML of an element by id in the document
+ * tinymce.DOM.setOuterHTML('mydiv', '
some html
');
+ */
+ setOuterHTML: function (elm, html) {
+ var self = this;
+
+ self.$$(elm).each(function () {
+ try {
+ // Older FF doesn't have outerHTML 3.6 is still used by some organizations
+ if ("outerHTML" in this) {
+ this.outerHTML = html;
+ return;
+ }
+ } catch (ex) {
+ // Ignore
+ }
+
+ // OuterHTML for IE it sometimes produces an "unknown runtime error"
+ self.remove(DomQuery(this).html(html), true);
+ });
+ },
+
+ /**
+ * Entity decodes a string. This method decodes any HTML entities, such as å.
+ *
+ * @method decode
+ * @param {String} s String to decode entities on.
+ * @return {String} Entity decoded string.
+ */
+ decode: Entities.decode,
+
+ /**
+ * Entity encodes a string. This method encodes the most common entities, such as <>"&.
+ *
+ * @method encode
+ * @param {String} text String to encode with entities.
+ * @return {String} Entity encoded string.
+ */
+ encode: Entities.encodeAllRaw,
+
+ /**
+ * Inserts an element after the reference element.
+ *
+ * @method insertAfter
+ * @param {Element} node Element to insert after the reference.
+ * @param {Element/String/Array} referenceNode Reference element, element id or array of elements to insert after.
+ * @return {Element/Array} Element that got added or an array with elements.
+ */
+ insertAfter: function (node, referenceNode) {
+ referenceNode = this.get(referenceNode);
+
+ return this.run(node, function (node) {
+ var parent, nextSibling;
+
+ parent = referenceNode.parentNode;
+ nextSibling = referenceNode.nextSibling;
+
+ if (nextSibling) {
+ parent.insertBefore(node, nextSibling);
+ } else {
+ parent.appendChild(node);
+ }
+
+ return node;
+ });
+ },
+
+ /**
+ * Replaces the specified element or elements with the new element specified. The new element will
+ * be cloned if multiple input elements are passed in.
+ *
+ * @method replace
+ * @param {Element} newElm New element to replace old ones with.
+ * @param {Element/String/Array} oldElm Element DOM node, element id or array of elements or ids to replace.
+ * @param {Boolean} keepChildren Optional keep children state, if set to true child nodes from the old object will be added
+ * to new ones.
+ */
+ replace: function (newElm, oldElm, keepChildren) {
+ var self = this;
+
+ return self.run(oldElm, function (oldElm) {
+ if (is(oldElm, 'array')) {
+ newElm = newElm.cloneNode(true);
+ }
+
+ if (keepChildren) {
+ each(grep(oldElm.childNodes), function (node) {
+ newElm.appendChild(node);
+ });
+ }
+
+ return oldElm.parentNode.replaceChild(newElm, oldElm);
+ });
+ },
+
+ /**
+ * Renames the specified element and keeps its attributes and children.
+ *
+ * @method rename
+ * @param {Element} elm Element to rename.
+ * @param {String} name Name of the new element.
+ * @return {Element} New element or the old element if it needed renaming.
+ */
+ rename: function (elm, name) {
+ var self = this, newElm;
+
+ if (elm.nodeName != name.toUpperCase()) {
+ // Rename block element
+ newElm = self.create(name);
+
+ // Copy attribs to new block
+ each(self.getAttribs(elm), function (attrNode) {
+ self.setAttrib(newElm, attrNode.nodeName, self.getAttrib(elm, attrNode.nodeName));
+ });
+
+ // Replace block
+ self.replace(newElm, elm, 1);
+ }
+
+ return newElm || elm;
+ },
+
+ /**
+ * Find the common ancestor of two elements. This is a shorter method than using the DOM Range logic.
+ *
+ * @method findCommonAncestor
+ * @param {Element} a Element to find common ancestor of.
+ * @param {Element} b Element to find common ancestor of.
+ * @return {Element} Common ancestor element of the two input elements.
+ */
+ findCommonAncestor: function (a, b) {
+ var ps = a, pe;
+
+ while (ps) {
+ pe = b;
+
+ while (pe && ps != pe) {
+ pe = pe.parentNode;
+ }
+
+ if (ps == pe) {
+ break;
+ }
+
+ ps = ps.parentNode;
+ }
+
+ if (!ps && a.ownerDocument) {
+ return a.ownerDocument.documentElement;
+ }
+
+ return ps;
+ },
+
+ /**
+ * Parses the specified RGB color value and returns a hex version of that color.
+ *
+ * @method toHex
+ * @param {String} rgbVal RGB string value like rgb(1,2,3)
+ * @return {String} Hex version of that RGB value like #FF00FF.
+ */
+ toHex: function (rgbVal) {
+ return this.styles.toHex(Tools.trim(rgbVal));
+ },
+
+ /**
+ * Executes the specified function on the element by id or dom element node or array of elements/id.
+ *
+ * @method run
+ * @param {String/Element/Array} elm ID or DOM element object or array with ids or elements.
+ * @param {function} func Function to execute for each item.
+ * @param {Object} scope Optional scope to execute the function in.
+ * @return {Object/Array} Single object, or an array of objects if multiple input elements were passed in.
+ */
+ run: function (elm, func, scope) {
+ var self = this, result;
+
+ if (typeof elm === 'string') {
+ elm = self.get(elm);
+ }
+
+ if (!elm) {
+ return false;
+ }
+
+ scope = scope || this;
+ if (!elm.nodeType && (elm.length || elm.length === 0)) {
+ result = [];
+
+ each(elm, function (elm, i) {
+ if (elm) {
+ if (typeof elm == 'string') {
+ elm = self.get(elm);
+ }
+
+ result.push(func.call(scope, elm, i));
+ }
+ });
+
+ return result;
+ }
+
+ return func.call(scope, elm);
+ },
+
+ /**
+ * Returns a NodeList with attributes for the element.
+ *
+ * @method getAttribs
+ * @param {HTMLElement/string} elm Element node or string id to get attributes from.
+ * @return {NodeList} NodeList with attributes.
+ */
+ getAttribs: function (elm) {
+ var attrs;
+
+ elm = this.get(elm);
+
+ if (!elm) {
+ return [];
+ }
+
+ if (isIE) {
+ attrs = [];
+
+ // Object will throw exception in IE
+ if (elm.nodeName == 'OBJECT') {
+ return elm.attributes;
+ }
+
+ // IE doesn't keep the selected attribute if you clone option elements
+ if (elm.nodeName === 'OPTION' && this.getAttrib(elm, 'selected')) {
+ attrs.push({ specified: 1, nodeName: 'selected' });
+ }
+
+ // It's crazy that this is faster in IE but it's because it returns all attributes all the time
+ var attrRegExp = /<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi;
+ elm.cloneNode(false).outerHTML.replace(attrRegExp, '').replace(/[\w:\-]+/gi, function (a) {
+ attrs.push({ specified: 1, nodeName: a });
+ });
+
+ return attrs;
+ }
+
+ return elm.attributes;
+ },
+
+ /**
+ * Returns true/false if the specified node is to be considered empty or not.
+ *
+ * @example
+ * tinymce.DOM.isEmpty(node, {img: true});
+ * @method isEmpty
+ * @param {Object} elements Optional name/value object with elements that are automatically treated as non-empty elements.
+ * @return {Boolean} true/false if the node is empty or not.
+ */
+ isEmpty: function (node, elements) {
+ var self = this, i, attributes, type, whitespace, walker, name, brCount = 0;
+
+ node = node.firstChild;
+ if (node) {
+ walker = new TreeWalker(node, node.parentNode);
+ elements = elements || (self.schema ? self.schema.getNonEmptyElements() : null);
+ whitespace = self.schema ? self.schema.getWhiteSpaceElements() : {};
+
+ do {
+ type = node.nodeType;
+
+ if (type === 1) {
+ // Ignore bogus elements
+ var bogusVal = node.getAttribute('data-mce-bogus');
+ if (bogusVal) {
+ node = walker.next(bogusVal === 'all');
+ continue;
+ }
+
+ // Keep empty elements like
+ name = node.nodeName.toLowerCase();
+ if (elements && elements[name]) {
+ // Ignore single BR elements in blocks like
or
+ if (name === 'br') {
+ brCount++;
+ node = walker.next();
+ continue;
+ }
+
+ return false;
+ }
+
+ // Keep elements with data-bookmark attributes or name attribute like
+ attributes = self.getAttribs(node);
+ i = attributes.length;
+ while (i--) {
+ name = attributes[i].nodeName;
+ if (name === "name" || name === 'data-mce-bookmark') {
+ return false;
+ }
+ }
+ }
+
+ // Keep comment nodes
+ if (type == 8) {
+ return false;
+ }
+
+ // Keep non whitespace text nodes
+ if (type === 3 && !whiteSpaceRegExp.test(node.nodeValue)) {
+ return false;
+ }
+
+ // Keep whitespace preserve elements
+ if (type === 3 && node.parentNode && whitespace[node.parentNode.nodeName] && whiteSpaceRegExp.test(node.nodeValue)) {
+ return false;
+ }
+
+ node = walker.next();
+ } while (node);
+ }
+
+ return brCount <= 1;
+ },
+
+ /**
+ * Creates a new DOM Range object. This will use the native DOM Range API if it's
+ * available. If it's not, it will fall back to the custom TinyMCE implementation.
+ *
+ * @method createRng
+ * @return {DOMRange} DOM Range object.
+ * @example
+ * var rng = tinymce.DOM.createRng();
+ * alert(rng.startContainer + "," + rng.startOffset);
+ */
+ createRng: function () {
+ return this.doc.createRange();
+ },
+
+ /**
+ * Returns the index of the specified node within its parent.
+ *
+ * @method nodeIndex
+ * @param {Node} node Node to look for.
+ * @param {boolean} normalized Optional true/false state if the index is what it would be after a normalization.
+ * @return {Number} Index of the specified node.
+ */
+ nodeIndex: nodeIndex,
+
+ /**
+ * Splits an element into two new elements and places the specified split
+ * element or elements between the new ones. For example splitting the paragraph at the bold element in
+ * this example
abcabc123
would produce
abc
abc
123
.
+ *
+ * @method split
+ * @param {Element} parentElm Parent element to split.
+ * @param {Element} splitElm Element to split at.
+ * @param {Element} replacementElm Optional replacement element to replace the split element with.
+ * @return {Element} Returns the split element or the replacement element if that is specified.
+ */
+ split: function (parentElm, splitElm, replacementElm) {
+ var self = this, r = self.createRng(), bef, aft, pa;
+
+ if (parentElm && splitElm) {
+ // Get before chunk
+ r.setStart(parentElm.parentNode, self.nodeIndex(parentElm));
+ r.setEnd(splitElm.parentNode, self.nodeIndex(splitElm));
+ bef = r.extractContents();
+
+ // Get after chunk
+ r = self.createRng();
+ r.setStart(splitElm.parentNode, self.nodeIndex(splitElm) + 1);
+ r.setEnd(parentElm.parentNode, self.nodeIndex(parentElm) + 1);
+ aft = r.extractContents();
+
+ // Insert before chunk
+ pa = parentElm.parentNode;
+ pa.insertBefore(TrimNode.trimNode(self, bef), parentElm);
+
+ // Insert middle chunk
+ if (replacementElm) {
+ pa.insertBefore(replacementElm, parentElm);
+ //pa.replaceChild(replacementElm, splitElm);
+ } else {
+ pa.insertBefore(splitElm, parentElm);
+ }
+
+ // Insert after chunk
+ pa.insertBefore(TrimNode.trimNode(self, aft), parentElm);
+ self.remove(parentElm);
+
+ return replacementElm || splitElm;
+ }
+ },
+
+ /**
+ * Adds an event handler to the specified object.
+ *
+ * @method bind
+ * @param {Element/Document/Window/Array} target Target element to bind events to.
+ * handler to or an array of elements/ids/documents.
+ * @param {String} name Name of event handler to add, for example: click.
+ * @param {function} func Function to execute when the event occurs.
+ * @param {Object} scope Optional scope to execute the function in.
+ * @return {function} Function callback handler the same as the one passed in.
+ */
+ bind: function (target, name, func, scope) {
+ var self = this;
+
+ if (Tools.isArray(target)) {
+ var i = target.length;
+
+ while (i--) {
+ target[i] = self.bind(target[i], name, func, scope);
+ }
+
+ return target;
+ }
+
+ // Collect all window/document events bound by editor instance
+ if (self.settings.collect && (target === self.doc || target === self.win)) {
+ self.boundEvents.push([target, name, func, scope]);
+ }
+
+ return self.events.bind(target, name, func, scope || self);
+ },
+
+ /**
+ * Removes the specified event handler by name and function from an element or collection of elements.
+ *
+ * @method unbind
+ * @param {Element/Document/Window/Array} target Target element to unbind events on.
+ * @param {String} name Event handler name, for example: "click"
+ * @param {function} func Function to remove.
+ * @return {bool/Array} Bool state of true if the handler was removed, or an array of states if multiple input elements
+ * were passed in.
+ */
+ unbind: function (target, name, func) {
+ var self = this, i;
+
+ if (Tools.isArray(target)) {
+ i = target.length;
+
+ while (i--) {
+ target[i] = self.unbind(target[i], name, func);
+ }
+
+ return target;
+ }
+
+ // Remove any bound events matching the input
+ if (self.boundEvents && (target === self.doc || target === self.win)) {
+ i = self.boundEvents.length;
+
+ while (i--) {
+ var item = self.boundEvents[i];
+
+ if (target == item[0] && (!name || name == item[1]) && (!func || func == item[2])) {
+ this.events.unbind(item[0], item[1], item[2]);
+ }
+ }
+ }
+
+ return this.events.unbind(target, name, func);
+ },
+
+ /**
+ * Fires the specified event name with object on target.
+ *
+ * @method fire
+ * @param {Node/Document/Window} target Target element or object to fire event on.
+ * @param {String} name Name of the event to fire.
+ * @param {Object} evt Event object to send.
+ * @return {Event} Event object.
+ */
+ fire: function (target, name, evt) {
+ return this.events.fire(target, name, evt);
+ },
+
+ // Returns the content editable state of a node
+ getContentEditable: function (node) {
+ var contentEditable;
+
+ // Check type
+ if (!node || node.nodeType != 1) {
+ return null;
+ }
+
+ // Check for fake content editable
+ contentEditable = node.getAttribute("data-mce-contenteditable");
+ if (contentEditable && contentEditable !== "inherit") {
+ return contentEditable;
+ }
+
+ // Check for real content editable
+ return node.contentEditable !== "inherit" ? node.contentEditable : null;
+ },
+
+ getContentEditableParent: function (node) {
+ var root = this.getRoot(), state = null;
+
+ for (; node && node !== root; node = node.parentNode) {
+ state = this.getContentEditable(node);
+
+ if (state !== null) {
+ break;
+ }
+ }
+
+ return state;
+ },
+
+ /**
+ * Destroys all internal references to the DOM to solve IE leak issues.
+ *
+ * @method destroy
+ */
+ destroy: function () {
+ var self = this;
+
+ // Unbind all events bound to window/document by editor instance
+ if (self.boundEvents) {
+ var i = self.boundEvents.length;
+
+ while (i--) {
+ var item = self.boundEvents[i];
+ this.events.unbind(item[0], item[1], item[2]);
+ }
+
+ self.boundEvents = null;
+ }
+
+ // Restore sizzle document to window.document
+ // Since the current document might be removed producing "Permission denied" on IE see #6325
+ if (Sizzle.setDocument) {
+ Sizzle.setDocument();
+ }
+
+ self.win = self.doc = self.root = self.events = self.frag = null;
+ },
+
+ isChildOf: function (node, parent) {
+ while (node) {
+ if (parent === node) {
+ return true;
+ }
+
+ node = node.parentNode;
+ }
+
+ return false;
+ },
+
+ // #ifdef debug
+
+ dumpRng: function (r) {
+ return (
+ 'startContainer: ' + r.startContainer.nodeName +
+ ', startOffset: ' + r.startOffset +
+ ', endContainer: ' + r.endContainer.nodeName +
+ ', endOffset: ' + r.endOffset
+ );
+ },
+
+ // #endif
+
+ _findSib: function (node, selector, name) {
+ var self = this, func = selector;
+
+ if (node) {
+ // If expression make a function of it using is
+ if (typeof func == 'string') {
+ func = function (node) {
+ return self.is(node, selector);
+ };
+ }
+
+ // Loop all siblings
+ for (node = node[name]; node; node = node[name]) {
+ if (func(node)) {
+ return node;
+ }
+ }
+ }
+
+ return null;
+ }
+ };
+
+ /**
+ * Instance of DOMUtils for the current document.
+ *
+ * @static
+ * @property DOM
+ * @type tinymce.dom.DOMUtils
+ * @example
+ * // Example of how to add a class to some element by id
+ * tinymce.DOM.addClass('someid', 'someclass');
+ */
+ DOMUtils.DOM = new DOMUtils(document);
+ DOMUtils.nodeIndex = nodeIndex;
+
+ return DOMUtils;
+ }
+);
+
+/**
+ * ScriptLoader.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/*globals console*/
+
+/**
+ * This class handles asynchronous/synchronous loading of JavaScript files it will execute callbacks
+ * when various items gets loaded. This class is useful to load external JavaScript files.
+ *
+ * @class tinymce.dom.ScriptLoader
+ * @example
+ * // Load a script from a specific URL using the global script loader
+ * tinymce.ScriptLoader.load('somescript.js');
+ *
+ * // Load a script using a unique instance of the script loader
+ * var scriptLoader = new tinymce.dom.ScriptLoader();
+ *
+ * scriptLoader.load('somescript.js');
+ *
+ * // Load multiple scripts
+ * var scriptLoader = new tinymce.dom.ScriptLoader();
+ *
+ * scriptLoader.add('somescript1.js');
+ * scriptLoader.add('somescript2.js');
+ * scriptLoader.add('somescript3.js');
+ *
+ * scriptLoader.loadQueue(function() {
+ * alert('All scripts are now loaded.');
+ * });
+ */
+define(
+ 'tinymce.core.dom.ScriptLoader',
+ [
+ 'global!document',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.util.Tools'
+ ],
+ function (document, DOMUtils, Tools) {
+ var DOM = DOMUtils.DOM;
+ var each = Tools.each, grep = Tools.grep;
+
+ var isFunction = function (f) {
+ return typeof f === 'function';
+ };
+
+ var ScriptLoader = function () {
+ var QUEUED = 0,
+ LOADING = 1,
+ LOADED = 2,
+ FAILED = 3,
+ states = {},
+ queue = [],
+ scriptLoadedCallbacks = {},
+ queueLoadedCallbacks = [],
+ loading = 0,
+ undef;
+
+ /**
+ * Loads a specific script directly without adding it to the load queue.
+ *
+ * @method load
+ * @param {String} url Absolute URL to script to add.
+ * @param {function} callback Optional success callback function when the script loaded successfully.
+ * @param {function} callback Optional failure callback function when the script failed to load.
+ */
+ var loadScript = function (url, success, failure) {
+ var dom = DOM, elm, id;
+
+ // Execute callback when script is loaded
+ var done = function () {
+ dom.remove(id);
+
+ if (elm) {
+ elm.onreadystatechange = elm.onload = elm = null;
+ }
+
+ success();
+ };
+
+ var error = function () {
+ /*eslint no-console:0 */
+
+ // We can't mark it as done if there is a load error since
+ // A) We don't want to produce 404 errors on the server and
+ // B) the onerror event won't fire on all browsers.
+ // done();
+
+ if (isFunction(failure)) {
+ failure();
+ } else {
+ // Report the error so it's easier for people to spot loading errors
+ if (typeof console !== "undefined" && console.log) {
+ console.log("Failed to load script: " + url);
+ }
+ }
+ };
+
+ id = dom.uniqueId();
+
+ // Create new script element
+ elm = document.createElement('script');
+ elm.id = id;
+ elm.type = 'text/javascript';
+ elm.src = Tools._addCacheSuffix(url);
+
+ // Seems that onreadystatechange works better on IE 10 onload seems to fire incorrectly
+ if ("onreadystatechange" in elm) {
+ elm.onreadystatechange = function () {
+ if (/loaded|complete/.test(elm.readyState)) {
+ done();
+ }
+ };
+ } else {
+ elm.onload = done;
+ }
+
+ // Add onerror event will get fired on some browsers but not all of them
+ elm.onerror = error;
+
+ // Add script to document
+ (document.getElementsByTagName('head')[0] || document.body).appendChild(elm);
+ };
+
+ /**
+ * Returns true/false if a script has been loaded or not.
+ *
+ * @method isDone
+ * @param {String} url URL to check for.
+ * @return {Boolean} true/false if the URL is loaded.
+ */
+ this.isDone = function (url) {
+ return states[url] == LOADED;
+ };
+
+ /**
+ * Marks a specific script to be loaded. This can be useful if a script got loaded outside
+ * the script loader or to skip it from loading some script.
+ *
+ * @method markDone
+ * @param {string} url Absolute URL to the script to mark as loaded.
+ */
+ this.markDone = function (url) {
+ states[url] = LOADED;
+ };
+
+ /**
+ * Adds a specific script to the load queue of the script loader.
+ *
+ * @method add
+ * @param {String} url Absolute URL to script to add.
+ * @param {function} success Optional success callback function to execute when the script loades successfully.
+ * @param {Object} scope Optional scope to execute callback in.
+ * @param {function} failure Optional failure callback function to execute when the script failed to load.
+ */
+ this.add = this.load = function (url, success, scope, failure) {
+ var state = states[url];
+
+ // Add url to load queue
+ if (state == undef) {
+ queue.push(url);
+ states[url] = QUEUED;
+ }
+
+ if (success) {
+ // Store away callback for later execution
+ if (!scriptLoadedCallbacks[url]) {
+ scriptLoadedCallbacks[url] = [];
+ }
+
+ scriptLoadedCallbacks[url].push({
+ success: success,
+ failure: failure,
+ scope: scope || this
+ });
+ }
+ };
+
+ this.remove = function (url) {
+ delete states[url];
+ delete scriptLoadedCallbacks[url];
+ };
+
+ /**
+ * Starts the loading of the queue.
+ *
+ * @method loadQueue
+ * @param {function} success Optional callback to execute when all queued items are loaded.
+ * @param {function} failure Optional callback to execute when queued items failed to load.
+ * @param {Object} scope Optional scope to execute the callback in.
+ */
+ this.loadQueue = function (success, scope, failure) {
+ this.loadScripts(queue, success, scope, failure);
+ };
+
+ /**
+ * Loads the specified queue of files and executes the callback ones they are loaded.
+ * This method is generally not used outside this class but it might be useful in some scenarios.
+ *
+ * @method loadScripts
+ * @param {Array} scripts Array of queue items to load.
+ * @param {function} callback Optional callback to execute when scripts is loaded successfully.
+ * @param {Object} scope Optional scope to execute callback in.
+ * @param {function} callback Optional callback to execute if scripts failed to load.
+ */
+ this.loadScripts = function (scripts, success, scope, failure) {
+ var loadScripts, failures = [];
+
+ var execCallbacks = function (name, url) {
+ // Execute URL callback functions
+ each(scriptLoadedCallbacks[url], function (callback) {
+ if (isFunction(callback[name])) {
+ callback[name].call(callback.scope);
+ }
+ });
+
+ scriptLoadedCallbacks[url] = undef;
+ };
+
+ queueLoadedCallbacks.push({
+ success: success,
+ failure: failure,
+ scope: scope || this
+ });
+
+ loadScripts = function () {
+ var loadingScripts = grep(scripts);
+
+ // Current scripts has been handled
+ scripts.length = 0;
+
+ // Load scripts that needs to be loaded
+ each(loadingScripts, function (url) {
+ // Script is already loaded then execute script callbacks directly
+ if (states[url] === LOADED) {
+ execCallbacks('success', url);
+ return;
+ }
+
+ if (states[url] === FAILED) {
+ execCallbacks('failure', url);
+ return;
+ }
+
+ // Is script not loading then start loading it
+ if (states[url] !== LOADING) {
+ states[url] = LOADING;
+ loading++;
+
+ loadScript(url, function () {
+ states[url] = LOADED;
+ loading--;
+
+ execCallbacks('success', url);
+
+ // Load more scripts if they where added by the recently loaded script
+ loadScripts();
+ }, function () {
+ states[url] = FAILED;
+ loading--;
+
+ failures.push(url);
+ execCallbacks('failure', url);
+
+ // Load more scripts if they where added by the recently loaded script
+ loadScripts();
+ });
+ }
+ });
+
+ // No scripts are currently loading then execute all pending queue loaded callbacks
+ if (!loading) {
+ // We need to clone the notifications and empty the pending callbacks so that callbacks can load more resources
+ var notifyCallbacks = queueLoadedCallbacks.slice(0);
+ queueLoadedCallbacks.length = 0;
+
+ each(notifyCallbacks, function (callback) {
+ if (failures.length === 0) {
+ if (isFunction(callback.success)) {
+ callback.success.call(callback.scope);
+ }
+ } else {
+ if (isFunction(callback.failure)) {
+ callback.failure.call(callback.scope, failures);
+ }
+ }
+ });
+ }
+ };
+
+ loadScripts();
+ };
+ };
+
+ ScriptLoader.ScriptLoader = new ScriptLoader();
+
+ return ScriptLoader;
+ }
+);
+
+/**
+ * AddOnManager.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class handles the loading of themes/plugins or other add-ons and their language packs.
+ *
+ * @class tinymce.AddOnManager
+ */
+define(
+ 'tinymce.core.AddOnManager',
+ [
+ 'ephox.katamari.api.Arr',
+ 'tinymce.core.dom.ScriptLoader',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Arr, ScriptLoader, Tools) {
+ var each = Tools.each;
+
+ var AddOnManager = function () {
+ var self = this;
+
+ self.items = [];
+ self.urls = {};
+ self.lookup = {};
+ self._listeners = [];
+ };
+
+ AddOnManager.prototype = {
+ /**
+ * Returns the specified add on by the short name.
+ *
+ * @method get
+ * @param {String} name Add-on to look for.
+ * @return {tinymce.Theme/tinymce.Plugin} Theme or plugin add-on instance or undefined.
+ */
+ get: function (name) {
+ if (this.lookup[name]) {
+ return this.lookup[name].instance;
+ }
+
+ return undefined;
+ },
+
+ dependencies: function (name) {
+ var result;
+
+ if (this.lookup[name]) {
+ result = this.lookup[name].dependencies;
+ }
+
+ return result || [];
+ },
+
+ /**
+ * Loads a language pack for the specified add-on.
+ *
+ * @method requireLangPack
+ * @param {String} name Short name of the add-on.
+ * @param {String} languages Optional comma or space separated list of languages to check if it matches the name.
+ */
+ requireLangPack: function (name, languages) {
+ var language = AddOnManager.language;
+
+ if (language && AddOnManager.languageLoad !== false) {
+ if (languages) {
+ languages = ',' + languages + ',';
+
+ // Load short form sv.js or long form sv_SE.js
+ if (languages.indexOf(',' + language.substr(0, 2) + ',') != -1) {
+ language = language.substr(0, 2);
+ } else if (languages.indexOf(',' + language + ',') == -1) {
+ return;
+ }
+ }
+
+ ScriptLoader.ScriptLoader.add(this.urls[name] + '/langs/' + language + '.js');
+ }
+ },
+
+ /**
+ * Adds a instance of the add-on by it's short name.
+ *
+ * @method add
+ * @param {String} id Short name/id for the add-on.
+ * @param {tinymce.Theme/tinymce.Plugin} addOn Theme or plugin to add.
+ * @return {tinymce.Theme/tinymce.Plugin} The same theme or plugin instance that got passed in.
+ * @example
+ * // Create a simple plugin
+ * tinymce.create('tinymce.plugins.TestPlugin', {
+ * TestPlugin: function(ed, url) {
+ * ed.on('click', function(e) {
+ * ed.windowManager.alert('Hello World!');
+ * });
+ * }
+ * });
+ *
+ * // Register plugin using the add method
+ * tinymce.PluginManager.add('test', tinymce.plugins.TestPlugin);
+ *
+ * // Initialize TinyMCE
+ * tinymce.init({
+ * ...
+ * plugins: '-test' // Init the plugin but don't try to load it
+ * });
+ */
+ add: function (id, addOn, dependencies) {
+ this.items.push(addOn);
+ this.lookup[id] = { instance: addOn, dependencies: dependencies };
+ var result = Arr.partition(this._listeners, function (listener) {
+ return listener.name === id;
+ });
+
+ this._listeners = result.fail;
+
+ each(result.pass, function (listener) {
+ listener.callback();
+ });
+
+ return addOn;
+ },
+
+ remove: function (name) {
+ delete this.urls[name];
+ delete this.lookup[name];
+ },
+
+ createUrl: function (baseUrl, dep) {
+ if (typeof dep === "object") {
+ return dep;
+ }
+
+ return { prefix: baseUrl.prefix, resource: dep, suffix: baseUrl.suffix };
+ },
+
+ /**
+ * Add a set of components that will make up the add-on. Using the url of the add-on name as the base url.
+ * This should be used in development mode. A new compressor/javascript munger process will ensure that the
+ * components are put together into the plugin.js file and compressed correctly.
+ *
+ * @method addComponents
+ * @param {String} pluginName name of the plugin to load scripts from (will be used to get the base url for the plugins).
+ * @param {Array} scripts Array containing the names of the scripts to load.
+ */
+ addComponents: function (pluginName, scripts) {
+ var pluginUrl = this.urls[pluginName];
+
+ each(scripts, function (script) {
+ ScriptLoader.ScriptLoader.add(pluginUrl + "/" + script);
+ });
+ },
+
+ /**
+ * Loads an add-on from a specific url.
+ *
+ * @method load
+ * @param {String} name Short name of the add-on that gets loaded.
+ * @param {String} addOnUrl URL to the add-on that will get loaded.
+ * @param {function} success Optional success callback to execute when an add-on is loaded.
+ * @param {Object} scope Optional scope to execute the callback in.
+ * @param {function} failure Optional failure callback to execute when an add-on failed to load.
+ * @example
+ * // Loads a plugin from an external URL
+ * tinymce.PluginManager.load('myplugin', '/some/dir/someplugin/plugin.js');
+ *
+ * // Initialize TinyMCE
+ * tinymce.init({
+ * ...
+ * plugins: '-myplugin' // Don't try to load it again
+ * });
+ */
+ load: function (name, addOnUrl, success, scope, failure) {
+ var self = this, url = addOnUrl;
+
+ var loadDependencies = function () {
+ var dependencies = self.dependencies(name);
+
+ each(dependencies, function (dep) {
+ var newUrl = self.createUrl(addOnUrl, dep);
+
+ self.load(newUrl.resource, newUrl, undefined, undefined);
+ });
+
+ if (success) {
+ if (scope) {
+ success.call(scope);
+ } else {
+ success.call(ScriptLoader);
+ }
+ }
+ };
+
+ if (self.urls[name]) {
+ return;
+ }
+
+ if (typeof addOnUrl === "object") {
+ url = addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix;
+ }
+
+ if (url.indexOf('/') !== 0 && url.indexOf('://') == -1) {
+ url = AddOnManager.baseURL + '/' + url;
+ }
+
+ self.urls[name] = url.substring(0, url.lastIndexOf('/'));
+
+ if (self.lookup[name]) {
+ loadDependencies();
+ } else {
+ ScriptLoader.ScriptLoader.add(url, loadDependencies, scope, failure);
+ }
+ },
+
+ waitFor: function (name, callback) {
+ if (this.lookup.hasOwnProperty(name)) {
+ callback();
+ } else {
+ this._listeners.push({ name: name, callback: callback });
+ }
+ }
+ };
+
+ AddOnManager.PluginManager = new AddOnManager();
+ AddOnManager.ThemeManager = new AddOnManager();
+
+ return AddOnManager;
+ }
+);
+
+/**
+ * TinyMCE theme class.
+ *
+ * @class tinymce.Theme
+ */
+
+/**
+ * This method is responsible for rendering/generating the overall user interface with toolbars, buttons, iframe containers etc.
+ *
+ * @method renderUI
+ * @param {Object} obj Object parameter containing the targetNode DOM node that will be replaced visually with an editor instance.
+ * @return {Object} an object with items like iframeContainer, editorContainer, sizeContainer, deltaWidth, deltaHeight.
+ */
+
+/**
+ * Plugin base class, this is a pseudo class that describes how a plugin is to be created for TinyMCE. The methods below are all optional.
+ *
+ * @class tinymce.Plugin
+ * @example
+ * tinymce.PluginManager.add('example', function(editor, url) {
+ * // Add a button that opens a window
+ * editor.addButton('example', {
+ * text: 'My button',
+ * icon: false,
+ * onclick: function() {
+ * // Open window
+ * editor.windowManager.open({
+ * title: 'Example plugin',
+ * body: [
+ * {type: 'textbox', name: 'title', label: 'Title'}
+ * ],
+ * onsubmit: function(e) {
+ * // Insert content when the window form is submitted
+ * editor.insertContent('Title: ' + e.data.title);
+ * }
+ * });
+ * }
+ * });
+ *
+ * // Adds a menu item to the tools menu
+ * editor.addMenuItem('example', {
+ * text: 'Example plugin',
+ * context: 'tools',
+ * onclick: function() {
+ * // Open window with a specific url
+ * editor.windowManager.open({
+ * title: 'TinyMCE site',
+ * url: 'http://www.tinymce.com',
+ * width: 800,
+ * height: 600,
+ * buttons: [{
+ * text: 'Close',
+ * onclick: 'close'
+ * }]
+ * });
+ * }
+ * });
+ * });
+ */
+
+/**
+ * Zwsp.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Utility functions for working with zero width space
+ * characters used as character containers etc.
+ *
+ * @private
+ * @class tinymce.text.Zwsp
+ * @example
+ * var isZwsp = Zwsp.isZwsp('\uFEFF');
+ * var abc = Zwsp.trim('a\uFEFFc');
+ */
+define(
+ 'tinymce.core.text.Zwsp',
+ [
+ ],
+ function () {
+ // This is technically not a ZWSP but a ZWNBSP or a BYTE ORDER MARK it used to be a ZWSP
+ var ZWSP = '\uFEFF';
+
+ var isZwsp = function (chr) {
+ return chr === ZWSP;
+ };
+
+ var trim = function (text) {
+ return text.replace(new RegExp(ZWSP, 'g'), '');
+ };
+
+ return {
+ isZwsp: isZwsp,
+ ZWSP: ZWSP,
+ trim: trim
+ };
+ }
+);
+/**
+ * CaretContainer.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module handles caret containers. A caret container is a node that
+ * holds the caret for positional purposes.
+ *
+ * @private
+ * @class tinymce.caret.CaretContainer
+ */
+define(
+ 'tinymce.core.caret.CaretContainer',
+ [
+ 'global!document',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.text.Zwsp'
+ ],
+ function (document, NodeType, Zwsp) {
+ var isElement = NodeType.isElement,
+ isText = NodeType.isText;
+
+ var isCaretContainerBlock = function (node) {
+ if (isText(node)) {
+ node = node.parentNode;
+ }
+
+ return isElement(node) && node.hasAttribute('data-mce-caret');
+ };
+
+ var isCaretContainerInline = function (node) {
+ return isText(node) && Zwsp.isZwsp(node.data);
+ };
+
+ var isCaretContainer = function (node) {
+ return isCaretContainerBlock(node) || isCaretContainerInline(node);
+ };
+
+ var hasContent = function (node) {
+ return node.firstChild !== node.lastChild || !NodeType.isBr(node.firstChild);
+ };
+
+ var insertInline = function (node, before) {
+ var doc, sibling, textNode, parentNode;
+
+ doc = node.ownerDocument;
+ textNode = doc.createTextNode(Zwsp.ZWSP);
+ parentNode = node.parentNode;
+
+ if (!before) {
+ sibling = node.nextSibling;
+ if (isText(sibling)) {
+ if (isCaretContainer(sibling)) {
+ return sibling;
+ }
+
+ if (startsWithCaretContainer(sibling)) {
+ sibling.splitText(1);
+ return sibling;
+ }
+ }
+
+ if (node.nextSibling) {
+ parentNode.insertBefore(textNode, node.nextSibling);
+ } else {
+ parentNode.appendChild(textNode);
+ }
+ } else {
+ sibling = node.previousSibling;
+ if (isText(sibling)) {
+ if (isCaretContainer(sibling)) {
+ return sibling;
+ }
+
+ if (endsWithCaretContainer(sibling)) {
+ return sibling.splitText(sibling.data.length - 1);
+ }
+ }
+
+ parentNode.insertBefore(textNode, node);
+ }
+
+ return textNode;
+ };
+
+ var prependInline = function (node) {
+ if (NodeType.isText(node)) {
+ var data = node.data;
+ if (data.length > 0 && data.charAt(0) !== Zwsp.ZWSP) {
+ node.insertData(0, Zwsp.ZWSP);
+ }
+ return node;
+ } else {
+ return null;
+ }
+ };
+
+ var appendInline = function (node) {
+ if (NodeType.isText(node)) {
+ var data = node.data;
+ if (data.length > 0 && data.charAt(data.length - 1) !== Zwsp.ZWSP) {
+ node.insertData(data.length, Zwsp.ZWSP);
+ }
+ return node;
+ } else {
+ return null;
+ }
+ };
+
+ var isBeforeInline = function (pos) {
+ return pos && NodeType.isText(pos.container()) && pos.container().data.charAt(pos.offset()) === Zwsp.ZWSP;
+ };
+
+ var isAfterInline = function (pos) {
+ return pos && NodeType.isText(pos.container()) && pos.container().data.charAt(pos.offset() - 1) === Zwsp.ZWSP;
+ };
+
+ var createBogusBr = function () {
+ var br = document.createElement('br');
+ br.setAttribute('data-mce-bogus', '1');
+ return br;
+ };
+
+ var insertBlock = function (blockName, node, before) {
+ var doc, blockNode, parentNode;
+
+ doc = node.ownerDocument;
+ blockNode = doc.createElement(blockName);
+ blockNode.setAttribute('data-mce-caret', before ? 'before' : 'after');
+ blockNode.setAttribute('data-mce-bogus', 'all');
+ blockNode.appendChild(createBogusBr());
+ parentNode = node.parentNode;
+
+ if (!before) {
+ if (node.nextSibling) {
+ parentNode.insertBefore(blockNode, node.nextSibling);
+ } else {
+ parentNode.appendChild(blockNode);
+ }
+ } else {
+ parentNode.insertBefore(blockNode, node);
+ }
+
+ return blockNode;
+ };
+
+ var startsWithCaretContainer = function (node) {
+ return isText(node) && node.data[0] == Zwsp.ZWSP;
+ };
+
+ var endsWithCaretContainer = function (node) {
+ return isText(node) && node.data[node.data.length - 1] == Zwsp.ZWSP;
+ };
+
+ var trimBogusBr = function (elm) {
+ var brs = elm.getElementsByTagName('br');
+ var lastBr = brs[brs.length - 1];
+ if (NodeType.isBogus(lastBr)) {
+ lastBr.parentNode.removeChild(lastBr);
+ }
+ };
+
+ var showCaretContainerBlock = function (caretContainer) {
+ if (caretContainer && caretContainer.hasAttribute('data-mce-caret')) {
+ trimBogusBr(caretContainer);
+ caretContainer.removeAttribute('data-mce-caret');
+ caretContainer.removeAttribute('data-mce-bogus');
+ caretContainer.removeAttribute('style');
+ caretContainer.removeAttribute('_moz_abspos');
+ return caretContainer;
+ }
+
+ return null;
+ };
+
+ return {
+ isCaretContainer: isCaretContainer,
+ isCaretContainerBlock: isCaretContainerBlock,
+ isCaretContainerInline: isCaretContainerInline,
+ showCaretContainerBlock: showCaretContainerBlock,
+ insertInline: insertInline,
+ prependInline: prependInline,
+ appendInline: appendInline,
+ isBeforeInline: isBeforeInline,
+ isAfterInline: isAfterInline,
+ insertBlock: insertBlock,
+ hasContent: hasContent,
+ startsWithCaretContainer: startsWithCaretContainer,
+ endsWithCaretContainer: endsWithCaretContainer
+ };
+ }
+);
+/**
+ * CaretCandidate.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module contains logic for handling caret candidates. A caret candidate is
+ * for example text nodes, images, input elements, cE=false elements etc.
+ *
+ * @private
+ * @class tinymce.caret.CaretCandidate
+ */
+define(
+ 'tinymce.core.caret.CaretCandidate',
+ [
+ "tinymce.core.dom.NodeType",
+ "tinymce.core.util.Arr",
+ "tinymce.core.caret.CaretContainer"
+ ],
+ function (NodeType, Arr, CaretContainer) {
+ var isContentEditableTrue = NodeType.isContentEditableTrue,
+ isContentEditableFalse = NodeType.isContentEditableFalse,
+ isBr = NodeType.isBr,
+ isText = NodeType.isText,
+ isInvalidTextElement = NodeType.matchNodeNames('script style textarea'),
+ isAtomicInline = NodeType.matchNodeNames('img input textarea hr iframe video audio object'),
+ isTable = NodeType.matchNodeNames('table'),
+ isCaretContainer = CaretContainer.isCaretContainer;
+
+ var isCaretCandidate = function (node) {
+ if (isCaretContainer(node)) {
+ return false;
+ }
+
+ if (isText(node)) {
+ if (isInvalidTextElement(node.parentNode)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ return isAtomicInline(node) || isBr(node) || isTable(node) || isContentEditableFalse(node);
+ };
+
+ var isInEditable = function (node, rootNode) {
+ for (node = node.parentNode; node && node != rootNode; node = node.parentNode) {
+ if (isContentEditableFalse(node)) {
+ return false;
+ }
+
+ if (isContentEditableTrue(node)) {
+ return true;
+ }
+ }
+
+ return true;
+ };
+
+ var isAtomicContentEditableFalse = function (node) {
+ if (!isContentEditableFalse(node)) {
+ return false;
+ }
+
+ return Arr.reduce(node.getElementsByTagName('*'), function (result, elm) {
+ return result || isContentEditableTrue(elm);
+ }, false) !== true;
+ };
+
+ var isAtomic = function (node) {
+ return isAtomicInline(node) || isAtomicContentEditableFalse(node);
+ };
+
+ var isEditableCaretCandidate = function (node, rootNode) {
+ return isCaretCandidate(node) && isInEditable(node, rootNode);
+ };
+
+ return {
+ isCaretCandidate: isCaretCandidate,
+ isInEditable: isInEditable,
+ isAtomic: isAtomic,
+ isEditableCaretCandidate: isEditableCaretCandidate
+ };
+ }
+);
+/**
+ * ClientRect.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Utility functions for working with client rects.
+ *
+ * @private
+ * @class tinymce.geom.ClientRect
+ */
+define(
+ 'tinymce.core.geom.ClientRect',
+ [
+ ],
+ function () {
+ var round = Math.round;
+
+ var clone = function (rect) {
+ if (!rect) {
+ return { left: 0, top: 0, bottom: 0, right: 0, width: 0, height: 0 };
+ }
+
+ return {
+ left: round(rect.left),
+ top: round(rect.top),
+ bottom: round(rect.bottom),
+ right: round(rect.right),
+ width: round(rect.width),
+ height: round(rect.height)
+ };
+ };
+
+ var collapse = function (clientRect, toStart) {
+ clientRect = clone(clientRect);
+
+ if (toStart) {
+ clientRect.right = clientRect.left;
+ } else {
+ clientRect.left = clientRect.left + clientRect.width;
+ clientRect.right = clientRect.left;
+ }
+
+ clientRect.width = 0;
+
+ return clientRect;
+ };
+
+ var isEqual = function (rect1, rect2) {
+ return (
+ rect1.left === rect2.left &&
+ rect1.top === rect2.top &&
+ rect1.bottom === rect2.bottom &&
+ rect1.right === rect2.right
+ );
+ };
+
+ var isValidOverflow = function (overflowY, clientRect1, clientRect2) {
+ return overflowY >= 0 && overflowY <= Math.min(clientRect1.height, clientRect2.height) / 2;
+
+ };
+
+ var isAbove = function (clientRect1, clientRect2) {
+ if ((clientRect1.bottom - clientRect1.height / 2) < clientRect2.top) {
+ return true;
+ }
+
+ if (clientRect1.top > clientRect2.bottom) {
+ return false;
+ }
+
+ return isValidOverflow(clientRect2.top - clientRect1.bottom, clientRect1, clientRect2);
+ };
+
+ var isBelow = function (clientRect1, clientRect2) {
+ if (clientRect1.top > clientRect2.bottom) {
+ return true;
+ }
+
+ if (clientRect1.bottom < clientRect2.top) {
+ return false;
+ }
+
+ return isValidOverflow(clientRect2.bottom - clientRect1.top, clientRect1, clientRect2);
+ };
+
+ var isLeft = function (clientRect1, clientRect2) {
+ return clientRect1.left < clientRect2.left;
+ };
+
+ var isRight = function (clientRect1, clientRect2) {
+ return clientRect1.right > clientRect2.right;
+ };
+
+ var compare = function (clientRect1, clientRect2) {
+ if (isAbove(clientRect1, clientRect2)) {
+ return -1;
+ }
+
+ if (isBelow(clientRect1, clientRect2)) {
+ return 1;
+ }
+
+ if (isLeft(clientRect1, clientRect2)) {
+ return -1;
+ }
+
+ if (isRight(clientRect1, clientRect2)) {
+ return 1;
+ }
+
+ return 0;
+ };
+
+ var containsXY = function (clientRect, clientX, clientY) {
+ return (
+ clientX >= clientRect.left &&
+ clientX <= clientRect.right &&
+ clientY >= clientRect.top &&
+ clientY <= clientRect.bottom
+ );
+ };
+
+ return {
+ clone: clone,
+ collapse: collapse,
+ isEqual: isEqual,
+ isAbove: isAbove,
+ isBelow: isBelow,
+ isLeft: isLeft,
+ isRight: isRight,
+ compare: compare,
+ containsXY: containsXY
+ };
+ }
+);
+
+/**
+ * RangeNodes.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.RangeNodes',
+ [
+ ],
+ function () {
+ var getSelectedNode = function (range) {
+ var startContainer = range.startContainer,
+ startOffset = range.startOffset;
+
+ if (startContainer.hasChildNodes() && range.endOffset == startOffset + 1) {
+ return startContainer.childNodes[startOffset];
+ }
+
+ return null;
+ };
+
+ var getNode = function (container, offset) {
+ if (container.nodeType === 1 && container.hasChildNodes()) {
+ if (offset >= container.childNodes.length) {
+ offset = container.childNodes.length - 1;
+ }
+
+ container = container.childNodes[offset];
+ }
+
+ return container;
+ };
+
+ return {
+ getSelectedNode: getSelectedNode,
+ getNode: getNode
+ };
+ }
+);
+
+/**
+ * ExtendingChar.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class contains logic for detecting extending characters.
+ *
+ * @private
+ * @class tinymce.text.ExtendingChar
+ * @example
+ * var isExtending = ExtendingChar.isExtendingChar('a');
+ */
+define(
+ 'tinymce.core.text.ExtendingChar',
+ [
+ ],
+ function () {
+ // Generated from: http://www.unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
+ // Only includes the characters in that fit into UCS-2 16 bit
+ var extendingChars = new RegExp(
+ "[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A" +
+ "\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0" +
+ "\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E3-\u0902\u093A\u093C" +
+ "\u0941-\u0948\u094D\u0951-\u0957\u0962-\u0963\u0981\u09BC\u09BE\u09C1-\u09C4\u09CD\u09D7\u09E2-\u09E3" +
+ "\u0A01-\u0A02\u0A3C\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A51\u0A70-\u0A71\u0A75\u0A81-\u0A82\u0ABC" +
+ "\u0AC1-\u0AC5\u0AC7-\u0AC8\u0ACD\u0AE2-\u0AE3\u0B01\u0B3C\u0B3E\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B57" +
+ "\u0B62-\u0B63\u0B82\u0BBE\u0BC0\u0BCD\u0BD7\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56" +
+ "\u0C62-\u0C63\u0C81\u0CBC\u0CBF\u0CC2\u0CC6\u0CCC-\u0CCD\u0CD5-\u0CD6\u0CE2-\u0CE3\u0D01\u0D3E\u0D41-\u0D44" +
+ "\u0D4D\u0D57\u0D62-\u0D63\u0DCA\u0DCF\u0DD2-\u0DD4\u0DD6\u0DDF\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9" +
+ "\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86-\u0F87\u0F8D-\u0F97" +
+ "\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039-\u103A\u103D-\u103E\u1058-\u1059\u105E-\u1060\u1071-\u1074" +
+ "\u1082\u1085-\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17B4-\u17B5" +
+ "\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193B\u1A17-\u1A18" +
+ "\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1ABE\u1B00-\u1B03\u1B34" +
+ "\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80-\u1B81\u1BA2-\u1BA5\u1BA8-\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8-\u1BE9" +
+ "\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8-\u1CF9" +
+ "\u1DC0-\u1DF5\u1DFC-\u1DFF\u200C-\u200D\u20D0-\u20DC\u20DD-\u20E0\u20E1\u20E2-\u20E4\u20E5-\u20F0\u2CEF-\u2CF1" +
+ "\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u302E-\u302F\u3099-\u309A\uA66F\uA670-\uA672\uA674-\uA67D\uA69E-\uA69F\uA6F0-\uA6F1" +
+ "\uA802\uA806\uA80B\uA825-\uA826\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC" +
+ "\uA9E5\uAA29-\uAA2E\uAA31-\uAA32\uAA35-\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7-\uAAB8\uAABE-\uAABF\uAAC1" +
+ "\uAAEC-\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F\uFF9E-\uFF9F]"
+ );
+
+ var isExtendingChar = function (ch) {
+ return typeof ch == "string" && ch.charCodeAt(0) >= 768 && extendingChars.test(ch);
+ };
+
+ return {
+ isExtendingChar: isExtendingChar
+ };
+ }
+);
+/**
+ * Fun.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Functional utility class.
+ *
+ * @private
+ * @class tinymce.util.Fun
+ */
+define(
+ 'tinymce.core.util.Fun',
+ [
+ ],
+ function () {
+ var slice = [].slice;
+
+ var constant = function (value) {
+ return function () {
+ return value;
+ };
+ };
+
+ var negate = function (predicate) {
+ return function (x) {
+ return !predicate(x);
+ };
+ };
+
+ var compose = function (f, g) {
+ return function (x) {
+ return f(g(x));
+ };
+ };
+
+ var or = function () {
+ var args = slice.call(arguments);
+
+ return function (x) {
+ for (var i = 0; i < args.length; i++) {
+ if (args[i](x)) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+ };
+
+ var and = function () {
+ var args = slice.call(arguments);
+
+ return function (x) {
+ for (var i = 0; i < args.length; i++) {
+ if (!args[i](x)) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+ };
+
+ var curry = function (fn) {
+ var args = slice.call(arguments);
+
+ if (args.length - 1 >= fn.length) {
+ return fn.apply(this, args.slice(1));
+ }
+
+ return function () {
+ var tempArgs = args.concat([].slice.call(arguments));
+ return curry.apply(this, tempArgs);
+ };
+ };
+
+ var noop = function () {
+ };
+
+ return {
+ constant: constant,
+ negate: negate,
+ and: and,
+ or: or,
+ curry: curry,
+ compose: compose,
+ noop: noop
+ };
+ }
+);
+/**
+ * CaretPosition.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module contains logic for creating caret positions within a document a caretposition
+ * is similar to a DOMRange object but it doesn't have two endpoints and is also more lightweight
+ * since it's now updated live when the DOM changes.
+ *
+ * @private
+ * @class tinymce.caret.CaretPosition
+ * @example
+ * var caretPos1 = new CaretPosition(container, offset);
+ * var caretPos2 = CaretPosition.fromRangeStart(someRange);
+ */
+define(
+ 'tinymce.core.caret.CaretPosition',
+ [
+ 'tinymce.core.caret.CaretCandidate',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.geom.ClientRect',
+ 'tinymce.core.selection.RangeNodes',
+ 'tinymce.core.text.ExtendingChar',
+ 'tinymce.core.util.Fun'
+ ],
+ function (CaretCandidate, DOMUtils, NodeType, ClientRect, RangeNodes, ExtendingChar, Fun) {
+ var isElement = NodeType.isElement,
+ isCaretCandidate = CaretCandidate.isCaretCandidate,
+ isBlock = NodeType.matchStyleValues('display', 'block table'),
+ isFloated = NodeType.matchStyleValues('float', 'left right'),
+ isValidElementCaretCandidate = Fun.and(isElement, isCaretCandidate, Fun.negate(isFloated)),
+ isNotPre = Fun.negate(NodeType.matchStyleValues('white-space', 'pre pre-line pre-wrap')),
+ isText = NodeType.isText,
+ isBr = NodeType.isBr,
+ nodeIndex = DOMUtils.nodeIndex,
+ resolveIndex = RangeNodes.getNode;
+
+ var createRange = function (doc) {
+ return "createRange" in doc ? doc.createRange() : DOMUtils.DOM.createRng();
+ };
+
+ var isWhiteSpace = function (chr) {
+ return chr && /[\r\n\t ]/.test(chr);
+ };
+
+ var isHiddenWhiteSpaceRange = function (range) {
+ var container = range.startContainer,
+ offset = range.startOffset,
+ text;
+
+ if (isWhiteSpace(range.toString()) && isNotPre(container.parentNode)) {
+ text = container.data;
+
+ if (isWhiteSpace(text[offset - 1]) || isWhiteSpace(text[offset + 1])) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ var getCaretPositionClientRects = function (caretPosition) {
+ var clientRects = [], beforeNode, node;
+
+ // Hack for older WebKit versions that doesn't
+ // support getBoundingClientRect on BR elements
+ var getBrClientRect = function (brNode) {
+ var doc = brNode.ownerDocument,
+ rng = createRange(doc),
+ nbsp = doc.createTextNode('\u00a0'),
+ parentNode = brNode.parentNode,
+ clientRect;
+
+ parentNode.insertBefore(nbsp, brNode);
+ rng.setStart(nbsp, 0);
+ rng.setEnd(nbsp, 1);
+ clientRect = ClientRect.clone(rng.getBoundingClientRect());
+ parentNode.removeChild(nbsp);
+
+ return clientRect;
+ };
+
+ var getBoundingClientRect = function (item) {
+ var clientRect, clientRects;
+
+ clientRects = item.getClientRects();
+ if (clientRects.length > 0) {
+ clientRect = ClientRect.clone(clientRects[0]);
+ } else {
+ clientRect = ClientRect.clone(item.getBoundingClientRect());
+ }
+
+ if (isBr(item) && clientRect.left === 0) {
+ return getBrClientRect(item);
+ }
+
+ return clientRect;
+ };
+
+ var collapseAndInflateWidth = function (clientRect, toStart) {
+ clientRect = ClientRect.collapse(clientRect, toStart);
+ clientRect.width = 1;
+ clientRect.right = clientRect.left + 1;
+
+ return clientRect;
+ };
+
+ var addUniqueAndValidRect = function (clientRect) {
+ if (clientRect.height === 0) {
+ return;
+ }
+
+ if (clientRects.length > 0) {
+ if (ClientRect.isEqual(clientRect, clientRects[clientRects.length - 1])) {
+ return;
+ }
+ }
+
+ clientRects.push(clientRect);
+ };
+
+ var addCharacterOffset = function (container, offset) {
+ var range = createRange(container.ownerDocument);
+
+ if (offset < container.data.length) {
+ if (ExtendingChar.isExtendingChar(container.data[offset])) {
+ return clientRects;
+ }
+
+ // WebKit returns two client rects for a position after an extending
+ // character a\uxxx|b so expand on "b" and collapse to start of "b" box
+ if (ExtendingChar.isExtendingChar(container.data[offset - 1])) {
+ range.setStart(container, offset);
+ range.setEnd(container, offset + 1);
+
+ if (!isHiddenWhiteSpaceRange(range)) {
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), false));
+ return clientRects;
+ }
+ }
+ }
+
+ if (offset > 0) {
+ range.setStart(container, offset - 1);
+ range.setEnd(container, offset);
+
+ if (!isHiddenWhiteSpaceRange(range)) {
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), false));
+ }
+ }
+
+ if (offset < container.data.length) {
+ range.setStart(container, offset);
+ range.setEnd(container, offset + 1);
+
+ if (!isHiddenWhiteSpaceRange(range)) {
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(range), true));
+ }
+ }
+ };
+
+ if (isText(caretPosition.container())) {
+ addCharacterOffset(caretPosition.container(), caretPosition.offset());
+ return clientRects;
+ }
+
+ if (isElement(caretPosition.container())) {
+ if (caretPosition.isAtEnd()) {
+ node = resolveIndex(caretPosition.container(), caretPosition.offset());
+ if (isText(node)) {
+ addCharacterOffset(node, node.data.length);
+ }
+
+ if (isValidElementCaretCandidate(node) && !isBr(node)) {
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), false));
+ }
+ } else {
+ node = resolveIndex(caretPosition.container(), caretPosition.offset());
+ if (isText(node)) {
+ addCharacterOffset(node, 0);
+ }
+
+ if (isValidElementCaretCandidate(node) && caretPosition.isAtEnd()) {
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), false));
+ return clientRects;
+ }
+
+ beforeNode = resolveIndex(caretPosition.container(), caretPosition.offset() - 1);
+ if (isValidElementCaretCandidate(beforeNode) && !isBr(beforeNode)) {
+ if (isBlock(beforeNode) || isBlock(node) || !isValidElementCaretCandidate(node)) {
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(beforeNode), false));
+ }
+ }
+
+ if (isValidElementCaretCandidate(node)) {
+ addUniqueAndValidRect(collapseAndInflateWidth(getBoundingClientRect(node), true));
+ }
+ }
+ }
+
+ return clientRects;
+ };
+
+ /**
+ * Represents a location within the document by a container and an offset.
+ *
+ * @constructor
+ * @param {Node} container Container node.
+ * @param {Number} offset Offset within that container node.
+ * @param {Array} clientRects Optional client rects array for the position.
+ */
+ var CaretPosition = function (container, offset, clientRects) {
+ var isAtStart = function () {
+ if (isText(container)) {
+ return offset === 0;
+ }
+
+ return offset === 0;
+ };
+
+ var isAtEnd = function () {
+ if (isText(container)) {
+ return offset >= container.data.length;
+ }
+
+ return offset >= container.childNodes.length;
+ };
+
+ var toRange = function () {
+ var range;
+
+ range = createRange(container.ownerDocument);
+ range.setStart(container, offset);
+ range.setEnd(container, offset);
+
+ return range;
+ };
+
+ var getClientRects = function () {
+ if (!clientRects) {
+ clientRects = getCaretPositionClientRects(new CaretPosition(container, offset));
+ }
+
+ return clientRects;
+ };
+
+ var isVisible = function () {
+ return getClientRects().length > 0;
+ };
+
+ var isEqual = function (caretPosition) {
+ return caretPosition && container === caretPosition.container() && offset === caretPosition.offset();
+ };
+
+ var getNode = function (before) {
+ return resolveIndex(container, before ? offset - 1 : offset);
+ };
+
+ return {
+ /**
+ * Returns the container node.
+ *
+ * @method container
+ * @return {Node} Container node.
+ */
+ container: Fun.constant(container),
+
+ /**
+ * Returns the offset within the container node.
+ *
+ * @method offset
+ * @return {Number} Offset within the container node.
+ */
+ offset: Fun.constant(offset),
+
+ /**
+ * Returns a range out of a the caret position.
+ *
+ * @method toRange
+ * @return {DOMRange} range for the caret position.
+ */
+ toRange: toRange,
+
+ /**
+ * Returns the client rects for the caret position. Might be multiple rects between
+ * block elements.
+ *
+ * @method getClientRects
+ * @return {Array} Array of client rects.
+ */
+ getClientRects: getClientRects,
+
+ /**
+ * Returns true if the caret location is visible/displayed on screen.
+ *
+ * @method isVisible
+ * @return {Boolean} true/false if the position is visible or not.
+ */
+ isVisible: isVisible,
+
+ /**
+ * Returns true if the caret location is at the beginning of text node or container.
+ *
+ * @method isVisible
+ * @return {Boolean} true/false if the position is at the beginning.
+ */
+ isAtStart: isAtStart,
+
+ /**
+ * Returns true if the caret location is at the end of text node or container.
+ *
+ * @method isVisible
+ * @return {Boolean} true/false if the position is at the end.
+ */
+ isAtEnd: isAtEnd,
+
+ /**
+ * Compares the caret position to another caret position. This will only compare the
+ * container and offset not it's visual position.
+ *
+ * @method isEqual
+ * @param {tinymce.caret.CaretPosition} caretPosition Caret position to compare with.
+ * @return {Boolean} true if the caret positions are equal.
+ */
+ isEqual: isEqual,
+
+ /**
+ * Returns the closest resolved node from a node index. That means if you have an offset after the
+ * last node in a container it will return that last node.
+ *
+ * @method getNode
+ * @return {Node} Node that is closest to the index.
+ */
+ getNode: getNode
+ };
+ };
+
+ /**
+ * Creates a caret position from the start of a range.
+ *
+ * @method fromRangeStart
+ * @param {DOMRange} range DOM Range to create caret position from.
+ * @return {tinymce.caret.CaretPosition} Caret position from the start of DOM range.
+ */
+ CaretPosition.fromRangeStart = function (range) {
+ return new CaretPosition(range.startContainer, range.startOffset);
+ };
+
+ /**
+ * Creates a caret position from the end of a range.
+ *
+ * @method fromRangeEnd
+ * @param {DOMRange} range DOM Range to create caret position from.
+ * @return {tinymce.caret.CaretPosition} Caret position from the end of DOM range.
+ */
+ CaretPosition.fromRangeEnd = function (range) {
+ return new CaretPosition(range.endContainer, range.endOffset);
+ };
+
+ /**
+ * Creates a caret position from a node and places the offset after it.
+ *
+ * @method after
+ * @param {Node} node Node to get caret position from.
+ * @return {tinymce.caret.CaretPosition} Caret position from the node.
+ */
+ CaretPosition.after = function (node) {
+ return new CaretPosition(node.parentNode, nodeIndex(node) + 1);
+ };
+
+ /**
+ * Creates a caret position from a node and places the offset before it.
+ *
+ * @method before
+ * @param {Node} node Node to get caret position from.
+ * @return {tinymce.caret.CaretPosition} Caret position from the node.
+ */
+ CaretPosition.before = function (node) {
+ return new CaretPosition(node.parentNode, nodeIndex(node));
+ };
+
+ CaretPosition.isAtStart = function (pos) {
+ return pos ? pos.isAtStart() : false;
+ };
+
+ CaretPosition.isAtEnd = function (pos) {
+ return pos ? pos.isAtEnd() : false;
+ };
+
+ CaretPosition.isTextPosition = function (pos) {
+ return pos ? NodeType.isText(pos.container()) : false;
+ };
+
+ return CaretPosition;
+ }
+);
+/**
+ * CaretUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Utility functions shared by the caret logic.
+ *
+ * @private
+ * @class tinymce.caret.CaretUtils
+ */
+define(
+ 'tinymce.core.caret.CaretUtils',
+ [
+ "tinymce.core.util.Fun",
+ "tinymce.core.dom.TreeWalker",
+ "tinymce.core.dom.NodeType",
+ "tinymce.core.caret.CaretPosition",
+ "tinymce.core.caret.CaretContainer",
+ "tinymce.core.caret.CaretCandidate"
+ ],
+ function (Fun, TreeWalker, NodeType, CaretPosition, CaretContainer, CaretCandidate) {
+ var isContentEditableTrue = NodeType.isContentEditableTrue,
+ isContentEditableFalse = NodeType.isContentEditableFalse,
+ isBlockLike = NodeType.matchStyleValues('display', 'block table table-cell table-caption list-item'),
+ isCaretContainer = CaretContainer.isCaretContainer,
+ isCaretContainerBlock = CaretContainer.isCaretContainerBlock,
+ curry = Fun.curry,
+ isElement = NodeType.isElement,
+ isCaretCandidate = CaretCandidate.isCaretCandidate;
+
+ var isForwards = function (direction) {
+ return direction > 0;
+ };
+
+ var isBackwards = function (direction) {
+ return direction < 0;
+ };
+
+ var skipCaretContainers = function (walk, shallow) {
+ var node;
+
+ while ((node = walk(shallow))) {
+ if (!isCaretContainerBlock(node)) {
+ return node;
+ }
+ }
+
+ return null;
+ };
+
+ var findNode = function (node, direction, predicateFn, rootNode, shallow) {
+ var walker = new TreeWalker(node, rootNode);
+
+ if (isBackwards(direction)) {
+ if (isContentEditableFalse(node) || isCaretContainerBlock(node)) {
+ node = skipCaretContainers(walker.prev, true);
+ if (predicateFn(node)) {
+ return node;
+ }
+ }
+
+ while ((node = skipCaretContainers(walker.prev, shallow))) {
+ if (predicateFn(node)) {
+ return node;
+ }
+ }
+ }
+
+ if (isForwards(direction)) {
+ if (isContentEditableFalse(node) || isCaretContainerBlock(node)) {
+ node = skipCaretContainers(walker.next, true);
+ if (predicateFn(node)) {
+ return node;
+ }
+ }
+
+ while ((node = skipCaretContainers(walker.next, shallow))) {
+ if (predicateFn(node)) {
+ return node;
+ }
+ }
+ }
+
+ return null;
+ };
+
+ var getEditingHost = function (node, rootNode) {
+ for (node = node.parentNode; node && node != rootNode; node = node.parentNode) {
+ if (isContentEditableTrue(node)) {
+ return node;
+ }
+ }
+
+ return rootNode;
+ };
+
+ var getParentBlock = function (node, rootNode) {
+ while (node && node != rootNode) {
+ if (isBlockLike(node)) {
+ return node;
+ }
+
+ node = node.parentNode;
+ }
+
+ return null;
+ };
+
+ var isInSameBlock = function (caretPosition1, caretPosition2, rootNode) {
+ return getParentBlock(caretPosition1.container(), rootNode) == getParentBlock(caretPosition2.container(), rootNode);
+ };
+
+ var isInSameEditingHost = function (caretPosition1, caretPosition2, rootNode) {
+ return getEditingHost(caretPosition1.container(), rootNode) == getEditingHost(caretPosition2.container(), rootNode);
+ };
+
+ var getChildNodeAtRelativeOffset = function (relativeOffset, caretPosition) {
+ var container, offset;
+
+ if (!caretPosition) {
+ return null;
+ }
+
+ container = caretPosition.container();
+ offset = caretPosition.offset();
+
+ if (!isElement(container)) {
+ return null;
+ }
+
+ return container.childNodes[offset + relativeOffset];
+ };
+
+ var beforeAfter = function (before, node) {
+ var range = node.ownerDocument.createRange();
+
+ if (before) {
+ range.setStartBefore(node);
+ range.setEndBefore(node);
+ } else {
+ range.setStartAfter(node);
+ range.setEndAfter(node);
+ }
+
+ return range;
+ };
+
+ var isNodesInSameBlock = function (rootNode, node1, node2) {
+ return getParentBlock(node1, rootNode) == getParentBlock(node2, rootNode);
+ };
+
+ var lean = function (left, rootNode, node) {
+ var sibling, siblingName;
+
+ if (left) {
+ siblingName = 'previousSibling';
+ } else {
+ siblingName = 'nextSibling';
+ }
+
+ while (node && node != rootNode) {
+ sibling = node[siblingName];
+
+ if (isCaretContainer(sibling)) {
+ sibling = sibling[siblingName];
+ }
+
+ if (isContentEditableFalse(sibling)) {
+ if (isNodesInSameBlock(rootNode, sibling, node)) {
+ return sibling;
+ }
+
+ break;
+ }
+
+ if (isCaretCandidate(sibling)) {
+ break;
+ }
+
+ node = node.parentNode;
+ }
+
+ return null;
+ };
+
+ var before = curry(beforeAfter, true);
+ var after = curry(beforeAfter, false);
+
+ var normalizeRange = function (direction, rootNode, range) {
+ var node, container, offset, location;
+ var leanLeft = curry(lean, true, rootNode);
+ var leanRight = curry(lean, false, rootNode);
+
+ container = range.startContainer;
+ offset = range.startOffset;
+
+ if (CaretContainer.isCaretContainerBlock(container)) {
+ if (!isElement(container)) {
+ container = container.parentNode;
+ }
+
+ location = container.getAttribute('data-mce-caret');
+
+ if (location == 'before') {
+ node = container.nextSibling;
+ if (isContentEditableFalse(node)) {
+ return before(node);
+ }
+ }
+
+ if (location == 'after') {
+ node = container.previousSibling;
+ if (isContentEditableFalse(node)) {
+ return after(node);
+ }
+ }
+ }
+
+ if (!range.collapsed) {
+ return range;
+ }
+
+ if (NodeType.isText(container)) {
+ if (isCaretContainer(container)) {
+ if (direction === 1) {
+ node = leanRight(container);
+ if (node) {
+ return before(node);
+ }
+
+ node = leanLeft(container);
+ if (node) {
+ return after(node);
+ }
+ }
+
+ if (direction === -1) {
+ node = leanLeft(container);
+ if (node) {
+ return after(node);
+ }
+
+ node = leanRight(container);
+ if (node) {
+ return before(node);
+ }
+ }
+
+ return range;
+ }
+
+ if (CaretContainer.endsWithCaretContainer(container) && offset >= container.data.length - 1) {
+ if (direction === 1) {
+ node = leanRight(container);
+ if (node) {
+ return before(node);
+ }
+ }
+
+ return range;
+ }
+
+ if (CaretContainer.startsWithCaretContainer(container) && offset <= 1) {
+ if (direction === -1) {
+ node = leanLeft(container);
+ if (node) {
+ return after(node);
+ }
+ }
+
+ return range;
+ }
+
+ if (offset === container.data.length) {
+ node = leanRight(container);
+ if (node) {
+ return before(node);
+ }
+
+ return range;
+ }
+
+ if (offset === 0) {
+ node = leanLeft(container);
+ if (node) {
+ return after(node);
+ }
+
+ return range;
+ }
+ }
+
+ return range;
+ };
+
+ var isNextToContentEditableFalse = function (relativeOffset, caretPosition) {
+ return isContentEditableFalse(getChildNodeAtRelativeOffset(relativeOffset, caretPosition));
+ };
+
+ return {
+ isForwards: isForwards,
+ isBackwards: isBackwards,
+ findNode: findNode,
+ getEditingHost: getEditingHost,
+ getParentBlock: getParentBlock,
+ isInSameBlock: isInSameBlock,
+ isInSameEditingHost: isInSameEditingHost,
+ isBeforeContentEditableFalse: curry(isNextToContentEditableFalse, 0),
+ isAfterContentEditableFalse: curry(isNextToContentEditableFalse, -1),
+ normalizeRange: normalizeRange
+ };
+ }
+);
+
+/**
+ * CaretWalker.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module contains logic for moving around a virtual caret in logical order within a DOM element.
+ *
+ * It ignores the most obvious invalid caret locations such as within a script element or within a
+ * contentEditable=false element but it will return locations that isn't possible to render visually.
+ *
+ * @private
+ * @class tinymce.caret.CaretWalker
+ * @example
+ * var caretWalker = new CaretWalker(rootElm);
+ *
+ * var prevLogicalCaretPosition = caretWalker.prev(CaretPosition.fromRangeStart(range));
+ * var nextLogicalCaretPosition = caretWalker.next(CaretPosition.fromRangeEnd(range));
+ */
+define(
+ 'tinymce.core.caret.CaretWalker',
+ [
+ "tinymce.core.dom.NodeType",
+ "tinymce.core.caret.CaretCandidate",
+ "tinymce.core.caret.CaretPosition",
+ "tinymce.core.caret.CaretUtils",
+ "tinymce.core.util.Arr",
+ "tinymce.core.util.Fun"
+ ],
+ function (NodeType, CaretCandidate, CaretPosition, CaretUtils, Arr, Fun) {
+ var isContentEditableFalse = NodeType.isContentEditableFalse,
+ isText = NodeType.isText,
+ isElement = NodeType.isElement,
+ isBr = NodeType.isBr,
+ isForwards = CaretUtils.isForwards,
+ isBackwards = CaretUtils.isBackwards,
+ isCaretCandidate = CaretCandidate.isCaretCandidate,
+ isAtomic = CaretCandidate.isAtomic,
+ isEditableCaretCandidate = CaretCandidate.isEditableCaretCandidate;
+
+ var getParents = function (node, rootNode) {
+ var parents = [];
+
+ while (node && node != rootNode) {
+ parents.push(node);
+ node = node.parentNode;
+ }
+
+ return parents;
+ };
+
+ var nodeAtIndex = function (container, offset) {
+ if (container.hasChildNodes() && offset < container.childNodes.length) {
+ return container.childNodes[offset];
+ }
+
+ return null;
+ };
+
+ var getCaretCandidatePosition = function (direction, node) {
+ if (isForwards(direction)) {
+ if (isCaretCandidate(node.previousSibling) && !isText(node.previousSibling)) {
+ return CaretPosition.before(node);
+ }
+
+ if (isText(node)) {
+ return CaretPosition(node, 0);
+ }
+ }
+
+ if (isBackwards(direction)) {
+ if (isCaretCandidate(node.nextSibling) && !isText(node.nextSibling)) {
+ return CaretPosition.after(node);
+ }
+
+ if (isText(node)) {
+ return CaretPosition(node, node.data.length);
+ }
+ }
+
+ if (isBackwards(direction)) {
+ if (isBr(node)) {
+ return CaretPosition.before(node);
+ }
+
+ return CaretPosition.after(node);
+ }
+
+ return CaretPosition.before(node);
+ };
+
+ // Jumps over BR elements
|
a
->
|a
+ var isBrBeforeBlock = function (node, rootNode) {
+ var next;
+
+ if (!NodeType.isBr(node)) {
+ return false;
+ }
+
+ next = findCaretPosition(1, CaretPosition.after(node), rootNode);
+ if (!next) {
+ return false;
+ }
+
+ return !CaretUtils.isInSameBlock(CaretPosition.before(node), CaretPosition.before(next), rootNode);
+ };
+
+ var findCaretPosition = function (direction, startCaretPosition, rootNode) {
+ var container, offset, node, nextNode, innerNode,
+ rootContentEditableFalseElm, caretPosition;
+
+ if (!isElement(rootNode) || !startCaretPosition) {
+ return null;
+ }
+
+ if (startCaretPosition.isEqual(CaretPosition.after(rootNode)) && rootNode.lastChild) {
+ caretPosition = CaretPosition.after(rootNode.lastChild);
+ if (isBackwards(direction) && isCaretCandidate(rootNode.lastChild) && isElement(rootNode.lastChild)) {
+ return isBr(rootNode.lastChild) ? CaretPosition.before(rootNode.lastChild) : caretPosition;
+ }
+ } else {
+ caretPosition = startCaretPosition;
+ }
+
+ container = caretPosition.container();
+ offset = caretPosition.offset();
+
+ if (isText(container)) {
+ if (isBackwards(direction) && offset > 0) {
+ return CaretPosition(container, --offset);
+ }
+
+ if (isForwards(direction) && offset < container.length) {
+ return CaretPosition(container, ++offset);
+ }
+
+ node = container;
+ } else {
+ if (isBackwards(direction) && offset > 0) {
+ nextNode = nodeAtIndex(container, offset - 1);
+ if (isCaretCandidate(nextNode)) {
+ if (!isAtomic(nextNode)) {
+ innerNode = CaretUtils.findNode(nextNode, direction, isEditableCaretCandidate, nextNode);
+ if (innerNode) {
+ if (isText(innerNode)) {
+ return CaretPosition(innerNode, innerNode.data.length);
+ }
+
+ return CaretPosition.after(innerNode);
+ }
+ }
+
+ if (isText(nextNode)) {
+ return CaretPosition(nextNode, nextNode.data.length);
+ }
+
+ return CaretPosition.before(nextNode);
+ }
+ }
+
+ if (isForwards(direction) && offset < container.childNodes.length) {
+ nextNode = nodeAtIndex(container, offset);
+ if (isCaretCandidate(nextNode)) {
+ if (isBrBeforeBlock(nextNode, rootNode)) {
+ return findCaretPosition(direction, CaretPosition.after(nextNode), rootNode);
+ }
+
+ if (!isAtomic(nextNode)) {
+ innerNode = CaretUtils.findNode(nextNode, direction, isEditableCaretCandidate, nextNode);
+ if (innerNode) {
+ if (isText(innerNode)) {
+ return CaretPosition(innerNode, 0);
+ }
+
+ return CaretPosition.before(innerNode);
+ }
+ }
+
+ if (isText(nextNode)) {
+ return CaretPosition(nextNode, 0);
+ }
+
+ return CaretPosition.after(nextNode);
+ }
+ }
+
+ node = caretPosition.getNode();
+ }
+
+ if ((isForwards(direction) && caretPosition.isAtEnd()) || (isBackwards(direction) && caretPosition.isAtStart())) {
+ node = CaretUtils.findNode(node, direction, Fun.constant(true), rootNode, true);
+ if (isEditableCaretCandidate(node)) {
+ return getCaretCandidatePosition(direction, node);
+ }
+ }
+
+ nextNode = CaretUtils.findNode(node, direction, isEditableCaretCandidate, rootNode);
+
+ rootContentEditableFalseElm = Arr.last(Arr.filter(getParents(container, rootNode), isContentEditableFalse));
+ if (rootContentEditableFalseElm && (!nextNode || !rootContentEditableFalseElm.contains(nextNode))) {
+ if (isForwards(direction)) {
+ caretPosition = CaretPosition.after(rootContentEditableFalseElm);
+ } else {
+ caretPosition = CaretPosition.before(rootContentEditableFalseElm);
+ }
+
+ return caretPosition;
+ }
+
+ if (nextNode) {
+ return getCaretCandidatePosition(direction, nextNode);
+ }
+
+ return null;
+ };
+
+ return function (rootNode) {
+ return {
+ /**
+ * Returns the next logical caret position from the specificed input
+ * caretPoisiton or null if there isn't any more positions left for example
+ * at the end specified root element.
+ *
+ * @method next
+ * @param {tinymce.caret.CaretPosition} caretPosition Caret position to start from.
+ * @return {tinymce.caret.CaretPosition} CaretPosition or null if no position was found.
+ */
+ next: function (caretPosition) {
+ return findCaretPosition(1, caretPosition, rootNode);
+ },
+
+ /**
+ * Returns the previous logical caret position from the specificed input
+ * caretPoisiton or null if there isn't any more positions left for example
+ * at the end specified root element.
+ *
+ * @method prev
+ * @param {tinymce.caret.CaretPosition} caretPosition Caret position to start from.
+ * @return {tinymce.caret.CaretPosition} CaretPosition or null if no position was found.
+ */
+ prev: function (caretPosition) {
+ return findCaretPosition(-1, caretPosition, rootNode);
+ }
+ };
+ };
+ }
+);
+/**
+ * InsertList.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Handles inserts of lists into the editor instance.
+ *
+ * @class tinymce.InsertList
+ * @private
+ */
+define(
+ 'tinymce.core.InsertList',
+ [
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.caret.CaretWalker',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.util.Tools'
+ ],
+ function (CaretPosition, CaretWalker, NodeType, Tools) {
+ var hasOnlyOneChild = function (node) {
+ return node.firstChild && node.firstChild === node.lastChild;
+ };
+
+ var isPaddingNode = function (node) {
+ return node.name === 'br' || node.value === '\u00a0';
+ };
+
+ var isPaddedEmptyBlock = function (schema, node) {
+ var blockElements = schema.getBlockElements();
+ return blockElements[node.name] && hasOnlyOneChild(node) && isPaddingNode(node.firstChild);
+ };
+
+ var isEmptyFragmentElement = function (schema, node) {
+ var nonEmptyElements = schema.getNonEmptyElements();
+ return node && (node.isEmpty(nonEmptyElements) || isPaddedEmptyBlock(schema, node));
+ };
+
+ var isListFragment = function (schema, fragment) {
+ var firstChild = fragment.firstChild;
+ var lastChild = fragment.lastChild;
+
+ // Skip meta since it's likely
+ // Since it would otherwise produces spans out of thin air on insertContent for example.
+ var normalizeBlockSelectionRange = function (rng) {
+ var startPos = CaretPosition.fromRangeStart(rng);
+ var endPos = CaretPosition.fromRangeEnd(rng);
+ var rootNode = rng.commonAncestorContainer;
+
+ return CaretFinder.fromPosition(false, rootNode, endPos)
+ .map(function (newEndPos) {
+ if (!CaretUtils.isInSameBlock(startPos, endPos, rootNode) && CaretUtils.isInSameBlock(startPos, newEndPos, rootNode)) {
+ return createRange(startPos.container(), startPos.offset(), newEndPos.container(), newEndPos.offset());
+ } else {
+ return rng;
+ }
+ }).getOr(rng);
+ };
+
+ var normalizeBlockSelection = function (rng) {
+ return rng.collapsed ? rng : normalizeBlockSelectionRange(rng);
+ };
+
+ var normalize = function (rng) {
+ return normalizeBlockSelection(rng);
+ };
+
+ return {
+ normalize: normalize
+ };
+ }
+);
+/**
+ * InsertContent.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Handles inserts of contents into the editor instance.
+ *
+ * @class tinymce.InsertContent
+ * @private
+ */
+define(
+ 'tinymce.core.InsertContent',
+ [
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.Env',
+ 'tinymce.core.InsertList',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.caret.CaretWalker',
+ 'tinymce.core.dom.ElementUtils',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.PaddingBr',
+ 'tinymce.core.html.Serializer',
+ 'tinymce.core.selection.RangeNormalizer',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Option, Element, Env, InsertList, CaretPosition, CaretWalker, ElementUtils, NodeType, PaddingBr, Serializer, RangeNormalizer, Tools) {
+ var isTableCell = NodeType.matchNodeNames('td th');
+
+ var validInsertion = function (editor, value, parentNode) {
+ // Should never insert content into bogus elements, since these can
+ // be resize handles or similar
+ if (parentNode.getAttribute('data-mce-bogus') === 'all') {
+ parentNode.parentNode.insertBefore(editor.dom.createFragment(value), parentNode);
+ } else {
+ // Check if parent is empty or only has one BR element then set the innerHTML of that parent
+ var node = parentNode.firstChild;
+ var node2 = parentNode.lastChild;
+ if (!node || (node === node2 && node.nodeName === 'BR')) {///
+ editor.dom.setHTML(parentNode, value);
+ } else {
+ editor.selection.setContent(value);
+ }
+ }
+ };
+
+ var trimBrsFromTableCell = function (dom, elm) {
+ Option.from(dom.getParent(elm, 'td,th')).map(Element.fromDom).each(PaddingBr.trimBlockTrailingBr);
+ };
+
+ var insertHtmlAtCaret = function (editor, value, details) {
+ var parser, serializer, parentNode, rootNode, fragment, args;
+ var marker, rng, node, node2, bookmarkHtml, merge;
+ var textInlineElements = editor.schema.getTextInlineElements();
+ var selection = editor.selection, dom = editor.dom;
+
+ var trimOrPaddLeftRight = function (html) {
+ var rng, container, offset;
+
+ rng = selection.getRng(true);
+ container = rng.startContainer;
+ offset = rng.startOffset;
+
+ var hasSiblingText = function (siblingName) {
+ return container[siblingName] && container[siblingName].nodeType == 3;
+ };
+
+ if (container.nodeType == 3) {
+ if (offset > 0) {
+ html = html.replace(/^ /, ' ');
+ } else if (!hasSiblingText('previousSibling')) {
+ html = html.replace(/^ /, ' ');
+ }
+
+ if (offset < container.length) {
+ html = html.replace(/ ( |)$/, ' ');
+ } else if (!hasSiblingText('nextSibling')) {
+ html = html.replace(/( | )( |)$/, ' ');
+ }
+ }
+
+ return html;
+ };
+
+ // Removes from a [b] c -> a c -> a c
+ var trimNbspAfterDeleteAndPaddValue = function () {
+ var rng, container, offset;
+
+ rng = selection.getRng(true);
+ container = rng.startContainer;
+ offset = rng.startOffset;
+
+ if (container.nodeType == 3 && rng.collapsed) {
+ if (container.data[offset] === '\u00a0') {
+ container.deleteData(offset, 1);
+
+ if (!/[\u00a0| ]$/.test(value)) {
+ value += ' ';
+ }
+ } else if (container.data[offset - 1] === '\u00a0') {
+ container.deleteData(offset - 1, 1);
+
+ if (!/[\u00a0| ]$/.test(value)) {
+ value = ' ' + value;
+ }
+ }
+ }
+ };
+
+ var reduceInlineTextElements = function () {
+ if (merge) {
+ var root = editor.getBody(), elementUtils = new ElementUtils(dom);
+
+ Tools.each(dom.select('*[data-mce-fragment]'), function (node) {
+ for (var testNode = node.parentNode; testNode && testNode != root; testNode = testNode.parentNode) {
+ if (textInlineElements[node.nodeName.toLowerCase()] && elementUtils.compare(testNode, node)) {
+ dom.remove(node, true);
+ }
+ }
+ });
+ }
+ };
+
+ var markFragmentElements = function (fragment) {
+ var node = fragment;
+
+ while ((node = node.walk())) {
+ if (node.type === 1) {
+ node.attr('data-mce-fragment', '1');
+ }
+ }
+ };
+
+ var umarkFragmentElements = function (elm) {
+ Tools.each(elm.getElementsByTagName('*'), function (elm) {
+ elm.removeAttribute('data-mce-fragment');
+ });
+ };
+
+ var isPartOfFragment = function (node) {
+ return !!node.getAttribute('data-mce-fragment');
+ };
+
+ var canHaveChildren = function (node) {
+ return node && !editor.schema.getShortEndedElements()[node.nodeName];
+ };
+
+ var moveSelectionToMarker = function (marker) {
+ var parentEditableFalseElm, parentBlock, nextRng;
+
+ var getContentEditableFalseParent = function (node) {
+ var root = editor.getBody();
+
+ for (; node && node !== root; node = node.parentNode) {
+ if (editor.dom.getContentEditable(node) === 'false') {
+ return node;
+ }
+ }
+
+ return null;
+ };
+
+ if (!marker) {
+ return;
+ }
+
+ selection.scrollIntoView(marker);
+
+ // If marker is in cE=false then move selection to that element instead
+ parentEditableFalseElm = getContentEditableFalseParent(marker);
+ if (parentEditableFalseElm) {
+ dom.remove(marker);
+ selection.select(parentEditableFalseElm);
+ return;
+ }
+
+ // Move selection before marker and remove it
+ rng = dom.createRng();
+
+ // If previous sibling is a text node set the selection to the end of that node
+ node = marker.previousSibling;
+ if (node && node.nodeType == 3) {
+ rng.setStart(node, node.nodeValue.length);
+
+ // TODO: Why can't we normalize on IE
+ if (!Env.ie) {
+ node2 = marker.nextSibling;
+ if (node2 && node2.nodeType == 3) {
+ node.appendData(node2.data);
+ node2.parentNode.removeChild(node2);
+ }
+ }
+ } else {
+ // If the previous sibling isn't a text node or doesn't exist set the selection before the marker node
+ rng.setStartBefore(marker);
+ rng.setEndBefore(marker);
+ }
+
+ var findNextCaretRng = function (rng) {
+ var caretPos = CaretPosition.fromRangeStart(rng);
+ var caretWalker = new CaretWalker(editor.getBody());
+
+ caretPos = caretWalker.next(caretPos);
+ if (caretPos) {
+ return caretPos.toRange();
+ }
+ };
+
+ // Remove the marker node and set the new range
+ parentBlock = dom.getParent(marker, dom.isBlock);
+ dom.remove(marker);
+
+ if (parentBlock && dom.isEmpty(parentBlock)) {
+ editor.$(parentBlock).empty();
+
+ rng.setStart(parentBlock, 0);
+ rng.setEnd(parentBlock, 0);
+
+ if (!isTableCell(parentBlock) && !isPartOfFragment(parentBlock) && (nextRng = findNextCaretRng(rng))) {
+ rng = nextRng;
+ dom.remove(parentBlock);
+ } else {
+ dom.add(parentBlock, dom.create('br', { 'data-mce-bogus': '1' }));
+ }
+ }
+
+ selection.setRng(rng);
+ };
+
+ // Check for whitespace before/after value
+ if (/^ | $/.test(value)) {
+ value = trimOrPaddLeftRight(value);
+ }
+
+ // Setup parser and serializer
+ parser = editor.parser;
+ merge = details.merge;
+
+ serializer = new Serializer({
+ validate: editor.settings.validate
+ }, editor.schema);
+ bookmarkHtml = '';
+
+ // Run beforeSetContent handlers on the HTML to be inserted
+ args = { content: value, format: 'html', selection: true, paste: details.paste };
+ args = editor.fire('BeforeSetContent', args);
+ if (args.isDefaultPrevented()) {
+ editor.fire('SetContent', { content: args.content, format: 'html', selection: true, paste: details.paste });
+ return;
+ }
+
+ value = args.content;
+
+ // Add caret at end of contents if it's missing
+ if (value.indexOf('{$caret}') == -1) {
+ value += '{$caret}';
+ }
+
+ // Replace the caret marker with a span bookmark element
+ value = value.replace(/\{\$caret\}/, bookmarkHtml);
+
+ // If selection is at | then move it into
|
+ rng = selection.getRng();
+ var caretElement = rng.startContainer || (rng.parentElement ? rng.parentElement() : null);
+ var body = editor.getBody();
+ if (caretElement === body && selection.isCollapsed()) {
+ if (dom.isBlock(body.firstChild) && canHaveChildren(body.firstChild) && dom.isEmpty(body.firstChild)) {
+ rng = dom.createRng();
+ rng.setStart(body.firstChild, 0);
+ rng.setEnd(body.firstChild, 0);
+ selection.setRng(rng);
+ }
+ }
+
+ // Insert node maker where we will insert the new HTML and get it's parent
+ if (!selection.isCollapsed()) {
+ // Fix for #2595 seems that delete removes one extra character on
+ // WebKit for some odd reason if you double click select a word
+ editor.selection.setRng(RangeNormalizer.normalize(editor.selection.getRng()));
+ editor.getDoc().execCommand('Delete', false, null);
+ trimNbspAfterDeleteAndPaddValue();
+ }
+
+ parentNode = selection.getNode();
+
+ // Parse the fragment within the context of the parent node
+ var parserArgs = { context: parentNode.nodeName.toLowerCase(), data: details.data, insert: true };
+ fragment = parser.parse(value, parserArgs);
+
+ // Custom handling of lists
+ if (details.paste === true && InsertList.isListFragment(editor.schema, fragment) && InsertList.isParentBlockLi(dom, parentNode)) {
+ rng = InsertList.insertAtCaret(serializer, dom, editor.selection.getRng(true), fragment);
+ editor.selection.setRng(rng);
+ editor.fire('SetContent', args);
+ return;
+ }
+
+ markFragmentElements(fragment);
+
+ // Move the caret to a more suitable location
+ node = fragment.lastChild;
+ if (node.attr('id') == 'mce_marker') {
+ marker = node;
+
+ for (node = node.prev; node; node = node.walk(true)) {
+ if (node.type == 3 || !dom.isBlock(node.name)) {
+ if (editor.schema.isValidChild(node.parent.name, 'span')) {
+ node.parent.insert(marker, node, node.name === 'br');
+ }
+ break;
+ }
+ }
+ }
+
+ editor._selectionOverrides.showBlockCaretContainer(parentNode);
+
+ // If parser says valid we can insert the contents into that parent
+ if (!parserArgs.invalid) {
+ value = serializer.serialize(fragment);
+ validInsertion(editor, value, parentNode);
+ } else {
+ // If the fragment was invalid within that context then we need
+ // to parse and process the parent it's inserted into
+
+ // Insert bookmark node and get the parent
+ selection.setContent(bookmarkHtml);
+ parentNode = selection.getNode();
+ rootNode = editor.getBody();
+
+ // Opera will return the document node when selection is in root
+ if (parentNode.nodeType == 9) {
+ parentNode = node = rootNode;
+ } else {
+ node = parentNode;
+ }
+
+ // Find the ancestor just before the root element
+ while (node !== rootNode) {
+ parentNode = node;
+ node = node.parentNode;
+ }
+
+ // Get the outer/inner HTML depending on if we are in the root and parser and serialize that
+ value = parentNode == rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode);
+ value = serializer.serialize(
+ parser.parse(
+ // Need to replace by using a function since $ in the contents would otherwise be a problem
+ value.replace(//i, function () {
+ return serializer.serialize(fragment);
+ })
+ )
+ );
+
+ // Set the inner/outer HTML depending on if we are in the root or not
+ if (parentNode == rootNode) {
+ dom.setHTML(rootNode, value);
+ } else {
+ dom.setOuterHTML(parentNode, value);
+ }
+ }
+
+ reduceInlineTextElements();
+ moveSelectionToMarker(dom.get('mce_marker'));
+ umarkFragmentElements(editor.getBody());
+ trimBrsFromTableCell(editor.dom, editor.selection.getStart());
+
+ editor.fire('SetContent', args);
+ editor.addVisual();
+ };
+
+ var processValue = function (value) {
+ var details;
+
+ if (typeof value !== 'string') {
+ details = Tools.extend({
+ paste: value.paste,
+ data: {
+ paste: value.paste
+ }
+ }, value);
+
+ return {
+ content: value.content,
+ details: details
+ };
+ }
+
+ return {
+ content: value,
+ details: {}
+ };
+ };
+
+ var insertAtCaret = function (editor, value) {
+ var result = processValue(value);
+ insertHtmlAtCaret(editor, result.content, result.details);
+ };
+
+ return {
+ insertAtCaret: insertAtCaret
+ };
+ }
+);
+define(
+ 'ephox.sugar.impl.ClosestOrAncestor',
+
+ [
+ 'ephox.katamari.api.Type',
+ 'ephox.katamari.api.Option'
+ ],
+
+ function (Type, Option) {
+ return function (is, ancestor, scope, a, isRoot) {
+ return is(scope, a) ?
+ Option.some(scope) :
+ Type.isFunction(isRoot) && isRoot(scope) ?
+ Option.none() :
+ ancestor(scope, a, isRoot);
+ };
+ }
+);
+define(
+ 'ephox.sugar.api.search.PredicateFind',
+
+ [
+ 'ephox.katamari.api.Type',
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.node.Body',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.impl.ClosestOrAncestor'
+ ],
+
+ function (Type, Arr, Fun, Option, Body, Compare, Element, ClosestOrAncestor) {
+ var first = function (predicate) {
+ return descendant(Body.body(), predicate);
+ };
+
+ var ancestor = function (scope, predicate, isRoot) {
+ var element = scope.dom();
+ var stop = Type.isFunction(isRoot) ? isRoot : Fun.constant(false);
+
+ while (element.parentNode) {
+ element = element.parentNode;
+ var el = Element.fromDom(element);
+
+ if (predicate(el)) return Option.some(el);
+ else if (stop(el)) break;
+ }
+ return Option.none();
+ };
+
+ var closest = function (scope, predicate, isRoot) {
+ // This is required to avoid ClosestOrAncestor passing the predicate to itself
+ var is = function (scope) {
+ return predicate(scope);
+ };
+ return ClosestOrAncestor(is, ancestor, scope, predicate, isRoot);
+ };
+
+ var sibling = function (scope, predicate) {
+ var element = scope.dom();
+ if (!element.parentNode) return Option.none();
+
+ return child(Element.fromDom(element.parentNode), function (x) {
+ return !Compare.eq(scope, x) && predicate(x);
+ });
+ };
+
+ var child = function (scope, predicate) {
+ var result = Arr.find(scope.dom().childNodes,
+ Fun.compose(predicate, Element.fromDom));
+ return result.map(Element.fromDom);
+ };
+
+ var descendant = function (scope, predicate) {
+ var descend = function (element) {
+ for (var i = 0; i < element.childNodes.length; i++) {
+ if (predicate(Element.fromDom(element.childNodes[i])))
+ return Option.some(Element.fromDom(element.childNodes[i]));
+
+ var res = descend(element.childNodes[i]);
+ if (res.isSome())
+ return res;
+ }
+
+ return Option.none();
+ };
+
+ return descend(scope.dom());
+ };
+
+ return {
+ first: first,
+ ancestor: ancestor,
+ closest: closest,
+ sibling: sibling,
+ child: child,
+ descendant: descendant
+ };
+ }
+);
+
+/**
+ * DefaultSettings.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.EditorSettings',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Obj',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Strings',
+ 'ephox.katamari.api.Struct',
+ 'ephox.katamari.api.Type',
+ 'ephox.sand.api.PlatformDetection',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Arr, Fun, Obj, Option, Strings, Struct, Type, PlatformDetection, Tools) {
+ var sectionResult = Struct.immutable('sections', 'settings');
+ var detection = PlatformDetection.detect();
+ var isTouch = detection.deviceType.isTouch();
+ var mobilePlugins = [ 'lists', 'autolink', 'autosave' ];
+ var defaultMobileSettings = { theme: 'mobile' };
+
+ var normalizePlugins = function (plugins) {
+ var pluginNames = Type.isArray(plugins) ? plugins.join(' ') : plugins;
+ var trimmedPlugins = Arr.map(Type.isString(pluginNames) ? pluginNames.split(' ') : [ ], Strings.trim);
+ return Arr.filter(trimmedPlugins, function (item) {
+ return item.length > 0;
+ });
+ };
+
+ var filterMobilePlugins = function (plugins) {
+ return Arr.filter(plugins, Fun.curry(Arr.contains, mobilePlugins));
+ };
+
+ var extractSections = function (keys, settings) {
+ var result = Obj.bifilter(settings, function (value, key) {
+ return Arr.contains(keys, key);
+ });
+
+ return sectionResult(result.t, result.f);
+ };
+
+ var getSection = function (sectionResult, name, defaults) {
+ var sections = sectionResult.sections();
+ var sectionSettings = sections.hasOwnProperty(name) ? sections[name] : { };
+ return Tools.extend({}, defaults, sectionSettings);
+ };
+
+ var hasSection = function (sectionResult, name) {
+ return sectionResult.sections().hasOwnProperty(name);
+ };
+
+ var getDefaultSettings = function (id, documentBaseUrl, editor) {
+ return {
+ id: id,
+ theme: 'modern',
+ delta_width: 0,
+ delta_height: 0,
+ popup_css: '',
+ plugins: '',
+ document_base_url: documentBaseUrl,
+ add_form_submit_trigger: true,
+ submit_patch: true,
+ add_unload_trigger: true,
+ convert_urls: true,
+ relative_urls: true,
+ remove_script_host: true,
+ object_resizing: true,
+ doctype: '',
+ visual: true,
+ font_size_style_values: 'xx-small,x-small,small,medium,large,x-large,xx-large',
+
+ // See: http://www.w3.org/TR/CSS2/fonts.html#propdef-font-size
+ font_size_legacy_values: 'xx-small,small,medium,large,x-large,xx-large,300%',
+ forced_root_block: 'p',
+ hidden_input: true,
+ padd_empty_editor: true,
+ render_ui: true,
+ indentation: '30px',
+ inline_styles: true,
+ convert_fonts_to_spans: true,
+ indent: 'simple',
+ indent_before: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' +
+ 'tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
+ indent_after: 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' +
+ 'tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
+ entity_encoding: 'named',
+ url_converter: editor.convertURL,
+ url_converter_scope: editor,
+ ie7_compat: true
+ };
+ };
+
+ var getExternalPlugins = function (overrideSettings, settings) {
+ var userDefinedExternalPlugins = settings.external_plugins ? settings.external_plugins : { };
+
+ if (overrideSettings && overrideSettings.external_plugins) {
+ return Tools.extend({}, overrideSettings.external_plugins, userDefinedExternalPlugins);
+ } else {
+ return userDefinedExternalPlugins;
+ }
+ };
+
+ var combinePlugins = function (forcedPlugins, plugins) {
+ return [].concat(normalizePlugins(forcedPlugins)).concat(normalizePlugins(plugins));
+ };
+
+ var processPlugins = function (isTouchDevice, sectionResult, defaultOverrideSettings, settings) {
+ var forcedPlugins = normalizePlugins(defaultOverrideSettings.forced_plugins);
+ var plugins = normalizePlugins(settings.plugins);
+ var platformPlugins = isTouchDevice && hasSection(sectionResult, 'mobile') ? filterMobilePlugins(plugins) : plugins;
+ var combinedPlugins = combinePlugins(forcedPlugins, platformPlugins);
+
+ return Tools.extend(settings, {
+ plugins: combinedPlugins.join(' ')
+ });
+ };
+
+ var isOnMobile = function (isTouchDevice, sectionResult) {
+ var isInline = sectionResult.settings().inline; // We don't support mobile inline yet
+ return isTouchDevice && hasSection(sectionResult, 'mobile') && !isInline;
+ };
+
+ var combineSettings = function (isTouchDevice, defaultSettings, defaultOverrideSettings, settings) {
+ var sectionResult = extractSections(['mobile'], settings);
+ var extendedSettings = Tools.extend(
+ // Default settings
+ defaultSettings,
+
+ // tinymce.overrideDefaults settings
+ defaultOverrideSettings,
+
+ // User settings
+ sectionResult.settings(),
+
+ // Sections
+ isOnMobile(isTouchDevice, sectionResult) ? getSection(sectionResult, 'mobile', defaultMobileSettings) : { },
+
+ // Forced settings
+ {
+ validate: true,
+ content_editable: sectionResult.settings().inline,
+ external_plugins: getExternalPlugins(defaultOverrideSettings, sectionResult.settings())
+ }
+ );
+
+ return processPlugins(isTouchDevice, sectionResult, defaultOverrideSettings, extendedSettings);
+ };
+
+ var getEditorSettings = function (editor, id, documentBaseUrl, defaultOverrideSettings, settings) {
+ var defaultSettings = getDefaultSettings(id, documentBaseUrl, editor);
+ return combineSettings(isTouch, defaultSettings, defaultOverrideSettings, settings);
+ };
+
+ var get = function (editor, name) {
+ return Option.from(editor.settings[name]);
+ };
+
+ var getFiltered = function (predicate, editor, name) {
+ return Option.from(editor.settings[name]).filter(predicate);
+ };
+
+ return {
+ getEditorSettings: getEditorSettings,
+ get: get,
+ getString: Fun.curry(getFiltered, Type.isString),
+ combineSettings: combineSettings
+ };
+ }
+);
+
+/**
+ * Bidi.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.text.Bidi',
+ [
+ ],
+ function () {
+ var strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/;
+
+ var hasStrongRtl = function (text) {
+ return strongRtl.test(text);
+ };
+
+ return {
+ hasStrongRtl: hasStrongRtl
+ };
+ }
+);
+/**
+ * InlineUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.InlineUtils',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.Selectors',
+ 'tinymce.core.EditorSettings',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.caret.CaretUtils',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.text.Bidi'
+ ],
+ function (Arr, Fun, Option, Element, Selectors, EditorSettings, CaretContainer, CaretPosition, CaretUtils, DOMUtils, NodeType, Bidi) {
+ var isInlineTarget = function (editor, elm) {
+ var selector = EditorSettings.getString(editor, 'inline_boundaries_selector').getOr('a[href],code');
+ return Selectors.is(Element.fromDom(elm), selector);
+ };
+
+ var isRtl = function (element) {
+ return DOMUtils.DOM.getStyle(element, 'direction', true) === 'rtl' || Bidi.hasStrongRtl(element.textContent);
+ };
+
+ var findInlineParents = function (isInlineTarget, rootNode, pos) {
+ return Arr.filter(DOMUtils.DOM.getParents(pos.container(), '*', rootNode), isInlineTarget);
+ };
+
+ var findRootInline = function (isInlineTarget, rootNode, pos) {
+ var parents = findInlineParents(isInlineTarget, rootNode, pos);
+ return Option.from(parents[parents.length - 1]);
+ };
+
+ var hasSameParentBlock = function (rootNode, node1, node2) {
+ var block1 = CaretUtils.getParentBlock(node1, rootNode);
+ var block2 = CaretUtils.getParentBlock(node2, rootNode);
+ return block1 && block1 === block2;
+ };
+
+ var isAtZwsp = function (pos) {
+ return CaretContainer.isBeforeInline(pos) || CaretContainer.isAfterInline(pos);
+ };
+
+ var normalizePosition = function (forward, pos) {
+ var container = pos.container(), offset = pos.offset();
+
+ if (forward) {
+ if (CaretContainer.isCaretContainerInline(container)) {
+ if (NodeType.isText(container.nextSibling)) {
+ return new CaretPosition(container.nextSibling, 0);
+ } else {
+ return CaretPosition.after(container);
+ }
+ } else {
+ return CaretContainer.isBeforeInline(pos) ? new CaretPosition(container, offset + 1) : pos;
+ }
+ } else {
+ if (CaretContainer.isCaretContainerInline(container)) {
+ if (NodeType.isText(container.previousSibling)) {
+ return new CaretPosition(container.previousSibling, container.previousSibling.data.length);
+ } else {
+ return CaretPosition.before(container);
+ }
+ } else {
+ return CaretContainer.isAfterInline(pos) ? new CaretPosition(container, offset - 1) : pos;
+ }
+ }
+ };
+
+ var normalizeForwards = Fun.curry(normalizePosition, true);
+ var normalizeBackwards = Fun.curry(normalizePosition, false);
+
+ return {
+ isInlineTarget: isInlineTarget,
+ findRootInline: findRootInline,
+ isRtl: isRtl,
+ isAtZwsp: isAtZwsp,
+ normalizePosition: normalizePosition,
+ normalizeForwards: normalizeForwards,
+ normalizeBackwards: normalizeBackwards,
+ hasSameParentBlock: hasSameParentBlock
+ };
+ }
+);
+/**
+ * DeleteUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.DeleteUtils',
+ [
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Options',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.PredicateFind',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.dom.ElementType',
+ 'tinymce.core.keyboard.InlineUtils'
+ ],
+ function (Option, Options, Compare, Element, PredicateFind, CaretFinder, ElementType, InlineUtils) {
+ var isBeforeRoot = function (rootNode) {
+ return function (elm) {
+ return Compare.eq(rootNode, Element.fromDom(elm.dom().parentNode));
+ };
+ };
+
+ var getParentBlock = function (rootNode, elm) {
+ return Compare.contains(rootNode, elm) ? PredicateFind.closest(elm, function (element) {
+ return ElementType.isTextBlock(element) || ElementType.isListItem(element);
+ }, isBeforeRoot(rootNode)) : Option.none();
+ };
+
+ var placeCaretInEmptyBody = function (editor) {
+ var body = editor.getBody();
+ var node = body.firstChild && editor.dom.isBlock(body.firstChild) ? body.firstChild : body;
+ editor.selection.setCursorLocation(node, 0);
+ };
+
+ var paddEmptyBody = function (editor) {
+ if (editor.dom.isEmpty(editor.getBody())) {
+ editor.setContent('');
+ placeCaretInEmptyBody(editor);
+ }
+ };
+
+ var willDeleteLastPositionInElement = function (forward, fromPos, elm) {
+ return Options.liftN([
+ CaretFinder.firstPositionIn(elm),
+ CaretFinder.lastPositionIn(elm)
+ ], function (firstPos, lastPos) {
+ var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);
+ var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);
+ var normalizedFromPos = InlineUtils.normalizePosition(false, fromPos);
+
+ if (forward) {
+ return CaretFinder.nextPosition(elm, normalizedFromPos).map(function (nextPos) {
+ return nextPos.isEqual(normalizedLastPos) && fromPos.isEqual(normalizedFirstPos);
+ }).getOr(false);
+ } else {
+ return CaretFinder.prevPosition(elm, normalizedFromPos).map(function (prevPos) {
+ return prevPos.isEqual(normalizedFirstPos) && fromPos.isEqual(normalizedLastPos);
+ }).getOr(false);
+ }
+ }).getOr(true);
+ };
+
+ return {
+ getParentBlock: getParentBlock,
+ paddEmptyBody: paddEmptyBody,
+ willDeleteLastPositionInElement: willDeleteLastPositionInElement
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.search.SelectorFind',
+
+ [
+ 'ephox.sugar.api.search.PredicateFind',
+ 'ephox.sugar.api.search.Selectors',
+ 'ephox.sugar.impl.ClosestOrAncestor'
+ ],
+
+ function (PredicateFind, Selectors, ClosestOrAncestor) {
+ // TODO: An internal SelectorFilter module that doesn't Element.fromDom() everything
+
+ var first = function (selector) {
+ return Selectors.one(selector);
+ };
+
+ var ancestor = function (scope, selector, isRoot) {
+ return PredicateFind.ancestor(scope, function (e) {
+ return Selectors.is(e, selector);
+ }, isRoot);
+ };
+
+ var sibling = function (scope, selector) {
+ return PredicateFind.sibling(scope, function (e) {
+ return Selectors.is(e, selector);
+ });
+ };
+
+ var child = function (scope, selector) {
+ return PredicateFind.child(scope, function (e) {
+ return Selectors.is(e, selector);
+ });
+ };
+
+ var descendant = function (scope, selector) {
+ return Selectors.one(selector, scope);
+ };
+
+ // Returns Some(closest ancestor element (sugared)) matching 'selector' up to isRoot, or None() otherwise
+ var closest = function (scope, selector, isRoot) {
+ return ClosestOrAncestor(Selectors.is, ancestor, scope, selector, isRoot);
+ };
+
+ return {
+ first: first,
+ ancestor: ancestor,
+ sibling: sibling,
+ child: child,
+ descendant: descendant,
+ closest: closest
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.search.SelectorExists',
+
+ [
+ 'ephox.sugar.api.search.SelectorFind'
+ ],
+
+ function (SelectorFind) {
+ var any = function (selector) {
+ return SelectorFind.first(selector).isSome();
+ };
+
+ var ancestor = function (scope, selector, isRoot) {
+ return SelectorFind.ancestor(scope, selector, isRoot).isSome();
+ };
+
+ var sibling = function (scope, selector) {
+ return SelectorFind.sibling(scope, selector).isSome();
+ };
+
+ var child = function (scope, selector) {
+ return SelectorFind.child(scope, selector).isSome();
+ };
+
+ var descendant = function (scope, selector) {
+ return SelectorFind.descendant(scope, selector).isSome();
+ };
+
+ var closest = function (scope, selector, isRoot) {
+ return SelectorFind.closest(scope, selector, isRoot).isSome();
+ };
+
+ return {
+ any: any,
+ ancestor: ancestor,
+ sibling: sibling,
+ child: child,
+ descendant: descendant,
+ closest: closest
+ };
+ }
+);
+
+/**
+ * Empty.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.dom.Empty',
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.SelectorExists',
+ 'tinymce.core.caret.CaretCandidate',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.TreeWalker'
+ ],
+ function (Fun, Compare, Element, SelectorExists, CaretCandidate, NodeType, TreeWalker) {
+ var hasWhitespacePreserveParent = function (rootNode, node) {
+ var rootElement = Element.fromDom(rootNode);
+ var startNode = Element.fromDom(node);
+ return SelectorExists.ancestor(startNode, 'pre,code', Fun.curry(Compare.eq, rootElement));
+ };
+
+ var isWhitespace = function (rootNode, node) {
+ return NodeType.isText(node) && /^[ \t\r\n]*$/.test(node.data) && hasWhitespacePreserveParent(rootNode, node) === false;
+ };
+
+ var isNamedAnchor = function (node) {
+ return NodeType.isElement(node) && node.nodeName === 'A' && node.hasAttribute('name');
+ };
+
+ var isContent = function (rootNode, node) {
+ return (CaretCandidate.isCaretCandidate(node) && isWhitespace(rootNode, node) === false) || isNamedAnchor(node) || isBookmark(node);
+ };
+
+ var isBookmark = NodeType.hasAttribute('data-mce-bookmark');
+ var isBogus = NodeType.hasAttribute('data-mce-bogus');
+ var isBogusAll = NodeType.hasAttributeValue('data-mce-bogus', 'all');
+
+ var isEmptyNode = function (targetNode) {
+ var walker, node, brCount = 0;
+
+ if (isContent(targetNode, targetNode)) {
+ return false;
+ } else {
+ node = targetNode.firstChild;
+ if (!node) {
+ return true;
+ }
+
+ walker = new TreeWalker(node, targetNode);
+ do {
+ if (isBogusAll(node)) {
+ node = walker.next(true);
+ continue;
+ }
+
+ if (isBogus(node)) {
+ node = walker.next();
+ continue;
+ }
+
+ if (NodeType.isBr(node)) {
+ brCount++;
+ node = walker.next();
+ continue;
+ }
+
+ if (isContent(targetNode, node)) {
+ return false;
+ }
+
+ node = walker.next();
+ } while (node);
+
+ return brCount <= 1;
+ }
+ };
+
+ var isEmpty = function (elm) {
+ return isEmptyNode(elm.dom());
+ };
+
+ return {
+ isEmpty: isEmpty
+ };
+ }
+);
+
+/**
+ * BlockBoundary.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.BlockBoundary',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Options',
+ 'ephox.katamari.api.Struct',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'ephox.sugar.api.search.PredicateFind',
+ 'ephox.sugar.api.search.Traverse',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.delete.DeleteUtils',
+ 'tinymce.core.dom.Empty',
+ 'tinymce.core.dom.NodeType'
+ ],
+ function (Arr, Fun, Option, Options, Struct, Compare, Element, Node, PredicateFind, Traverse, CaretFinder, CaretPosition, DeleteUtils, Empty, NodeType) {
+ var BlockPosition = Struct.immutable('block', 'position');
+ var BlockBoundary = Struct.immutable('from', 'to');
+
+ var getBlockPosition = function (rootNode, pos) {
+ var rootElm = Element.fromDom(rootNode);
+ var containerElm = Element.fromDom(pos.container());
+ return DeleteUtils.getParentBlock(rootElm, containerElm).map(function (block) {
+ return BlockPosition(block, pos);
+ });
+ };
+
+ var isDifferentBlocks = function (blockBoundary) {
+ return Compare.eq(blockBoundary.from().block(), blockBoundary.to().block()) === false;
+ };
+
+ var hasSameParent = function (blockBoundary) {
+ return Traverse.parent(blockBoundary.from().block()).bind(function (parent1) {
+ return Traverse.parent(blockBoundary.to().block()).filter(function (parent2) {
+ return Compare.eq(parent1, parent2);
+ });
+ }).isSome();
+ };
+
+ var isEditable = function (blockBoundary) {
+ return NodeType.isContentEditableFalse(blockBoundary.from().block()) === false && NodeType.isContentEditableFalse(blockBoundary.to().block()) === false;
+ };
+
+ var skipLastBr = function (rootNode, forward, blockPosition) {
+ if (NodeType.isBr(blockPosition.position().getNode()) && Empty.isEmpty(blockPosition.block()) === false) {
+ return CaretFinder.positionIn(false, blockPosition.block().dom()).bind(function (lastPositionInBlock) {
+ if (lastPositionInBlock.isEqual(blockPosition.position())) {
+ return CaretFinder.fromPosition(forward, rootNode, lastPositionInBlock).bind(function (to) {
+ return getBlockPosition(rootNode, to);
+ });
+ } else {
+ return Option.some(blockPosition);
+ }
+ }).getOr(blockPosition);
+ } else {
+ return blockPosition;
+ }
+ };
+
+ var readFromRange = function (rootNode, forward, rng) {
+ var fromBlockPos = getBlockPosition(rootNode, CaretPosition.fromRangeStart(rng));
+ var toBlockPos = fromBlockPos.bind(function (blockPos) {
+ return CaretFinder.fromPosition(forward, rootNode, blockPos.position()).bind(function (to) {
+ return getBlockPosition(rootNode, to).map(function (blockPos) {
+ return skipLastBr(rootNode, forward, blockPos);
+ });
+ });
+ });
+
+ return Options.liftN([fromBlockPos, toBlockPos], BlockBoundary).filter(function (blockBoundary) {
+ return isDifferentBlocks(blockBoundary) && hasSameParent(blockBoundary) && isEditable(blockBoundary);
+ });
+ };
+
+ var read = function (rootNode, forward, rng) {
+ return rng.collapsed ? readFromRange(rootNode, forward, rng) : Option.none();
+ };
+
+ return {
+ read: read
+ };
+ }
+);
+
+/**
+ * Parents.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.dom.Parents',
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.search.Traverse'
+ ],
+ function (Fun, Compare, Traverse) {
+ var dropLast = function (xs) {
+ return xs.slice(0, -1);
+ };
+
+ var parentsUntil = function (startNode, rootElm, predicate) {
+ if (Compare.contains(rootElm, startNode)) {
+ return dropLast(Traverse.parents(startNode, function (elm) {
+ return predicate(elm) || Compare.eq(elm, rootElm);
+ }));
+ } else {
+ return [];
+ }
+ };
+
+ var parents = function (startNode, rootElm) {
+ return parentsUntil(startNode, rootElm, Fun.constant(false));
+ };
+
+ var parentsAndSelf = function (startNode, rootElm) {
+ return [startNode].concat(parents(startNode, rootElm));
+ };
+
+ return {
+ parentsUntil: parentsUntil,
+ parents: parents,
+ parentsAndSelf: parentsAndSelf
+ };
+ }
+);
+
+/**
+ * MergeBlocks.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.MergeBlocks',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.dom.Insert',
+ 'ephox.sugar.api.dom.Remove',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.Traverse',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.dom.ElementType',
+ 'tinymce.core.dom.Empty',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.PaddingBr',
+ 'tinymce.core.dom.Parents'
+ ],
+ function (Arr, Option, Compare, Insert, Remove, Element, Traverse, CaretFinder, CaretPosition, ElementType, Empty, NodeType, PaddingBr, Parents) {
+ var getChildrenUntilBlockBoundary = function (block) {
+ var children = Traverse.children(block);
+ return Arr.findIndex(children, ElementType.isBlock).fold(
+ function () {
+ return children;
+ },
+ function (index) {
+ return children.slice(0, index);
+ }
+ );
+ };
+
+ var extractChildren = function (block) {
+ var children = getChildrenUntilBlockBoundary(block);
+
+ Arr.each(children, function (node) {
+ Remove.remove(node);
+ });
+
+ return children;
+ };
+
+ var trimBr = function (first, block) {
+ CaretFinder.positionIn(first, block.dom()).each(function (position) {
+ var node = position.getNode();
+ if (NodeType.isBr(node)) {
+ Remove.remove(Element.fromDom(node));
+ }
+ });
+ };
+
+ var removeEmptyRoot = function (rootNode, block) {
+ var parents = Parents.parentsAndSelf(block, rootNode);
+ return Arr.find(parents.reverse(), Empty.isEmpty).each(Remove.remove);
+ };
+
+ var findParentInsertPoint = function (toBlock, block) {
+ var parents = Traverse.parents(block, function (elm) {
+ return Compare.eq(elm, toBlock);
+ });
+
+ return Option.from(parents[parents.length - 2]);
+ };
+
+ var getInsertionPoint = function (fromBlock, toBlock) {
+ if (Compare.contains(toBlock, fromBlock)) {
+ return Traverse.parent(fromBlock).bind(function (parent) {
+ return Compare.eq(parent, toBlock) ? Option.some(fromBlock) : findParentInsertPoint(toBlock, fromBlock);
+ });
+ } else {
+ return Option.none();
+ }
+ };
+
+ var mergeBlockInto = function (rootNode, fromBlock, toBlock) {
+ if (Empty.isEmpty(toBlock)) {
+ Remove.remove(toBlock);
+
+ if (Empty.isEmpty(fromBlock)) {
+ PaddingBr.fillWithPaddingBr(fromBlock);
+ }
+
+ return CaretFinder.firstPositionIn(fromBlock.dom());
+ } else {
+ trimBr(true, fromBlock);
+ trimBr(false, toBlock);
+
+ var children = extractChildren(fromBlock);
+
+ return getInsertionPoint(fromBlock, toBlock).fold(
+ function () {
+ removeEmptyRoot(rootNode, fromBlock);
+
+ var position = CaretFinder.lastPositionIn(toBlock.dom());
+
+ Arr.each(children, function (node) {
+ Insert.append(toBlock, node);
+ });
+
+ return position;
+ },
+ function (target) {
+ var position = CaretFinder.prevPosition(toBlock.dom(), CaretPosition.before(target.dom()));
+
+ Arr.each(children, function (node) {
+ Insert.before(target, node);
+ });
+
+ removeEmptyRoot(rootNode, fromBlock);
+
+ return position;
+ }
+ );
+ }
+ };
+
+ var mergeBlocks = function (rootNode, forward, block1, block2) {
+ return forward ? mergeBlockInto(rootNode, block2, block1) : mergeBlockInto(rootNode, block1, block2);
+ };
+
+ return {
+ mergeBlocks: mergeBlocks
+ };
+ }
+);
+
+/**
+ * BlockBoundaryDelete.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.BlockBoundaryDelete',
+ [
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.delete.BlockBoundary',
+ 'tinymce.core.delete.MergeBlocks'
+ ],
+ function (Element, BlockBoundary, MergeBlocks) {
+ var backspaceDelete = function (editor, forward) {
+ var position, rootNode = Element.fromDom(editor.getBody());
+
+ position = BlockBoundary.read(rootNode.dom(), forward, editor.selection.getRng()).bind(function (blockBoundary) {
+ return MergeBlocks.mergeBlocks(rootNode, forward, blockBoundary.from().block(), blockBoundary.to().block());
+ });
+
+ position.each(function (pos) {
+ editor.selection.setRng(pos.toRange());
+ });
+
+ return position.isSome();
+ };
+
+ return {
+ backspaceDelete: backspaceDelete
+ };
+ }
+);
+
+/**
+ * BlockRangeDelete.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.BlockRangeDelete',
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Options',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.PredicateFind',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.delete.DeleteUtils',
+ 'tinymce.core.delete.MergeBlocks',
+ 'tinymce.core.dom.ElementType'
+ ],
+ function (Fun, Options, Compare, Element, PredicateFind, CaretFinder, CaretPosition, DeleteUtils, MergeBlocks, ElementType) {
+ var deleteRangeMergeBlocks = function (rootNode, selection) {
+ var rng = selection.getRng();
+
+ return Options.liftN([
+ DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.startContainer)),
+ DeleteUtils.getParentBlock(rootNode, Element.fromDom(rng.endContainer))
+ ], function (block1, block2) {
+ if (Compare.eq(block1, block2) === false) {
+ rng.deleteContents();
+
+ MergeBlocks.mergeBlocks(rootNode, true, block1, block2).each(function (pos) {
+ selection.setRng(pos.toRange());
+ });
+
+ return true;
+ } else {
+ return false;
+ }
+ }).getOr(false);
+ };
+
+ var isRawNodeInTable = function (root, rawNode) {
+ var node = Element.fromDom(rawNode);
+ var isRoot = Fun.curry(Compare.eq, root);
+ return PredicateFind.ancestor(node, ElementType.isTableCell, isRoot).isSome();
+ };
+
+ var isSelectionInTable = function (root, rng) {
+ return isRawNodeInTable(root, rng.startContainer) || isRawNodeInTable(root, rng.endContainer);
+ };
+
+ var isEverythingSelected = function (root, rng) {
+ var noPrevious = CaretFinder.prevPosition(root.dom(), CaretPosition.fromRangeStart(rng)).isNone();
+ var noNext = CaretFinder.nextPosition(root.dom(), CaretPosition.fromRangeEnd(rng)).isNone();
+ return !isSelectionInTable(root, rng) && noPrevious && noNext;
+ };
+
+ var emptyEditor = function (editor) {
+ editor.setContent('');
+ editor.selection.setCursorLocation();
+ return true;
+ };
+
+ var deleteRange = function (editor) {
+ var rootNode = Element.fromDom(editor.getBody());
+ var rng = editor.selection.getRng();
+ return isEverythingSelected(rootNode, rng) ? emptyEditor(editor) : deleteRangeMergeBlocks(rootNode, editor.selection);
+ };
+
+ var backspaceDelete = function (editor, forward) {
+ return editor.selection.isCollapsed() ? false : deleteRange(editor, editor.selection.getRng());
+ };
+
+ return {
+ backspaceDelete: backspaceDelete
+ };
+ }
+);
+
+define(
+ 'ephox.katamari.api.Adt',
+
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Obj',
+ 'ephox.katamari.api.Type',
+ 'global!Array',
+ 'global!Error',
+ 'global!console'
+ ],
+
+ function (Arr, Obj, Type, Array, Error, console) {
+ /*
+ * Generates a church encoded ADT (https://en.wikipedia.org/wiki/Church_encoding)
+ * For syntax and use, look at the test code.
+ */
+ var generate = function (cases) {
+ // validation
+ if (!Type.isArray(cases)) {
+ throw new Error('cases must be an array');
+ }
+ if (cases.length === 0) {
+ throw new Error('there must be at least one case');
+ }
+
+ var constructors = [ ];
+
+ // adt is mutated to add the individual cases
+ var adt = {};
+ Arr.each(cases, function (acase, count) {
+ var keys = Obj.keys(acase);
+
+ // validation
+ if (keys.length !== 1) {
+ throw new Error('one and only one name per case');
+ }
+
+ var key = keys[0];
+ var value = acase[key];
+
+ // validation
+ if (adt[key] !== undefined) {
+ throw new Error('duplicate key detected:' + key);
+ } else if (key === 'cata') {
+ throw new Error('cannot have a case named cata (sorry)');
+ } else if (!Type.isArray(value)) {
+ // this implicitly checks if acase is an object
+ throw new Error('case arguments must be an array');
+ }
+
+ constructors.push(key);
+ //
+ // constructor for key
+ //
+ adt[key] = function () {
+ var argLength = arguments.length;
+
+ // validation
+ if (argLength !== value.length) {
+ throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
+ }
+
+ // Don't use array slice(arguments), makes the whole function unoptimisable on Chrome
+ var args = new Array(argLength);
+ for (var i = 0; i < args.length; i++) args[i] = arguments[i];
+
+
+ var match = function (branches) {
+ var branchKeys = Obj.keys(branches);
+ if (constructors.length !== branchKeys.length) {
+ throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
+ }
+
+ var allReqd = Arr.forall(constructors, function (reqKey) {
+ return Arr.contains(branchKeys, reqKey);
+ });
+
+ if (!allReqd) throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
+
+ return branches[key].apply(null, args);
+ };
+
+ //
+ // the fold function for key
+ //
+ return {
+ fold: function (/* arguments */) {
+ // runtime validation
+ if (arguments.length !== cases.length) {
+ throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + arguments.length);
+ }
+ var target = arguments[count];
+ return target.apply(null, args);
+ },
+ match: match,
+
+ // NOTE: Only for debugging.
+ log: function (label) {
+ console.log(label, {
+ constructors: constructors,
+ constructor: key,
+ params: args
+ });
+ }
+ };
+ };
+ });
+
+ return adt;
+ };
+ return {
+ generate: generate
+ };
+ }
+);
+/**
+ * CefDeleteAction.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.CefDeleteAction',
+ [
+ 'ephox.katamari.api.Adt',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.caret.CaretUtils',
+ 'tinymce.core.delete.DeleteUtils',
+ 'tinymce.core.dom.Empty',
+ 'tinymce.core.dom.NodeType'
+ ],
+ function (Adt, Option, Element, CaretFinder, CaretPosition, CaretUtils, DeleteUtils, Empty, NodeType) {
+ var DeleteAction = Adt.generate([
+ { remove: [ 'element' ] },
+ { moveToElement: [ 'element' ] },
+ { moveToPosition: [ 'position' ] }
+ ]);
+
+ var isAtContentEditableBlockCaret = function (forward, from) {
+ var elm = from.getNode(forward === false);
+ var caretLocation = forward ? 'after' : 'before';
+ return NodeType.isElement(elm) && elm.getAttribute('data-mce-caret') === caretLocation;
+ };
+
+ var deleteEmptyBlockOrMoveToCef = function (rootNode, forward, from, to) {
+ var toCefElm = to.getNode(forward === false);
+ return DeleteUtils.getParentBlock(Element.fromDom(rootNode), Element.fromDom(from.getNode())).map(function (blockElm) {
+ return Empty.isEmpty(blockElm) ? DeleteAction.remove(blockElm.dom()) : DeleteAction.moveToElement(toCefElm);
+ }).orThunk(function () {
+ return Option.some(DeleteAction.moveToElement(toCefElm));
+ });
+ };
+
+ var findCefPosition = function (rootNode, forward, from) {
+ return CaretFinder.fromPosition(forward, rootNode, from).bind(function (to) {
+ if (forward && NodeType.isContentEditableFalse(to.getNode())) {
+ return deleteEmptyBlockOrMoveToCef(rootNode, forward, from, to);
+ } else if (forward === false && NodeType.isContentEditableFalse(to.getNode(true))) {
+ return deleteEmptyBlockOrMoveToCef(rootNode, forward, from, to);
+ } else if (forward && CaretUtils.isAfterContentEditableFalse(from)) {
+ return Option.some(DeleteAction.moveToPosition(to));
+ } else if (forward === false && CaretUtils.isBeforeContentEditableFalse(from)) {
+ return Option.some(DeleteAction.moveToPosition(to));
+ } else {
+ return Option.none();
+ }
+ });
+ };
+
+ var getContentEditableBlockAction = function (forward, elm) {
+ if (forward && NodeType.isContentEditableFalse(elm.nextSibling)) {
+ return Option.some(DeleteAction.moveToElement(elm.nextSibling));
+ } else if (forward === false && NodeType.isContentEditableFalse(elm.previousSibling)) {
+ return Option.some(DeleteAction.moveToElement(elm.previousSibling));
+ } else {
+ return Option.none();
+ }
+ };
+
+ var skipMoveToActionFromInlineCefToContent = function (root, from, deleteAction) {
+ return deleteAction.fold(
+ function (elm) {
+ return Option.some(DeleteAction.remove(elm));
+ },
+ function (elm) {
+ return Option.some(DeleteAction.moveToElement(elm));
+ },
+ function (to) {
+ if (CaretUtils.isInSameBlock(from, to, root)) {
+ return Option.none();
+ } else {
+ return Option.some(DeleteAction.moveToPosition(to));
+ }
+ }
+ );
+ };
+
+ var getContentEditableAction = function (rootNode, forward, from) {
+ if (isAtContentEditableBlockCaret(forward, from)) {
+ return getContentEditableBlockAction(forward, from.getNode(forward === false))
+ .fold(
+ function () {
+ return findCefPosition(rootNode, forward, from);
+ },
+ Option.some
+ );
+ } else {
+ return findCefPosition(rootNode, forward, from).bind(function (deleteAction) {
+ return skipMoveToActionFromInlineCefToContent(rootNode, from, deleteAction);
+ });
+ }
+ };
+
+ var read = function (rootNode, forward, rng) {
+ var normalizedRange = CaretUtils.normalizeRange(forward ? 1 : -1, rootNode, rng);
+ var from = CaretPosition.fromRangeStart(normalizedRange);
+
+ if (forward === false && CaretUtils.isAfterContentEditableFalse(from)) {
+ return Option.some(DeleteAction.remove(from.getNode(true)));
+ } else if (forward && CaretUtils.isBeforeContentEditableFalse(from)) {
+ return Option.some(DeleteAction.remove(from.getNode()));
+ } else {
+ return getContentEditableAction(rootNode, forward, from);
+ }
+ };
+
+ return {
+ read: read
+ };
+ }
+);
+
+/**
+ * DeleteElement.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.DeleteElement',
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Options',
+ 'ephox.sugar.api.dom.Insert',
+ 'ephox.sugar.api.dom.Remove',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'ephox.sugar.api.search.PredicateFind',
+ 'ephox.sugar.api.search.Traverse',
+ 'tinymce.core.caret.CaretCandidate',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.dom.Empty',
+ 'tinymce.core.dom.NodeType'
+ ],
+ function (Fun, Option, Options, Insert, Remove, Element, Node, PredicateFind, Traverse, CaretCandidate, CaretFinder, CaretPosition, Empty, NodeType) {
+ var needsReposition = function (pos, elm) {
+ var container = pos.container();
+ var offset = pos.offset();
+ return CaretPosition.isTextPosition(pos) === false && container === elm.parentNode && offset > CaretPosition.before(elm).offset();
+ };
+
+ var reposition = function (elm, pos) {
+ return needsReposition(pos, elm) ? new CaretPosition(pos.container(), pos.offset() - 1) : pos;
+ };
+
+ var beforeOrStartOf = function (node) {
+ return NodeType.isText(node) ? new CaretPosition(node, 0) : CaretPosition.before(node);
+ };
+
+ var afterOrEndOf = function (node) {
+ return NodeType.isText(node) ? new CaretPosition(node, node.data.length) : CaretPosition.after(node);
+ };
+
+ var getPreviousSiblingCaretPosition = function (elm) {
+ if (CaretCandidate.isCaretCandidate(elm.previousSibling)) {
+ return Option.some(afterOrEndOf(elm.previousSibling));
+ } else {
+ return elm.previousSibling ? CaretFinder.lastPositionIn(elm.previousSibling) : Option.none();
+ }
+ };
+
+ var getNextSiblingCaretPosition = function (elm) {
+ if (CaretCandidate.isCaretCandidate(elm.nextSibling)) {
+ return Option.some(beforeOrStartOf(elm.nextSibling));
+ } else {
+ return elm.nextSibling ? CaretFinder.firstPositionIn(elm.nextSibling) : Option.none();
+ }
+ };
+
+ var findCaretPositionBackwardsFromElm = function (rootElement, elm) {
+ var startPosition = CaretPosition.before(elm.previousSibling ? elm.previousSibling : elm.parentNode);
+ return CaretFinder.prevPosition(rootElement, startPosition).fold(
+ function () {
+ return CaretFinder.nextPosition(rootElement, CaretPosition.after(elm));
+ },
+ Option.some
+ );
+ };
+
+ var findCaretPositionForwardsFromElm = function (rootElement, elm) {
+ return CaretFinder.nextPosition(rootElement, CaretPosition.after(elm)).fold(
+ function () {
+ return CaretFinder.prevPosition(rootElement, CaretPosition.before(elm));
+ },
+ Option.some
+ );
+ };
+
+ var findCaretPositionBackwards = function (rootElement, elm) {
+ return getPreviousSiblingCaretPosition(elm).orThunk(function () {
+ return getNextSiblingCaretPosition(elm);
+ }).orThunk(function () {
+ return findCaretPositionBackwardsFromElm(rootElement, elm);
+ });
+ };
+
+ var findCaretPositionForward = function (rootElement, elm) {
+ return getNextSiblingCaretPosition(elm).orThunk(function () {
+ return getPreviousSiblingCaretPosition(elm);
+ }).orThunk(function () {
+ return findCaretPositionForwardsFromElm(rootElement, elm);
+ });
+ };
+
+ var findCaretPosition = function (forward, rootElement, elm) {
+ return forward ? findCaretPositionForward(rootElement, elm) : findCaretPositionBackwards(rootElement, elm);
+ };
+
+ var findCaretPosOutsideElmAfterDelete = function (forward, rootElement, elm) {
+ return findCaretPosition(forward, rootElement, elm).map(Fun.curry(reposition, elm));
+ };
+
+ var setSelection = function (editor, forward, pos) {
+ pos.fold(
+ function () {
+ editor.focus();
+ },
+ function (pos) {
+ editor.selection.setRng(pos.toRange(), forward);
+ }
+ );
+ };
+
+ var eqRawNode = function (rawNode) {
+ return function (elm) {
+ return elm.dom() === rawNode;
+ };
+ };
+
+ var isBlock = function (editor, elm) {
+ return elm && editor.schema.getBlockElements().hasOwnProperty(Node.name(elm));
+ };
+
+ var paddEmptyBlock = function (elm) {
+ if (Empty.isEmpty(elm)) {
+ var br = Element.fromHtml(' ');
+ Remove.empty(elm);
+ Insert.append(elm, br);
+ return Option.some(CaretPosition.before(br.dom()));
+ } else {
+ return Option.none();
+ }
+ };
+
+ // When deleting an element between two text nodes IE 11 doesn't automatically merge the adjacent text nodes
+ var deleteNormalized = function (elm, afterDeletePosOpt) {
+ return Options.liftN([Traverse.prevSibling(elm), Traverse.nextSibling(elm), afterDeletePosOpt], function (prev, next, afterDeletePos) {
+ var offset, prevNode = prev.dom(), nextNode = next.dom();
+
+ if (NodeType.isText(prevNode) && NodeType.isText(nextNode)) {
+ offset = prevNode.data.length;
+ prevNode.appendData(nextNode.data);
+ Remove.remove(next);
+ Remove.remove(elm);
+ if (afterDeletePos.container() === nextNode) {
+ return new CaretPosition(prevNode, offset);
+ } else {
+ return afterDeletePos;
+ }
+ } else {
+ Remove.remove(elm);
+ return afterDeletePos;
+ }
+ }).orThunk(function () {
+ Remove.remove(elm);
+ return afterDeletePosOpt;
+ });
+ };
+
+ var deleteElement = function (editor, forward, elm) {
+ var afterDeletePos = findCaretPosOutsideElmAfterDelete(forward, editor.getBody(), elm.dom());
+ var parentBlock = PredicateFind.ancestor(elm, Fun.curry(isBlock, editor), eqRawNode(editor.getBody()));
+ var normalizedAfterDeletePos = deleteNormalized(elm, afterDeletePos);
+
+ if (editor.dom.isEmpty(editor.getBody())) {
+ editor.setContent('');
+ editor.selection.setCursorLocation();
+ } else {
+ parentBlock.bind(paddEmptyBlock).fold(
+ function () {
+ setSelection(editor, forward, normalizedAfterDeletePos);
+ },
+ function (paddPos) {
+ setSelection(editor, forward, Option.some(paddPos));
+ }
+ );
+ }
+ };
+
+ return {
+ deleteElement: deleteElement
+ };
+ }
+);
+/**
+ * CefDelete.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.CefDelete',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.sugar.api.dom.Remove',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.SelectorFilter',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.delete.CefDeleteAction',
+ 'tinymce.core.delete.DeleteElement',
+ 'tinymce.core.delete.DeleteUtils',
+ 'tinymce.core.dom.NodeType'
+ ],
+ function (Arr, Remove, Element, SelectorFilter, CaretPosition, CefDeleteAction, DeleteElement, DeleteUtils, NodeType) {
+ var deleteElement = function (editor, forward) {
+ return function (element) {
+ editor._selectionOverrides.hideFakeCaret();
+ DeleteElement.deleteElement(editor, forward, Element.fromDom(element));
+ return true;
+ };
+ };
+
+ var moveToElement = function (editor, forward) {
+ return function (element) {
+ var pos = forward ? CaretPosition.before(element) : CaretPosition.after(element);
+ editor.selection.setRng(pos.toRange());
+ return true;
+ };
+ };
+
+ var moveToPosition = function (editor) {
+ return function (pos) {
+ editor.selection.setRng(pos.toRange());
+ return true;
+ };
+ };
+
+ var backspaceDeleteCaret = function (editor, forward) {
+ var result = CefDeleteAction.read(editor.getBody(), forward, editor.selection.getRng()).map(function (deleteAction) {
+ return deleteAction.fold(
+ deleteElement(editor, forward),
+ moveToElement(editor, forward),
+ moveToPosition(editor)
+ );
+ });
+
+ return result.getOr(false);
+ };
+
+ var deleteOffscreenSelection = function (rootElement) {
+ Arr.each(SelectorFilter.descendants(rootElement, '.mce-offscreen-selection'), Remove.remove);
+ };
+
+ var backspaceDeleteRange = function (editor, forward) {
+ var selectedElement = editor.selection.getNode();
+ if (NodeType.isContentEditableFalse(selectedElement)) {
+ deleteOffscreenSelection(Element.fromDom(editor.getBody()));
+ DeleteElement.deleteElement(editor, forward, Element.fromDom(editor.selection.getNode()));
+ DeleteUtils.paddEmptyBody(editor);
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ var getContentEditableRoot = function (root, node) {
+ while (node && node !== root) {
+ if (NodeType.isContentEditableTrue(node) || NodeType.isContentEditableFalse(node)) {
+ return node;
+ }
+
+ node = node.parentNode;
+ }
+
+ return null;
+ };
+
+ var paddEmptyElement = function (editor) {
+ var br, ceRoot = getContentEditableRoot(editor.getBody(), editor.selection.getNode());
+
+ if (NodeType.isContentEditableTrue(ceRoot) && editor.dom.isBlock(ceRoot) && editor.dom.isEmpty(ceRoot)) {
+ br = editor.dom.create('br', { "data-mce-bogus": "1" });
+ editor.dom.setHTML(ceRoot, '');
+ ceRoot.appendChild(br);
+ editor.selection.setRng(CaretPosition.before(br).toRange());
+ }
+
+ return true;
+ };
+
+ var backspaceDelete = function (editor, forward) {
+ if (editor.selection.isCollapsed()) {
+ return backspaceDeleteCaret(editor, forward);
+ } else {
+ return backspaceDeleteRange(editor, forward);
+ }
+ };
+
+ return {
+ backspaceDelete: backspaceDelete,
+ paddEmptyElement: paddEmptyElement
+ };
+ }
+);
+
+/**
+ * CaretContainerInline.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.caret.CaretContainerInline',
+ [
+ 'ephox.katamari.api.Fun',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.text.Zwsp'
+ ],
+ function (Fun, NodeType, Zwsp) {
+ var isText = NodeType.isText;
+
+ var startsWithCaretContainer = function (node) {
+ return isText(node) && node.data[0] === Zwsp.ZWSP;
+ };
+
+ var endsWithCaretContainer = function (node) {
+ return isText(node) && node.data[node.data.length - 1] === Zwsp.ZWSP;
+ };
+
+ var createZwsp = function (node) {
+ return node.ownerDocument.createTextNode(Zwsp.ZWSP);
+ };
+
+ var insertBefore = function (node) {
+ if (isText(node.previousSibling)) {
+ if (endsWithCaretContainer(node.previousSibling)) {
+ return node.previousSibling;
+ } else {
+ node.previousSibling.appendData(Zwsp.ZWSP);
+ return node.previousSibling;
+ }
+ } else if (isText(node)) {
+ if (startsWithCaretContainer(node)) {
+ return node;
+ } else {
+ node.insertData(0, Zwsp.ZWSP);
+ return node;
+ }
+ } else {
+ var newNode = createZwsp(node);
+ node.parentNode.insertBefore(newNode, node);
+ return newNode;
+ }
+ };
+
+ var insertAfter = function (node) {
+ if (isText(node.nextSibling)) {
+ if (startsWithCaretContainer(node.nextSibling)) {
+ return node.nextSibling;
+ } else {
+ node.nextSibling.insertData(0, Zwsp.ZWSP);
+ return node.nextSibling;
+ }
+ } else if (isText(node)) {
+ if (endsWithCaretContainer(node)) {
+ return node;
+ } else {
+ node.appendData(Zwsp.ZWSP);
+ return node;
+ }
+ } else {
+ var newNode = createZwsp(node);
+ if (node.nextSibling) {
+ node.parentNode.insertBefore(newNode, node.nextSibling);
+ } else {
+ node.parentNode.appendChild(newNode);
+ }
+ return newNode;
+ }
+ };
+
+ var insertInline = function (before, node) {
+ return before ? insertBefore(node) : insertAfter(node);
+ };
+
+ return {
+ insertInline: insertInline,
+ insertInlineBefore: Fun.curry(insertInline, true),
+ insertInlineAfter: Fun.curry(insertInline, false)
+ };
+ }
+);
+/**
+ * CaretContainerRemove.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.caret.CaretContainerRemove',
+ [
+ 'ephox.katamari.api.Arr',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.text.Zwsp'
+ ],
+ function (Arr, CaretContainer, CaretPosition, NodeType, Zwsp) {
+ var isElement = NodeType.isElement;
+ var isText = NodeType.isText;
+
+ var removeNode = function (node) {
+ var parentNode = node.parentNode;
+ if (parentNode) {
+ parentNode.removeChild(node);
+ }
+ };
+
+ var getNodeValue = function (node) {
+ try {
+ return node.nodeValue;
+ } catch (ex) {
+ // IE sometimes produces "Invalid argument" on nodes
+ return "";
+ }
+ };
+
+ var setNodeValue = function (node, text) {
+ if (text.length === 0) {
+ removeNode(node);
+ } else {
+ node.nodeValue = text;
+ }
+ };
+
+ var trimCount = function (text) {
+ var trimmedText = Zwsp.trim(text);
+ return { count: text.length - trimmedText.length, text: trimmedText };
+ };
+
+ var removeUnchanged = function (caretContainer, pos) {
+ remove(caretContainer);
+ return pos;
+ };
+
+ var removeTextAndReposition = function (caretContainer, pos) {
+ var before = trimCount(caretContainer.data.substr(0, pos.offset()));
+ var after = trimCount(caretContainer.data.substr(pos.offset()));
+ var text = before.text + after.text;
+
+ if (text.length > 0) {
+ setNodeValue(caretContainer, text);
+ return new CaretPosition(caretContainer, pos.offset() - before.count);
+ } else {
+ return pos;
+ }
+ };
+
+ var removeElementAndReposition = function (caretContainer, pos) {
+ var parentNode = pos.container();
+ var newPosition = Arr.indexOf(parentNode.childNodes, caretContainer).map(function (index) {
+ return index < pos.offset() ? new CaretPosition(parentNode, pos.offset() - 1) : pos;
+ }).getOr(pos);
+ remove(caretContainer);
+ return newPosition;
+ };
+
+ var removeTextCaretContainer = function (caretContainer, pos) {
+ return pos.container() === caretContainer ? removeTextAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
+ };
+
+ var removeElementCaretContainer = function (caretContainer, pos) {
+ return pos.container() === caretContainer.parentNode ? removeElementAndReposition(caretContainer, pos) : removeUnchanged(caretContainer, pos);
+ };
+
+ var removeAndReposition = function (container, pos) {
+ return CaretPosition.isTextPosition(pos) ? removeTextCaretContainer(container, pos) : removeElementCaretContainer(container, pos);
+ };
+
+ var remove = function (caretContainerNode) {
+ if (isElement(caretContainerNode) && CaretContainer.isCaretContainer(caretContainerNode)) {
+ if (CaretContainer.hasContent(caretContainerNode)) {
+ caretContainerNode.removeAttribute('data-mce-caret');
+ } else {
+ removeNode(caretContainerNode);
+ }
+ }
+
+ if (isText(caretContainerNode)) {
+ var text = Zwsp.trim(getNodeValue(caretContainerNode));
+ setNodeValue(caretContainerNode, text);
+ }
+ };
+
+ return {
+ removeAndReposition: removeAndReposition,
+ remove: remove
+ };
+ }
+);
+/**
+ * BoundaryCaret.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.BoundaryCaret',
+ [
+ 'ephox.katamari.api.Option',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.caret.CaretContainerInline',
+ 'tinymce.core.caret.CaretContainerRemove',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.keyboard.InlineUtils'
+ ],
+ function (Option, CaretContainer, CaretContainerInline, CaretContainerRemove, CaretFinder, CaretPosition, NodeType, InlineUtils) {
+ var insertInlinePos = function (pos, before) {
+ if (NodeType.isText(pos.container())) {
+ return CaretContainerInline.insertInline(before, pos.container());
+ } else {
+ return CaretContainerInline.insertInline(before, pos.getNode());
+ }
+ };
+
+ var isPosCaretContainer = function (pos, caret) {
+ var caretNode = caret.get();
+ return caretNode && pos.container() === caretNode && CaretContainer.isCaretContainerInline(caretNode);
+ };
+
+ var renderCaret = function (caret, location) {
+ return location.fold(
+ function (element) { // Before
+ CaretContainerRemove.remove(caret.get());
+ var text = CaretContainerInline.insertInlineBefore(element);
+ caret.set(text);
+ return Option.some(new CaretPosition(text, text.length - 1));
+ },
+ function (element) { // Start
+ return CaretFinder.firstPositionIn(element).map(function (pos) {
+ if (!isPosCaretContainer(pos, caret)) {
+ CaretContainerRemove.remove(caret.get());
+ var text = insertInlinePos(pos, true);
+ caret.set(text);
+ return new CaretPosition(text, 1);
+ } else {
+ return new CaretPosition(caret.get(), 1);
+ }
+ });
+ },
+ function (element) { // End
+ return CaretFinder.lastPositionIn(element).map(function (pos) {
+ if (!isPosCaretContainer(pos, caret)) {
+ CaretContainerRemove.remove(caret.get());
+ var text = insertInlinePos(pos, false);
+ caret.set(text);
+ return new CaretPosition(text, text.length - 1);
+ } else {
+ return new CaretPosition(caret.get(), caret.get().length - 1);
+ }
+ });
+ },
+ function (element) { // After
+ CaretContainerRemove.remove(caret.get());
+ var text = CaretContainerInline.insertInlineAfter(element);
+ caret.set(text);
+ return Option.some(new CaretPosition(text, 1));
+ }
+ );
+ };
+
+ return {
+ renderCaret: renderCaret
+ };
+ }
+);
+/**
+ * FormatUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.fmt.FormatUtils',
+ [
+ 'tinymce.core.dom.TreeWalker'
+ ],
+ function (TreeWalker) {
+ var isInlineBlock = function (node) {
+ return node && /^(IMG)$/.test(node.nodeName);
+ };
+
+ var moveStart = function (dom, selection, rng) {
+ var container = rng.startContainer,
+ offset = rng.startOffset,
+ walker, node, nodes;
+
+ if (rng.startContainer === rng.endContainer) {
+ if (isInlineBlock(rng.startContainer.childNodes[rng.startOffset])) {
+ return;
+ }
+ }
+
+ // Convert text node into index if possible
+ if (container.nodeType === 3 && offset >= container.nodeValue.length) {
+ // Get the parent container location and walk from there
+ offset = dom.nodeIndex(container);
+ container = container.parentNode;
+ }
+
+ // Move startContainer/startOffset in to a suitable node
+ if (container.nodeType === 1) {
+ nodes = container.childNodes;
+ if (offset < nodes.length) {
+ container = nodes[offset];
+ walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));
+ } else {
+ container = nodes[nodes.length - 1];
+ walker = new TreeWalker(container, dom.getParent(container, dom.isBlock));
+ walker.next(true);
+ }
+
+ for (node = walker.current(); node; node = walker.next()) {
+ if (node.nodeType === 3 && !isWhiteSpaceNode(node)) {
+ rng.setStart(node, 0);
+ selection.setRng(rng);
+
+ return;
+ }
+ }
+ }
+ };
+
+ /**
+ * Returns the next/previous non whitespace node.
+ *
+ * @private
+ * @param {Node} node Node to start at.
+ * @param {boolean} next (Optional) Include next or previous node defaults to previous.
+ * @param {boolean} inc (Optional) Include the current node in checking. Defaults to false.
+ * @return {Node} Next or previous node or undefined if it wasn't found.
+ */
+ var getNonWhiteSpaceSibling = function (node, next, inc) {
+ if (node) {
+ next = next ? 'nextSibling' : 'previousSibling';
+
+ for (node = inc ? node : node[next]; node; node = node[next]) {
+ if (node.nodeType === 1 || !isWhiteSpaceNode(node)) {
+ return node;
+ }
+ }
+ }
+ };
+
+ var isTextBlock = function (editor, name) {
+ if (name.nodeType) {
+ name = name.nodeName;
+ }
+
+ return !!editor.schema.getTextBlockElements()[name.toLowerCase()];
+ };
+
+ var isValid = function (ed, parent, child) {
+ return ed.schema.isValidChild(parent, child);
+ };
+
+ var isWhiteSpaceNode = function (node) {
+ return node && node.nodeType === 3 && /^([\t \r\n]+|)$/.test(node.nodeValue);
+ };
+
+ /**
+ * Replaces variables in the value. The variable format is %var.
+ *
+ * @private
+ * @param {String} value Value to replace variables in.
+ * @param {Object} vars Name/value array with variables to replace.
+ * @return {String} New value with replaced variables.
+ */
+ var replaceVars = function (value, vars) {
+ if (typeof value !== "string") {
+ value = value(vars);
+ } else if (vars) {
+ value = value.replace(/%(\w+)/g, function (str, name) {
+ return vars[name] || str;
+ });
+ }
+
+ return value;
+ };
+
+ /**
+ * Compares two string/nodes regardless of their case.
+ *
+ * @private
+ * @param {String/Node} str1 Node or string to compare.
+ * @param {String/Node} str2 Node or string to compare.
+ * @return {boolean} True/false if they match.
+ */
+ var isEq = function (str1, str2) {
+ str1 = str1 || '';
+ str2 = str2 || '';
+
+ str1 = '' + (str1.nodeName || str1);
+ str2 = '' + (str2.nodeName || str2);
+
+ return str1.toLowerCase() === str2.toLowerCase();
+ };
+
+ var normalizeStyleValue = function (dom, value, name) {
+ // Force the format to hex
+ if (name === 'color' || name === 'backgroundColor') {
+ value = dom.toHex(value);
+ }
+
+ // Opera will return bold as 700
+ if (name === 'fontWeight' && value === 700) {
+ value = 'bold';
+ }
+
+ // Normalize fontFamily so "'Font name', Font" becomes: "Font name,Font"
+ if (name === 'fontFamily') {
+ value = value.replace(/[\'\"]/g, '').replace(/,\s+/g, ',');
+ }
+
+ return '' + value;
+ };
+
+ var getStyle = function (dom, node, name) {
+ return normalizeStyleValue(dom, dom.getStyle(node, name), name);
+ };
+
+ var getTextDecoration = function (dom, node) {
+ var decoration;
+
+ dom.getParent(node, function (n) {
+ decoration = dom.getStyle(n, 'text-decoration');
+ return decoration && decoration !== 'none';
+ });
+
+ return decoration;
+ };
+
+ var getParents = function (dom, node, selector) {
+ return dom.getParents(node, selector, dom.getRoot());
+ };
+
+ return {
+ isInlineBlock: isInlineBlock,
+ moveStart: moveStart,
+ getNonWhiteSpaceSibling: getNonWhiteSpaceSibling,
+ isTextBlock: isTextBlock,
+ isValid: isValid,
+ isWhiteSpaceNode: isWhiteSpaceNode,
+ replaceVars: replaceVars,
+ isEq: isEq,
+ normalizeStyleValue: normalizeStyleValue,
+ getStyle: getStyle,
+ getTextDecoration: getTextDecoration,
+ getParents: getParents
+ };
+ }
+);
+/**
+ * ExpandRange.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.fmt.ExpandRange',
+ [
+ 'tinymce.core.dom.Bookmarks',
+ 'tinymce.core.dom.TreeWalker',
+ 'tinymce.core.fmt.FormatUtils',
+ 'tinymce.core.selection.RangeNodes'
+ ],
+ function (Bookmarks, TreeWalker, FormatUtils, RangeNodes) {
+ var isBookmarkNode = Bookmarks.isBookmarkNode;
+ var getParents = FormatUtils.getParents, isWhiteSpaceNode = FormatUtils.isWhiteSpaceNode, isTextBlock = FormatUtils.isTextBlock;
+
+ // This function walks down the tree to find the leaf at the selection.
+ // The offset is also returned as if node initially a leaf, the offset may be in the middle of the text node.
+ var findLeaf = function (node, offset) {
+ if (typeof offset === 'undefined') {
+ offset = node.nodeType === 3 ? node.length : node.childNodes.length;
+ }
+
+ while (node && node.hasChildNodes()) {
+ node = node.childNodes[offset];
+ if (node) {
+ offset = node.nodeType === 3 ? node.length : node.childNodes.length;
+ }
+ }
+
+ return { node: node, offset: offset };
+ };
+
+ var excludeTrailingWhitespace = function (endContainer, endOffset) {
+ // Avoid applying formatting to a trailing space,
+ // but remove formatting from trailing space
+ var leaf = findLeaf(endContainer, endOffset);
+ if (leaf.node) {
+ while (leaf.node && leaf.offset === 0 && leaf.node.previousSibling) {
+ leaf = findLeaf(leaf.node.previousSibling);
+ }
+
+ if (leaf.node && leaf.offset > 0 && leaf.node.nodeType === 3 &&
+ leaf.node.nodeValue.charAt(leaf.offset - 1) === ' ') {
+
+ if (leaf.offset > 1) {
+ endContainer = leaf.node;
+ endContainer.splitText(leaf.offset - 1);
+ }
+ }
+ }
+
+ return endContainer;
+ };
+
+ var isBogusBr = function (node) {
+ return node.nodeName === "BR" && node.getAttribute('data-mce-bogus') && !node.nextSibling;
+ };
+
+ // Expands the node to the closes contentEditable false element if it exists
+ var findParentContentEditable = function (dom, node) {
+ var parent = node;
+
+ while (parent) {
+ if (parent.nodeType === 1 && dom.getContentEditable(parent)) {
+ return dom.getContentEditable(parent) === "false" ? parent : node;
+ }
+
+ parent = parent.parentNode;
+ }
+
+ return node;
+ };
+
+ var findSpace = function (start, remove, node, offset) {
+ var pos, pos2, str = node.nodeValue;
+
+ if (typeof offset === "undefined") {
+ offset = start ? str.length : 0;
+ }
+
+ if (start) {
+ pos = str.lastIndexOf(' ', offset);
+ pos2 = str.lastIndexOf('\u00a0', offset);
+ pos = pos > pos2 ? pos : pos2;
+
+ // Include the space on remove to avoid tag soup
+ if (pos !== -1 && !remove) {
+ pos++;
+ }
+ } else {
+ pos = str.indexOf(' ', offset);
+ pos2 = str.indexOf('\u00a0', offset);
+ pos = pos !== -1 && (pos2 === -1 || pos < pos2) ? pos : pos2;
+ }
+
+ return pos;
+ };
+
+ var findWordEndPoint = function (dom, body, container, offset, start, remove) {
+ var walker, node, pos, lastTextNode;
+
+ if (container.nodeType === 3) {
+ pos = findSpace(start, remove, container, offset);
+
+ if (pos !== -1) {
+ return { container: container, offset: pos };
+ }
+
+ lastTextNode = container;
+ }
+
+ // Walk the nodes inside the block
+ walker = new TreeWalker(container, dom.getParent(container, dom.isBlock) || body);
+ while ((node = walker[start ? 'prev' : 'next']())) {
+ if (node.nodeType === 3) {
+ lastTextNode = node;
+ pos = findSpace(start, remove, node);
+
+ if (pos !== -1) {
+ return { container: node, offset: pos };
+ }
+ } else if (dom.isBlock(node)) {
+ break;
+ }
+ }
+
+ if (lastTextNode) {
+ if (start) {
+ offset = 0;
+ } else {
+ offset = lastTextNode.length;
+ }
+
+ return { container: lastTextNode, offset: offset };
+ }
+ };
+
+ var findSelectorEndPoint = function (dom, format, rng, container, siblingName) {
+ var parents, i, y, curFormat;
+
+ if (container.nodeType === 3 && container.nodeValue.length === 0 && container[siblingName]) {
+ container = container[siblingName];
+ }
+
+ parents = getParents(dom, container);
+ for (i = 0; i < parents.length; i++) {
+ for (y = 0; y < format.length; y++) {
+ curFormat = format[y];
+
+ // If collapsed state is set then skip formats that doesn't match that
+ if ("collapsed" in curFormat && curFormat.collapsed !== rng.collapsed) {
+ continue;
+ }
+
+ if (dom.is(parents[i], curFormat.selector)) {
+ return parents[i];
+ }
+ }
+ }
+
+ return container;
+ };
+
+ var findBlockEndPoint = function (editor, format, container, siblingName) {
+ var node, dom = editor.dom, root = dom.getRoot();
+
+ // Expand to block of similar type
+ if (!format[0].wrapper) {
+ node = dom.getParent(container, format[0].block, root);
+ }
+
+ // Expand to first wrappable block element or any block element
+ if (!node) {
+ var scopeRoot = dom.getParent(container, 'LI,TD,TH');
+ node = dom.getParent(container.nodeType === 3 ? container.parentNode : container, function (node) {
+ // Fixes #6183 where it would expand to editable parent element in inline mode
+ return node !== root && isTextBlock(editor, node);
+ }, scopeRoot);
+ }
+
+ // Exclude inner lists from wrapping
+ if (node && format[0].wrapper) {
+ node = getParents(dom, node, 'ul,ol').reverse()[0] || node;
+ }
+
+ // Didn't find a block element look for first/last wrappable element
+ if (!node) {
+ node = container;
+
+ while (node[siblingName] && !dom.isBlock(node[siblingName])) {
+ node = node[siblingName];
+
+ // Break on BR but include it will be removed later on
+ // we can't remove it now since we need to check if it can be wrapped
+ if (FormatUtils.isEq(node, 'br')) {
+ break;
+ }
+ }
+ }
+
+ return node || container;
+ };
+
+ // This function walks up the tree if there is no siblings before/after the node
+ var findParentContainer = function (dom, format, startContainer, startOffset, endContainer, endOffset, start) {
+ var container, parent, sibling, siblingName, root;
+
+ container = parent = start ? startContainer : endContainer;
+ siblingName = start ? 'previousSibling' : 'nextSibling';
+ root = dom.getRoot();
+
+ // If it's a text node and the offset is inside the text
+ if (container.nodeType === 3 && !isWhiteSpaceNode(container)) {
+ if (start ? startOffset > 0 : endOffset < container.nodeValue.length) {
+ return container;
+ }
+ }
+
+ /*eslint no-constant-condition:0 */
+ while (true) {
+ // Stop expanding on block elements
+ if (!format[0].block_expand && dom.isBlock(parent)) {
+ return parent;
+ }
+
+ // Walk left/right
+ for (sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) {
+ if (!isBookmarkNode(sibling) && !isWhiteSpaceNode(sibling) && !isBogusBr(sibling)) {
+ return parent;
+ }
+ }
+
+ // Check if we can move up are we at root level or body level
+ if (parent === root || parent.parentNode === root) {
+ container = parent;
+ break;
+ }
+
+ parent = parent.parentNode;
+ }
+
+ return container;
+ };
+
+ var expandRng = function (editor, rng, format, remove) {
+ var endPoint,
+ startContainer = rng.startContainer,
+ startOffset = rng.startOffset,
+ endContainer = rng.endContainer,
+ endOffset = rng.endOffset,
+ dom = editor.dom;
+
+ // If index based start position then resolve it
+ if (startContainer.nodeType === 1 && startContainer.hasChildNodes()) {
+ startContainer = RangeNodes.getNode(startContainer, startOffset);
+ if (startContainer.nodeType === 3) {
+ startOffset = 0;
+ }
+ }
+
+ // If index based end position then resolve it
+ if (endContainer.nodeType === 1 && endContainer.hasChildNodes()) {
+ endContainer = RangeNodes.getNode(endContainer, rng.collapsed ? endOffset : endOffset - 1);
+ if (endContainer.nodeType === 3) {
+ endOffset = endContainer.nodeValue.length;
+ }
+ }
+
+ // Expand to closest contentEditable element
+ startContainer = findParentContentEditable(dom, startContainer);
+ endContainer = findParentContentEditable(dom, endContainer);
+
+ // Exclude bookmark nodes if possible
+ if (isBookmarkNode(startContainer.parentNode) || isBookmarkNode(startContainer)) {
+ startContainer = isBookmarkNode(startContainer) ? startContainer : startContainer.parentNode;
+ startContainer = startContainer.nextSibling || startContainer;
+
+ if (startContainer.nodeType === 3) {
+ startOffset = 0;
+ }
+ }
+
+ if (isBookmarkNode(endContainer.parentNode) || isBookmarkNode(endContainer)) {
+ endContainer = isBookmarkNode(endContainer) ? endContainer : endContainer.parentNode;
+ endContainer = endContainer.previousSibling || endContainer;
+
+ if (endContainer.nodeType === 3) {
+ endOffset = endContainer.length;
+ }
+ }
+
+ if (format[0].inline) {
+ if (rng.collapsed) {
+ // Expand left to closest word boundary
+ endPoint = findWordEndPoint(dom, editor.getBody(), startContainer, startOffset, true, remove);
+ if (endPoint) {
+ startContainer = endPoint.container;
+ startOffset = endPoint.offset;
+ }
+
+ // Expand right to closest word boundary
+ endPoint = findWordEndPoint(dom, editor.getBody(), endContainer, endOffset, false, remove);
+ if (endPoint) {
+ endContainer = endPoint.container;
+ endOffset = endPoint.offset;
+ }
+ }
+
+ endContainer = remove ? endContainer : excludeTrailingWhitespace(endContainer, endOffset);
+ }
+
+ // Move start/end point up the tree if the leaves are sharp and if we are in different containers
+ // Example * becomes !: !
*texttext*
!
+ // This will reduce the number of wrapper elements that needs to be created
+ // Move start point up the tree
+ if (format[0].inline || format[0].block_expand) {
+ if (!format[0].inline || (startContainer.nodeType !== 3 || startOffset === 0)) {
+ startContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, true);
+ }
+
+ if (!format[0].inline || (endContainer.nodeType !== 3 || endOffset === endContainer.nodeValue.length)) {
+ endContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, false);
+ }
+ }
+
+ // Expand start/end container to matching selector
+ if (format[0].selector && format[0].expand !== false && !format[0].inline) {
+ // Find new startContainer/endContainer if there is better one
+ startContainer = findSelectorEndPoint(dom, format, rng, startContainer, 'previousSibling');
+ endContainer = findSelectorEndPoint(dom, format, rng, endContainer, 'nextSibling');
+ }
+
+ // Expand start/end container to matching block element or text node
+ if (format[0].block || format[0].selector) {
+ // Find new startContainer/endContainer if there is better one
+ startContainer = findBlockEndPoint(editor, format, startContainer, 'previousSibling');
+ endContainer = findBlockEndPoint(editor, format, endContainer, 'nextSibling');
+
+ // Non block element then try to expand up the leaf
+ if (format[0].block) {
+ if (!dom.isBlock(startContainer)) {
+ startContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, true);
+ }
+
+ if (!dom.isBlock(endContainer)) {
+ endContainer = findParentContainer(dom, format, startContainer, startOffset, endContainer, endOffset, false);
+ }
+ }
+ }
+
+ // Setup index for startContainer
+ if (startContainer.nodeType === 1) {
+ startOffset = dom.nodeIndex(startContainer);
+ startContainer = startContainer.parentNode;
+ }
+
+ // Setup index for endContainer
+ if (endContainer.nodeType === 1) {
+ endOffset = dom.nodeIndex(endContainer) + 1;
+ endContainer = endContainer.parentNode;
+ }
+
+ // Return new range like object
+ return {
+ startContainer: startContainer,
+ startOffset: startOffset,
+ endContainer: endContainer,
+ endOffset: endOffset
+ };
+ };
+
+ return {
+ expandRng: expandRng
+ };
+ }
+);
+/**
+ * MatchFormat.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.fmt.MatchFormat',
+ [
+ 'tinymce.core.fmt.FormatUtils'
+ ],
+ function (FormatUtils) {
+ var isEq = FormatUtils.isEq;
+
+ var matchesUnInheritedFormatSelector = function (ed, node, name) {
+ var formatList = ed.formatter.get(name);
+
+ if (formatList) {
+ for (var i = 0; i < formatList.length; i++) {
+ if (formatList[i].inherit === false && ed.dom.is(node, formatList[i].selector)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ };
+
+ var matchParents = function (editor, node, name, vars) {
+ var root = editor.dom.getRoot();
+
+ if (node === root) {
+ return false;
+ }
+
+ // Find first node with similar format settings
+ node = editor.dom.getParent(node, function (node) {
+ if (matchesUnInheritedFormatSelector(editor, node, name)) {
+ return true;
+ }
+
+ return node.parentNode === root || !!matchNode(editor, node, name, vars, true);
+ });
+
+ // Do an exact check on the similar format element
+ return matchNode(editor, node, name, vars);
+ };
+
+ var matchName = function (dom, node, format) {
+ // Check for inline match
+ if (isEq(node, format.inline)) {
+ return true;
+ }
+
+ // Check for block match
+ if (isEq(node, format.block)) {
+ return true;
+ }
+
+ // Check for selector match
+ if (format.selector) {
+ return node.nodeType === 1 && dom.is(node, format.selector);
+ }
+ };
+
+ var matchItems = function (dom, node, format, itemName, similar, vars) {
+ var key, value, items = format[itemName], i;
+
+ // Custom match
+ if (format.onmatch) {
+ return format.onmatch(node, format, itemName);
+ }
+
+ // Check all items
+ if (items) {
+ // Non indexed object
+ if (typeof items.length === 'undefined') {
+ for (key in items) {
+ if (items.hasOwnProperty(key)) {
+ if (itemName === 'attributes') {
+ value = dom.getAttrib(node, key);
+ } else {
+ value = FormatUtils.getStyle(dom, node, key);
+ }
+
+ if (similar && !value && !format.exact) {
+ return;
+ }
+
+ if ((!similar || format.exact) && !isEq(value, FormatUtils.normalizeStyleValue(dom, FormatUtils.replaceVars(items[key], vars), key))) {
+ return;
+ }
+ }
+ }
+ } else {
+ // Only one match needed for indexed arrays
+ for (i = 0; i < items.length; i++) {
+ if (itemName === 'attributes' ? dom.getAttrib(node, items[i]) : FormatUtils.getStyle(dom, node, items[i])) {
+ return format;
+ }
+ }
+ }
+ }
+
+ return format;
+ };
+
+ var matchNode = function (ed, node, name, vars, similar) {
+ var formatList = ed.formatter.get(name), format, i, x, classes, dom = ed.dom;
+
+ if (formatList && node) {
+ // Check each format in list
+ for (i = 0; i < formatList.length; i++) {
+ format = formatList[i];
+
+ // Name name, attributes, styles and classes
+ if (matchName(ed.dom, node, format) && matchItems(dom, node, format, 'attributes', similar, vars) && matchItems(dom, node, format, 'styles', similar, vars)) {
+ // Match classes
+ if ((classes = format.classes)) {
+ for (x = 0; x < classes.length; x++) {
+ if (!ed.dom.hasClass(node, classes[x])) {
+ return;
+ }
+ }
+ }
+
+ return format;
+ }
+ }
+ }
+ };
+
+ var match = function (editor, name, vars, node) {
+ var startNode;
+
+ // Check specified node
+ if (node) {
+ return matchParents(editor, node, name, vars);
+ }
+
+ // Check selected node
+ node = editor.selection.getNode();
+ if (matchParents(editor, node, name, vars)) {
+ return true;
+ }
+
+ // Check start node if it's different
+ startNode = editor.selection.getStart();
+ if (startNode !== node) {
+ if (matchParents(editor, startNode, name, vars)) {
+ return true;
+ }
+ }
+
+ return false;
+ };
+
+ var matchAll = function (editor, names, vars) {
+ var startElement, matchedFormatNames = [], checkedMap = {};
+
+ // Check start of selection for formats
+ startElement = editor.selection.getStart();
+ editor.dom.getParent(startElement, function (node) {
+ var i, name;
+
+ for (i = 0; i < names.length; i++) {
+ name = names[i];
+
+ if (!checkedMap[name] && matchNode(editor, node, name, vars)) {
+ checkedMap[name] = true;
+ matchedFormatNames.push(name);
+ }
+ }
+ }, editor.dom.getRoot());
+
+ return matchedFormatNames;
+ };
+
+ var canApply = function (editor, name) {
+ var formatList = editor.formatter.get(name), startNode, parents, i, x, selector, dom = editor.dom;
+
+ if (formatList) {
+ startNode = editor.selection.getStart();
+ parents = FormatUtils.getParents(dom, startNode);
+
+ for (x = formatList.length - 1; x >= 0; x--) {
+ selector = formatList[x].selector;
+
+ // Format is not selector based then always return TRUE
+ // Is it has a defaultBlock then it's likely it can be applied for example align on a non block element line
+ if (!selector || formatList[x].defaultBlock) {
+ return true;
+ }
+
+ for (i = parents.length - 1; i >= 0; i--) {
+ if (dom.is(parents[i], selector)) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ };
+
+ return {
+ matchNode: matchNode,
+ matchName: matchName,
+ match: match,
+ matchAll: matchAll,
+ canApply: canApply,
+ matchesUnInheritedFormatSelector: matchesUnInheritedFormatSelector
+ };
+ }
+);
+/**
+ * SplitRange.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.SplitRange',
+ [
+ 'tinymce.core.dom.NodeType'
+ ],
+ function (NodeType) {
+ var splitText = function (node, offset) {
+ return node.splitText(offset);
+ };
+
+ var split = function (rng) {
+ var startContainer = rng.startContainer,
+ startOffset = rng.startOffset,
+ endContainer = rng.endContainer,
+ endOffset = rng.endOffset;
+
+ // Handle single text node
+ if (startContainer === endContainer && NodeType.isText(startContainer)) {
+ if (startOffset > 0 && startOffset < startContainer.nodeValue.length) {
+ endContainer = splitText(startContainer, startOffset);
+ startContainer = endContainer.previousSibling;
+
+ if (endOffset > startOffset) {
+ endOffset = endOffset - startOffset;
+ startContainer = endContainer = splitText(endContainer, endOffset).previousSibling;
+ endOffset = endContainer.nodeValue.length;
+ startOffset = 0;
+ } else {
+ endOffset = 0;
+ }
+ }
+ } else {
+ // Split startContainer text node if needed
+ if (NodeType.isText(startContainer) && startOffset > 0 && startOffset < startContainer.nodeValue.length) {
+ startContainer = splitText(startContainer, startOffset);
+ startOffset = 0;
+ }
+
+ // Split endContainer text node if needed
+ if (NodeType.isText(endContainer) && endOffset > 0 && endOffset < endContainer.nodeValue.length) {
+ endContainer = splitText(endContainer, endOffset).previousSibling;
+ endOffset = endContainer.nodeValue.length;
+ }
+ }
+
+ return {
+ startContainer: startContainer,
+ startOffset: startOffset,
+ endContainer: endContainer,
+ endOffset: endOffset
+ };
+ };
+
+ return {
+ split: split
+ };
+ }
+);
+
+/**
+ * CaretFormat.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.fmt.CaretFormat',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.sugar.api.dom.Insert',
+ 'ephox.sugar.api.dom.Remove',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'ephox.sugar.api.properties.Attr',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.PaddingBr',
+ 'tinymce.core.dom.TreeWalker',
+ 'tinymce.core.fmt.ExpandRange',
+ 'tinymce.core.fmt.FormatUtils',
+ 'tinymce.core.fmt.MatchFormat',
+ 'tinymce.core.selection.SplitRange',
+ 'tinymce.core.text.Zwsp',
+ 'tinymce.core.util.Fun'
+ ],
+ function (Arr, Insert, Remove, Element, Node, Attr, CaretPosition, NodeType, PaddingBr, TreeWalker, ExpandRange, FormatUtils, MatchFormat, SplitRange, Zwsp, Fun) {
+ var ZWSP = Zwsp.ZWSP, CARET_ID = '_mce_caret';
+
+ var importNode = function (ownerDocument, node) {
+ return ownerDocument.importNode(node, true);
+ };
+
+ var isCaretNode = function (node) {
+ return node.nodeType === 1 && node.id === CARET_ID;
+ };
+
+ var getEmptyCaretContainers = function (node) {
+ var nodes = [];
+
+ while (node) {
+ if ((node.nodeType === 3 && node.nodeValue !== ZWSP) || node.childNodes.length > 1) {
+ return [];
+ }
+
+ // Collect nodes
+ if (node.nodeType === 1) {
+ nodes.push(node);
+ }
+
+ node = node.firstChild;
+ }
+
+ return nodes;
+ };
+
+ var isCaretContainerEmpty = function (node) {
+ return getEmptyCaretContainers(node).length > 0;
+ };
+
+ var findFirstTextNode = function (node) {
+ var walker;
+
+ if (node) {
+ walker = new TreeWalker(node, node);
+
+ for (node = walker.current(); node; node = walker.next()) {
+ if (node.nodeType === 3) {
+ return node;
+ }
+ }
+ }
+
+ return null;
+ };
+
+ var createCaretContainer = function (fill) {
+ var caretContainer = Element.fromTag('span');
+
+ Attr.setAll(caretContainer, {
+ //style: 'color:red',
+ id: CARET_ID,
+ 'data-mce-bogus': '1',
+ 'data-mce-type': 'format-caret'
+ });
+
+ if (fill) {
+ Insert.append(caretContainer, Element.fromText(ZWSP));
+ }
+
+ return caretContainer;
+ };
+
+ var getParentCaretContainer = function (body, node) {
+ while (node && node !== body) {
+ if (node.id === CARET_ID) {
+ return node;
+ }
+
+ node = node.parentNode;
+ }
+
+ return null;
+ };
+
+ var trimZwspFromCaretContainer = function (caretContainerNode) {
+ var textNode = findFirstTextNode(caretContainerNode);
+ if (textNode && textNode.nodeValue.charAt(0) === ZWSP) {
+ textNode.deleteData(0, 1);
+ }
+
+ return textNode;
+ };
+
+ var removeCaretContainerNode = function (dom, selection, node, moveCaret) {
+ var rng, block, textNode;
+
+ rng = selection.getRng(true);
+ block = dom.getParent(node, dom.isBlock);
+
+ if (isCaretContainerEmpty(node)) {
+ if (moveCaret !== false) {
+ rng.setStartBefore(node);
+ rng.setEndBefore(node);
+ }
+
+ dom.remove(node);
+ } else {
+ textNode = trimZwspFromCaretContainer(node);
+ if (rng.startContainer === textNode && rng.startOffset > 0) {
+ rng.setStart(textNode, rng.startOffset - 1);
+ }
+
+ if (rng.endContainer === textNode && rng.endOffset > 0) {
+ rng.setEnd(textNode, rng.endOffset - 1);
+ }
+
+ dom.remove(node, true);
+ }
+
+ if (block && dom.isEmpty(block)) {
+ PaddingBr.fillWithPaddingBr(Element.fromDom(block));
+ }
+
+ selection.setRng(rng);
+ };
+
+ // Removes the caret container for the specified node or all on the current document
+ var removeCaretContainer = function (body, dom, selection, node, moveCaret) {
+ if (!node) {
+ node = getParentCaretContainer(body, selection.getStart());
+
+ if (!node) {
+ while ((node = dom.get(CARET_ID))) {
+ removeCaretContainerNode(dom, selection, node, false);
+ }
+ }
+ } else {
+ removeCaretContainerNode(dom, selection, node, moveCaret);
+ }
+ };
+
+ var insertCaretContainerNode = function (editor, caretContainer, formatNode) {
+ var dom = editor.dom, block = dom.getParent(formatNode, Fun.curry(FormatUtils.isTextBlock, editor));
+
+ if (block && dom.isEmpty(block)) {
+ // Replace formatNode with caretContainer when removing format from empty block like
|
+ formatNode.parentNode.replaceChild(caretContainer, formatNode);
+ } else {
+ PaddingBr.removeTrailingBr(Element.fromDom(formatNode));
+ if (dom.isEmpty(formatNode)) {
+ formatNode.parentNode.replaceChild(caretContainer, formatNode);
+ } else {
+ dom.insertAfter(caretContainer, formatNode);
+ }
+ }
+ };
+
+ var appendNode = function (parentNode, node) {
+ parentNode.appendChild(node);
+ return node;
+ };
+
+ var insertFormatNodesIntoCaretContainer = function (formatNodes, caretContainer) {
+ var innerMostFormatNode = Arr.foldr(formatNodes, function (parentNode, formatNode) {
+ return appendNode(parentNode, formatNode.cloneNode(false));
+ }, caretContainer);
+
+ return appendNode(innerMostFormatNode, innerMostFormatNode.ownerDocument.createTextNode(ZWSP));
+ };
+
+ var applyCaretFormat = function (editor, name, vars) {
+ var rng, caretContainer, textNode, offset, bookmark, container, text;
+ var selection = editor.selection;
+
+ rng = selection.getRng(true);
+ offset = rng.startOffset;
+ container = rng.startContainer;
+ text = container.nodeValue;
+
+ caretContainer = getParentCaretContainer(editor.getBody(), selection.getStart());
+ if (caretContainer) {
+ textNode = findFirstTextNode(caretContainer);
+ }
+
+ // Expand to word if caret is in the middle of a text node and the char before/after is a alpha numeric character
+ var wordcharRegex = /[^\s\u00a0\u00ad\u200b\ufeff]/;
+ if (text && offset > 0 && offset < text.length &&
+ wordcharRegex.test(text.charAt(offset)) && wordcharRegex.test(text.charAt(offset - 1))) {
+ // Get bookmark of caret position
+ bookmark = selection.getBookmark();
+
+ // Collapse bookmark range (WebKit)
+ rng.collapse(true);
+
+ // Expand the range to the closest word and split it at those points
+ rng = ExpandRange.expandRng(editor, rng, editor.formatter.get(name));
+ rng = SplitRange.split(rng);
+
+ // Apply the format to the range
+ editor.formatter.apply(name, vars, rng);
+
+ // Move selection back to caret position
+ selection.moveToBookmark(bookmark);
+ } else {
+ if (!caretContainer || textNode.nodeValue !== ZWSP) {
+ // Need to import the node into the document on IE or we get a lovely WrongDocument exception
+ caretContainer = importNode(editor.getDoc(), createCaretContainer(true).dom());
+ textNode = caretContainer.firstChild;
+
+ rng.insertNode(caretContainer);
+ offset = 1;
+
+ editor.formatter.apply(name, vars, caretContainer);
+ } else {
+ editor.formatter.apply(name, vars, caretContainer);
+ }
+
+ // Move selection to text node
+ selection.setCursorLocation(textNode, offset);
+ }
+ };
+
+ var removeCaretFormat = function (editor, name, vars, similar) {
+ var dom = editor.dom, selection = editor.selection;
+ var rng = selection.getRng(true), container, offset, bookmark;
+ var hasContentAfter, node, formatNode, parents = [], caretContainer;
+
+ container = rng.startContainer;
+ offset = rng.startOffset;
+ node = container;
+
+ if (container.nodeType === 3) {
+ if (offset !== container.nodeValue.length) {
+ hasContentAfter = true;
+ }
+
+ node = node.parentNode;
+ }
+
+ while (node) {
+ if (MatchFormat.matchNode(editor, node, name, vars, similar)) {
+ formatNode = node;
+ break;
+ }
+
+ if (node.nextSibling) {
+ hasContentAfter = true;
+ }
+
+ parents.push(node);
+ node = node.parentNode;
+ }
+
+ // Node doesn't have the specified format
+ if (!formatNode) {
+ return;
+ }
+
+ // Is there contents after the caret then remove the format on the element
+ if (hasContentAfter) {
+ bookmark = selection.getBookmark();
+
+ // Collapse bookmark range (WebKit)
+ rng.collapse(true);
+
+ // Expand the range to the closest word and split it at those points
+ rng = ExpandRange.expandRng(editor, rng, editor.formatter.get(name), true);
+ rng = SplitRange.split(rng);
+
+ editor.formatter.remove(name, vars, rng);
+ selection.moveToBookmark(bookmark);
+ } else {
+ caretContainer = getParentCaretContainer(editor.getBody(), formatNode);
+ var newCaretContainer = createCaretContainer(false).dom();
+ var caretNode = insertFormatNodesIntoCaretContainer(parents, newCaretContainer);
+
+ if (caretContainer) {
+ insertCaretContainerNode(editor, newCaretContainer, caretContainer);
+ } else {
+ insertCaretContainerNode(editor, newCaretContainer, formatNode);
+ }
+
+ removeCaretContainerNode(dom, selection, caretContainer, false);
+ selection.setCursorLocation(caretNode, 1);
+
+ if (dom.isEmpty(formatNode)) {
+ dom.remove(formatNode);
+ }
+ }
+ };
+
+ var disableCaretContainer = function (body, dom, selection, keyCode) {
+ removeCaretContainer(body, dom, selection, null, false);
+
+ // Remove caret container if it's empty
+ if (keyCode === 8 && selection.isCollapsed() && selection.getStart().innerHTML === ZWSP) {
+ removeCaretContainer(body, dom, selection, getParentCaretContainer(body, selection.getStart()));
+ }
+
+ // Remove caret container on keydown and it's left/right arrow keys
+ if (keyCode === 37 || keyCode === 39) {
+ removeCaretContainer(body, dom, selection, getParentCaretContainer(body, selection.getStart()));
+ }
+ };
+
+ var setup = function (editor) {
+ var dom = editor.dom, selection = editor.selection;
+ var body = editor.getBody();
+
+ editor.on('mouseup keydown', function (e) {
+ disableCaretContainer(body, dom, selection, e.keyCode);
+ });
+ };
+
+ var replaceWithCaretFormat = function (targetNode, formatNodes) {
+ var caretContainer = createCaretContainer(false);
+ var innerMost = insertFormatNodesIntoCaretContainer(formatNodes, caretContainer.dom());
+ Insert.before(Element.fromDom(targetNode), caretContainer);
+ Remove.remove(Element.fromDom(targetNode));
+
+ return CaretPosition(innerMost, 0);
+ };
+
+ var isFormatElement = function (editor, element) {
+ var inlineElements = editor.schema.getTextInlineElements();
+ return inlineElements.hasOwnProperty(Node.name(element)) && !isCaretNode(element.dom()) && !NodeType.isBogus(element.dom());
+ };
+
+ return {
+ setup: setup,
+ applyCaretFormat: applyCaretFormat,
+ removeCaretFormat: removeCaretFormat,
+ isCaretNode: isCaretNode,
+ getParentCaretContainer: getParentCaretContainer,
+ replaceWithCaretFormat: replaceWithCaretFormat,
+ isFormatElement: isFormatElement
+ };
+ }
+);
+/**
+ * LazyEvaluator.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.util.LazyEvaluator',
+ [
+ 'ephox.katamari.api.Option'
+ ],
+ function (Option) {
+ var evaluateUntil = function (fns, args) {
+ for (var i = 0; i < fns.length; i++) {
+ var result = fns[i].apply(null, args);
+ if (result.isSome()) {
+ return result;
+ }
+ }
+
+ return Option.none();
+ };
+
+ return {
+ evaluateUntil: evaluateUntil
+ };
+ }
+);
+/**
+ * BoundaryLocation.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.BoundaryLocation',
+ [
+ 'ephox.katamari.api.Adt',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Options',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretUtils',
+ 'tinymce.core.fmt.CaretFormat',
+ 'tinymce.core.keyboard.InlineUtils',
+ 'tinymce.core.util.LazyEvaluator'
+ ],
+ function (Adt, Fun, Option, Options, CaretFinder, CaretUtils, CaretFormat, InlineUtils, LazyEvaluator) {
+ var Location = Adt.generate([
+ { before: [ 'element' ] },
+ { start: [ 'element' ] },
+ { end: [ 'element' ] },
+ { after: [ 'element' ] }
+ ]);
+
+ var rescope = function (rootNode, node) {
+ var parentBlock = CaretUtils.getParentBlock(node, rootNode);
+ return parentBlock ? parentBlock : rootNode;
+ };
+
+ var before = function (isInlineTarget, rootNode, pos) {
+ var nPos = InlineUtils.normalizeForwards(pos);
+ var scope = rescope(rootNode, nPos.container());
+ return InlineUtils.findRootInline(isInlineTarget, scope, nPos).fold(
+ function () {
+ return CaretFinder.nextPosition(scope, nPos)
+ .bind(Fun.curry(InlineUtils.findRootInline, isInlineTarget, scope))
+ .map(function (inline) {
+ return Location.before(inline);
+ });
+ },
+ Option.none
+ );
+ };
+
+ var isNotInsideFormatCaretContainer = function (rootNode, elm) {
+ return CaretFormat.getParentCaretContainer(rootNode, elm) === null;
+ };
+
+ var findInsideRootInline = function (isInlineTarget, rootNode, pos) {
+ return InlineUtils.findRootInline(isInlineTarget, rootNode, pos).filter(Fun.curry(isNotInsideFormatCaretContainer, rootNode));
+ };
+
+ var start = function (isInlineTarget, rootNode, pos) {
+ var nPos = InlineUtils.normalizeBackwards(pos);
+ return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (inline) {
+ var prevPos = CaretFinder.prevPosition(inline, nPos);
+ return prevPos.isNone() ? Option.some(Location.start(inline)) : Option.none();
+ });
+ };
+
+ var end = function (isInlineTarget, rootNode, pos) {
+ var nPos = InlineUtils.normalizeForwards(pos);
+ return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (inline) {
+ var nextPos = CaretFinder.nextPosition(inline, nPos);
+ return nextPos.isNone() ? Option.some(Location.end(inline)) : Option.none();
+ });
+ };
+
+ var after = function (isInlineTarget, rootNode, pos) {
+ var nPos = InlineUtils.normalizeBackwards(pos);
+ var scope = rescope(rootNode, nPos.container());
+ return InlineUtils.findRootInline(isInlineTarget, scope, nPos).fold(
+ function () {
+ return CaretFinder.prevPosition(scope, nPos)
+ .bind(Fun.curry(InlineUtils.findRootInline, isInlineTarget, scope))
+ .map(function (inline) {
+ return Location.after(inline);
+ });
+ },
+ Option.none
+ );
+ };
+
+ var isValidLocation = function (location) {
+ return InlineUtils.isRtl(getElement(location)) === false;
+ };
+
+ var readLocation = function (isInlineTarget, rootNode, pos) {
+ var location = LazyEvaluator.evaluateUntil([
+ before,
+ start,
+ end,
+ after
+ ], [isInlineTarget, rootNode, pos]);
+
+ return location.filter(isValidLocation);
+ };
+
+ var getElement = function (location) {
+ return location.fold(
+ Fun.identity, // Before
+ Fun.identity, // Start
+ Fun.identity, // End
+ Fun.identity // After
+ );
+ };
+
+ var getName = function (location) {
+ return location.fold(
+ Fun.constant('before'), // Before
+ Fun.constant('start'), // Start
+ Fun.constant('end'), // End
+ Fun.constant('after') // After
+ );
+ };
+
+ var outside = function (location) {
+ return location.fold(
+ Location.before, // Before
+ Location.before, // Start
+ Location.after, // End
+ Location.after // After
+ );
+ };
+
+ var inside = function (location) {
+ return location.fold(
+ Location.start, // Before
+ Location.start, // Start
+ Location.end, // End
+ Location.end // After
+ );
+ };
+
+ var isEq = function (location1, location2) {
+ return getName(location1) === getName(location2) && getElement(location1) === getElement(location2);
+ };
+
+ var betweenInlines = function (forward, isInlineTarget, rootNode, from, to, location) {
+ return Options.liftN([
+ InlineUtils.findRootInline(isInlineTarget, rootNode, from),
+ InlineUtils.findRootInline(isInlineTarget, rootNode, to)
+ ], function (fromInline, toInline) {
+ if (fromInline !== toInline && InlineUtils.hasSameParentBlock(rootNode, fromInline, toInline)) {
+ // Force after since some browsers normalize and lean left into the closest inline
+ return Location.after(forward ? fromInline : toInline);
+ } else {
+ return location;
+ }
+ }).getOr(location);
+ };
+
+ var skipNoMovement = function (fromLocation, toLocation) {
+ return fromLocation.fold(
+ Fun.constant(true),
+ function (fromLocation) {
+ return !isEq(fromLocation, toLocation);
+ }
+ );
+ };
+
+ var findLocationTraverse = function (forward, isInlineTarget, rootNode, fromLocation, pos) {
+ var from = InlineUtils.normalizePosition(forward, pos);
+ var to = CaretFinder.fromPosition(forward, rootNode, from).map(Fun.curry(InlineUtils.normalizePosition, forward));
+
+ var location = to.fold(
+ function () {
+ return fromLocation.map(outside);
+ },
+ function (to) {
+ return readLocation(isInlineTarget, rootNode, to)
+ .map(Fun.curry(betweenInlines, forward, isInlineTarget, rootNode, from, to))
+ .filter(Fun.curry(skipNoMovement, fromLocation));
+ }
+ );
+
+ return location.filter(isValidLocation);
+ };
+
+ var findLocationSimple = function (forward, location) {
+ if (forward) {
+ return location.fold(
+ Fun.compose(Option.some, Location.start), // Before -> Start
+ Option.none,
+ Fun.compose(Option.some, Location.after), // End -> After
+ Option.none
+ );
+ } else {
+ return location.fold(
+ Option.none,
+ Fun.compose(Option.some, Location.before), // Before <- Start
+ Option.none,
+ Fun.compose(Option.some, Location.end) // End <- After
+ );
+ }
+ };
+
+ var findLocation = function (forward, isInlineTarget, rootNode, pos) {
+ var from = InlineUtils.normalizePosition(forward, pos);
+ var fromLocation = readLocation(isInlineTarget, rootNode, from);
+
+ return readLocation(isInlineTarget, rootNode, from).bind(Fun.curry(findLocationSimple, forward)).orThunk(function () {
+ return findLocationTraverse(forward, isInlineTarget, rootNode, fromLocation, pos);
+ });
+ };
+
+ return {
+ readLocation: readLocation,
+ findLocation: findLocation,
+ prevLocation: Fun.curry(findLocation, false),
+ nextLocation: Fun.curry(findLocation, true),
+ getElement: getElement,
+ outside: outside,
+ inside: inside
+ };
+ }
+);
+define(
+ 'ephox.katamari.api.Cell',
+
+ [
+ ],
+
+ function () {
+ var Cell = function (initial) {
+ var value = initial;
+
+ var get = function () {
+ return value;
+ };
+
+ var set = function (v) {
+ value = v;
+ };
+
+ var clone = function () {
+ return Cell(get());
+ };
+
+ return {
+ get: get,
+ set: set,
+ clone: clone
+ };
+ };
+
+ return Cell;
+ }
+);
+
+/**
+ * WordSelection.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.WordSelection',
+ [
+ 'ephox.katamari.api.Type',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.caret.CaretPosition'
+ ],
+ function (Type, CaretContainer, CaretPosition) {
+ var hasSelectionModifyApi = function (editor) {
+ return Type.isFunction(editor.selection.getSel().modify);
+ };
+
+ var moveRel = function (forward, selection, pos) {
+ var delta = forward ? 1 : -1;
+ selection.setRng(CaretPosition(pos.container(), pos.offset() + delta).toRange());
+ selection.getSel().modify('move', forward ? 'forward' : 'backward', 'word');
+ return true;
+ };
+
+ var moveByWord = function (forward, editor) {
+ var rng = editor.selection.getRng();
+ var pos = forward ? CaretPosition.fromRangeEnd(rng) : CaretPosition.fromRangeStart(rng);
+
+ if (!hasSelectionModifyApi(editor)) {
+ return false;
+ } else if (forward && CaretContainer.isBeforeInline(pos)) {
+ return moveRel(true, editor.selection, pos);
+ } else if (!forward && CaretContainer.isAfterInline(pos)) {
+ return moveRel(false, editor.selection, pos);
+ } else {
+ return false;
+ }
+ };
+
+ return {
+ hasSelectionModifyApi: hasSelectionModifyApi,
+ moveByWord: moveByWord
+ };
+ }
+);
+/**
+ * BoundarySelection.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.BoundarySelection',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Cell',
+ 'ephox.katamari.api.Fun',
+ 'tinymce.core.caret.CaretContainerRemove',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.keyboard.BoundaryCaret',
+ 'tinymce.core.keyboard.BoundaryLocation',
+ 'tinymce.core.keyboard.InlineUtils',
+ 'tinymce.core.selection.WordSelection'
+ ],
+ function (Arr, Cell, Fun, CaretContainerRemove, CaretPosition, BoundaryCaret, BoundaryLocation, InlineUtils, WordSelection) {
+ var setCaretPosition = function (editor, pos) {
+ var rng = editor.dom.createRng();
+ rng.setStart(pos.container(), pos.offset());
+ rng.setEnd(pos.container(), pos.offset());
+ editor.selection.setRng(rng);
+ };
+
+ var isFeatureEnabled = function (editor) {
+ return editor.settings.inline_boundaries !== false;
+ };
+
+ var setSelected = function (state, elm) {
+ if (state) {
+ elm.setAttribute('data-mce-selected', 'inline-boundary');
+ } else {
+ elm.removeAttribute('data-mce-selected');
+ }
+ };
+
+ var renderCaretLocation = function (editor, caret, location) {
+ return BoundaryCaret.renderCaret(caret, location).map(function (pos) {
+ setCaretPosition(editor, pos);
+ return location;
+ });
+ };
+
+ var findLocation = function (editor, caret, forward) {
+ var rootNode = editor.getBody();
+ var from = CaretPosition.fromRangeStart(editor.selection.getRng());
+ var isInlineTarget = Fun.curry(InlineUtils.isInlineTarget, editor);
+ var location = BoundaryLocation.findLocation(forward, isInlineTarget, rootNode, from);
+ return location.bind(function (location) {
+ return renderCaretLocation(editor, caret, location);
+ });
+ };
+
+ var toggleInlines = function (isInlineTarget, dom, elms) {
+ var selectedInlines = Arr.filter(dom.select('*[data-mce-selected="inline-boundary"]'), isInlineTarget);
+ var targetInlines = Arr.filter(elms, isInlineTarget);
+ Arr.each(Arr.difference(selectedInlines, targetInlines), Fun.curry(setSelected, false));
+ Arr.each(Arr.difference(targetInlines, selectedInlines), Fun.curry(setSelected, true));
+ };
+
+ var safeRemoveCaretContainer = function (editor, caret) {
+ if (editor.selection.isCollapsed() && editor.composing !== true && caret.get()) {
+ var pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+ if (CaretPosition.isTextPosition(pos) && InlineUtils.isAtZwsp(pos) === false) {
+ setCaretPosition(editor, CaretContainerRemove.removeAndReposition(caret.get(), pos));
+ caret.set(null);
+ }
+ }
+ };
+
+ var renderInsideInlineCaret = function (isInlineTarget, editor, caret, elms) {
+ if (editor.selection.isCollapsed()) {
+ var inlines = Arr.filter(elms, isInlineTarget);
+ Arr.each(inlines, function (inline) {
+ var pos = CaretPosition.fromRangeStart(editor.selection.getRng());
+ BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), pos).bind(function (location) {
+ return renderCaretLocation(editor, caret, location);
+ });
+ });
+ }
+ };
+
+ var move = function (editor, caret, forward) {
+ return function () {
+ return isFeatureEnabled(editor) ? findLocation(editor, caret, forward).isSome() : false;
+ };
+ };
+
+ var moveWord = function (forward, editor, caret) {
+ return function () {
+ return isFeatureEnabled(editor) ? WordSelection.moveByWord(forward, editor) : false;
+ };
+ };
+
+ var setupSelectedState = function (editor) {
+ var caret = new Cell(null);
+ var isInlineTarget = Fun.curry(InlineUtils.isInlineTarget, editor);
+
+ editor.on('NodeChange', function (e) {
+ if (isFeatureEnabled(editor)) {
+ toggleInlines(isInlineTarget, editor.dom, e.parents);
+ safeRemoveCaretContainer(editor, caret);
+ renderInsideInlineCaret(isInlineTarget, editor, caret, e.parents);
+ }
+ });
+
+ return caret;
+ };
+
+ return {
+ move: move,
+ moveNextWord: Fun.curry(moveWord, true),
+ movePrevWord: Fun.curry(moveWord, false),
+ setupSelectedState: setupSelectedState,
+ setCaretPosition: setCaretPosition
+ };
+ }
+);
+/**
+ * InlineBoundaryDelete.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.InlineBoundaryDelete',
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Options',
+ 'ephox.sugar.api.node.Element',
+ 'global!document',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.caret.CaretUtils',
+ 'tinymce.core.delete.DeleteElement',
+ 'tinymce.core.keyboard.BoundaryCaret',
+ 'tinymce.core.keyboard.BoundaryLocation',
+ 'tinymce.core.keyboard.BoundarySelection',
+ 'tinymce.core.keyboard.InlineUtils'
+ ],
+ function (
+ Fun, Option, Options, Element, document, CaretContainer, CaretFinder, CaretPosition, CaretUtils, DeleteElement, BoundaryCaret, BoundaryLocation, BoundarySelection,
+ InlineUtils
+ ) {
+ var isFeatureEnabled = function (editor) {
+ return editor.settings.inline_boundaries !== false;
+ };
+
+ var rangeFromPositions = function (from, to) {
+ var range = document.createRange();
+
+ range.setStart(from.container(), from.offset());
+ range.setEnd(to.container(), to.offset());
+
+ return range;
+ };
+
+ // Checks for delete at |a when there is only one item left except the zwsp caret container nodes
+ var hasOnlyTwoOrLessPositionsLeft = function (elm) {
+ return Options.liftN([
+ CaretFinder.firstPositionIn(elm),
+ CaretFinder.lastPositionIn(elm)
+ ], function (firstPos, lastPos) {
+ var normalizedFirstPos = InlineUtils.normalizePosition(true, firstPos);
+ var normalizedLastPos = InlineUtils.normalizePosition(false, lastPos);
+
+ return CaretFinder.nextPosition(elm, normalizedFirstPos).map(function (pos) {
+ return pos.isEqual(normalizedLastPos);
+ }).getOr(true);
+ }).getOr(true);
+ };
+
+ var setCaretLocation = function (editor, caret) {
+ return function (location) {
+ return BoundaryCaret.renderCaret(caret, location).map(function (pos) {
+ BoundarySelection.setCaretPosition(editor, pos);
+ return true;
+ }).getOr(false);
+ };
+ };
+
+ var deleteFromTo = function (editor, caret, from, to) {
+ var rootNode = editor.getBody();
+ var isInlineTarget = Fun.curry(InlineUtils.isInlineTarget, editor);
+
+ editor.undoManager.ignore(function () {
+ editor.selection.setRng(rangeFromPositions(from, to));
+ editor.execCommand('Delete');
+
+ BoundaryLocation.readLocation(isInlineTarget, rootNode, CaretPosition.fromRangeStart(editor.selection.getRng()))
+ .map(BoundaryLocation.inside)
+ .map(setCaretLocation(editor, caret));
+ });
+
+ editor.nodeChanged();
+ };
+
+ var rescope = function (rootNode, node) {
+ var parentBlock = CaretUtils.getParentBlock(node, rootNode);
+ return parentBlock ? parentBlock : rootNode;
+ };
+
+ var backspaceDeleteCollapsed = function (editor, caret, forward, from) {
+ var rootNode = rescope(editor.getBody(), from.container());
+ var isInlineTarget = Fun.curry(InlineUtils.isInlineTarget, editor);
+ var fromLocation = BoundaryLocation.readLocation(isInlineTarget, rootNode, from);
+
+ return fromLocation.bind(function (location) {
+ if (forward) {
+ return location.fold(
+ Fun.constant(Option.some(BoundaryLocation.inside(location))), // Before
+ Option.none, // Start
+ Fun.constant(Option.some(BoundaryLocation.outside(location))), // End
+ Option.none // After
+ );
+ } else {
+ return location.fold(
+ Option.none, // Before
+ Fun.constant(Option.some(BoundaryLocation.outside(location))), // Start
+ Option.none, // End
+ Fun.constant(Option.some(BoundaryLocation.inside(location))) // After
+ );
+ }
+ })
+ .map(setCaretLocation(editor, caret))
+ .getOrThunk(function () {
+ var toPosition = CaretFinder.navigate(forward, rootNode, from);
+ var toLocation = toPosition.bind(function (pos) {
+ return BoundaryLocation.readLocation(isInlineTarget, rootNode, pos);
+ });
+
+ if (fromLocation.isSome() && toLocation.isSome()) {
+ return InlineUtils.findRootInline(isInlineTarget, rootNode, from).map(function (elm) {
+ if (hasOnlyTwoOrLessPositionsLeft(elm)) {
+ DeleteElement.deleteElement(editor, forward, Element.fromDom(elm));
+ return true;
+ } else {
+ return false;
+ }
+ }).getOr(false);
+ } else {
+ return toLocation.bind(function (_) {
+ return toPosition.map(function (to) {
+ if (forward) {
+ deleteFromTo(editor, caret, from, to);
+ } else {
+ deleteFromTo(editor, caret, to, from);
+ }
+
+ return true;
+ });
+ }).getOr(false);
+ }
+ });
+ };
+
+ var backspaceDelete = function (editor, caret, forward) {
+ if (editor.selection.isCollapsed() && isFeatureEnabled(editor)) {
+ var from = CaretPosition.fromRangeStart(editor.selection.getRng());
+ return backspaceDeleteCollapsed(editor, caret, forward, from);
+ }
+
+ return false;
+ };
+
+ return {
+ backspaceDelete: backspaceDelete
+ };
+ }
+);
+define(
+ 'tinymce.core.delete.TableDeleteAction',
+
+ [
+ 'ephox.katamari.api.Adt',
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Options',
+ 'ephox.katamari.api.Struct',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.SelectorFilter',
+ 'ephox.sugar.api.search.SelectorFind'
+ ],
+
+ function (Adt, Arr, Fun, Option, Options, Struct, Compare, Element, SelectorFilter, SelectorFind) {
+ var tableCellRng = Struct.immutable('start', 'end');
+ var tableSelection = Struct.immutable('rng', 'table', 'cells');
+ var deleteAction = Adt.generate([
+ { removeTable: [ 'element' ] },
+ { emptyCells: [ 'cells' ] }
+ ]);
+
+ var getClosestCell = function (container, isRoot) {
+ return SelectorFind.closest(Element.fromDom(container), 'td,th', isRoot);
+ };
+
+ var getClosestTable = function (cell, isRoot) {
+ return SelectorFind.ancestor(cell, 'table', isRoot);
+ };
+
+ var isExpandedCellRng = function (cellRng) {
+ return Compare.eq(cellRng.start(), cellRng.end()) === false;
+ };
+
+ var getTableFromCellRng = function (cellRng, isRoot) {
+ return getClosestTable(cellRng.start(), isRoot)
+ .bind(function (startParentTable) {
+ return getClosestTable(cellRng.end(), isRoot)
+ .bind(function (endParentTable) {
+ return Compare.eq(startParentTable, endParentTable) ? Option.some(startParentTable) : Option.none();
+ });
+ });
+ };
+
+ var getCellRng = function (rng, isRoot) {
+ return Options.liftN([ // get start and end cell
+ getClosestCell(rng.startContainer, isRoot),
+ getClosestCell(rng.endContainer, isRoot)
+ ], tableCellRng)
+ .filter(isExpandedCellRng);
+ };
+
+ var getTableSelectionFromCellRng = function (cellRng, isRoot) {
+ return getTableFromCellRng(cellRng, isRoot)
+ .bind(function (table) {
+ var cells = SelectorFilter.descendants(table, 'td,th');
+
+ return tableSelection(cellRng, table, cells);
+ });
+ };
+
+ var getTableSelectionFromRng = function (rootNode, rng) {
+ var isRoot = Fun.curry(Compare.eq, rootNode);
+
+ return getCellRng(rng, isRoot)
+ .map(function (cellRng) {
+ return getTableSelectionFromCellRng(cellRng, isRoot);
+ });
+ };
+
+ var getCellIndex = function (cellArray, cell) {
+ return Arr.findIndex(cellArray, function (x) {
+ return Compare.eq(x, cell);
+ });
+ };
+
+ var getSelectedCells = function (tableSelection) {
+ return Options.liftN([
+ getCellIndex(tableSelection.cells(), tableSelection.rng().start()),
+ getCellIndex(tableSelection.cells(), tableSelection.rng().end())
+ ], function (startIndex, endIndex) {
+ return tableSelection.cells().slice(startIndex, endIndex + 1);
+ });
+ };
+
+ var getAction = function (tableSelection) {
+ return getSelectedCells(tableSelection)
+ .bind(function (selected) {
+ var cells = tableSelection.cells();
+
+ return selected.length === cells.length ? deleteAction.removeTable(tableSelection.table()) : deleteAction.emptyCells(selected);
+ });
+ };
+
+ var getActionFromCells = function (cells) {
+ return deleteAction.emptyCells(cells);
+ };
+
+ var getActionFromRange = function (rootNode, rng) {
+ return getTableSelectionFromRng(rootNode, rng)
+ .map(getAction);
+ };
+
+ return {
+ getActionFromRange: getActionFromRange,
+ getActionFromCells: getActionFromCells
+ };
+ }
+);
+
+/**
+ * MultiRange.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.MultiRange',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.selection.RangeNodes'
+ ],
+ function (Arr, Element, RangeNodes) {
+ var getRanges = function (selection) {
+ var ranges = [];
+
+ if (selection) {
+ for (var i = 0; i < selection.rangeCount; i++) {
+ ranges.push(selection.getRangeAt(i));
+ }
+ }
+
+ return ranges;
+ };
+
+ var getSelectedNodes = function (ranges) {
+ return Arr.bind(ranges, function (range) {
+ var node = RangeNodes.getSelectedNode(range);
+ return node ? [ Element.fromDom(node) ] : [];
+ });
+ };
+
+ var hasMultipleRanges = function (selection) {
+ return getRanges(selection).length > 1;
+ };
+
+ return {
+ getRanges: getRanges,
+ getSelectedNodes: getSelectedNodes,
+ hasMultipleRanges: hasMultipleRanges
+ };
+ }
+);
+
+/**
+ * TableCellSelection.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.TableCellSelection',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.SelectorFilter',
+ 'tinymce.core.dom.ElementType',
+ 'tinymce.core.selection.MultiRange'
+ ],
+ function (Arr, Element, SelectorFilter, ElementType, MultiRange) {
+ var getCellsFromRanges = function (ranges) {
+ return Arr.filter(MultiRange.getSelectedNodes(ranges), ElementType.isTableCell);
+ };
+
+ var getCellsFromElement = function (elm) {
+ var selectedCells = SelectorFilter.descendants(elm, 'td[data-mce-selected],th[data-mce-selected]');
+ return selectedCells;
+ };
+
+ var getCellsFromElementOrRanges = function (ranges, element) {
+ var selectedCells = getCellsFromElement(element);
+ var rangeCells = getCellsFromRanges(ranges);
+ return selectedCells.length > 0 ? selectedCells : rangeCells;
+ };
+
+ var getCellsFromEditor = function (editor) {
+ return getCellsFromElementOrRanges(MultiRange.getRanges(editor.selection.getSel()), Element.fromDom(editor.getBody()));
+ };
+
+ return {
+ getCellsFromRanges: getCellsFromRanges,
+ getCellsFromElement: getCellsFromElement,
+ getCellsFromElementOrRanges: getCellsFromElementOrRanges,
+ getCellsFromEditor: getCellsFromEditor
+ };
+ }
+);
+
+/**
+ * TableDelete.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.TableDelete',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.delete.DeleteElement',
+ 'tinymce.core.delete.TableDeleteAction',
+ 'tinymce.core.dom.ElementType',
+ 'tinymce.core.dom.Empty',
+ 'tinymce.core.dom.PaddingBr',
+ 'tinymce.core.dom.Parents',
+ 'tinymce.core.selection.TableCellSelection'
+ ],
+ function (Arr, Fun, Option, Compare, Element, Node, CaretFinder, CaretPosition, DeleteElement, TableDeleteAction, ElementType, Empty, PaddingBr, Parents, TableCellSelection) {
+ var emptyCells = function (editor, cells) {
+ Arr.each(cells, PaddingBr.fillWithPaddingBr);
+ editor.selection.setCursorLocation(cells[0].dom(), 0);
+
+ return true;
+ };
+
+ var deleteTableElement = function (editor, table) {
+ DeleteElement.deleteElement(editor, false, table);
+
+ return true;
+ };
+
+ var deleteCellRange = function (editor, rootElm, rng) {
+ return TableDeleteAction.getActionFromRange(rootElm, rng).map(function (action) {
+ return action.fold(
+ Fun.curry(deleteTableElement, editor),
+ Fun.curry(emptyCells, editor)
+ );
+ });
+ };
+
+ var deleteCaptionRange = function (editor, caption) {
+ return emptyElement(editor, caption);
+ };
+
+ var deleteTableRange = function (editor, rootElm, rng, startElm) {
+ return getParentCaption(rootElm, startElm).fold(
+ function () {
+ return deleteCellRange(editor, rootElm, rng);
+ },
+ function (caption) {
+ return deleteCaptionRange(editor, caption);
+ }
+ ).getOr(false);
+ };
+
+ var deleteRange = function (editor, startElm) {
+ var rootNode = Element.fromDom(editor.getBody());
+ var rng = editor.selection.getRng();
+ var selectedCells = TableCellSelection.getCellsFromEditor(editor);
+
+ return selectedCells.length !== 0 ? emptyCells(editor, selectedCells) : deleteTableRange(editor, rootNode, rng, startElm);
+ };
+
+ var getParentCell = function (rootElm, elm) {
+ return Arr.find(Parents.parentsAndSelf(elm, rootElm), ElementType.isTableCell);
+ };
+
+ var getParentCaption = function (rootElm, elm) {
+ return Arr.find(Parents.parentsAndSelf(elm, rootElm), function (elm) {
+ return Node.name(elm) === 'caption';
+ });
+ };
+
+ var deleteBetweenCells = function (editor, rootElm, forward, fromCell, from) {
+ return CaretFinder.navigate(forward, editor.getBody(), from).bind(function (to) {
+ return getParentCell(rootElm, Element.fromDom(to.getNode())).map(function (toCell) {
+ return Compare.eq(toCell, fromCell) === false;
+ });
+ });
+ };
+
+ var emptyElement = function (editor, elm) {
+ PaddingBr.fillWithPaddingBr(elm);
+ editor.selection.setCursorLocation(elm.dom(), 0);
+ return Option.some(true);
+ };
+
+ var isDeleteOfLastCharPos = function (fromCaption, forward, from, to) {
+ return CaretFinder.firstPositionIn(fromCaption.dom()).bind(function (first) {
+ return CaretFinder.lastPositionIn(fromCaption.dom()).map(function (last) {
+ return forward ? from.isEqual(first) && to.isEqual(last) : from.isEqual(last) && to.isEqual(first);
+ });
+ }).getOr(true);
+ };
+
+ var emptyCaretCaption = function (editor, elm) {
+ return emptyElement(editor, elm);
+ };
+
+ var validateCaretCaption = function (rootElm, fromCaption, to) {
+ return getParentCaption(rootElm, Element.fromDom(to.getNode())).map(function (toCaption) {
+ return Compare.eq(toCaption, fromCaption) === false;
+ });
+ };
+
+ var deleteCaretInsideCaption = function (editor, rootElm, forward, fromCaption, from) {
+ return CaretFinder.navigate(forward, editor.getBody(), from).bind(function (to) {
+ return isDeleteOfLastCharPos(fromCaption, forward, from, to) ? emptyCaretCaption(editor, fromCaption) : validateCaretCaption(rootElm, fromCaption, to);
+ }).or(Option.some(true));
+ };
+
+ var deleteCaretCells = function (editor, forward, rootElm, startElm) {
+ var from = CaretPosition.fromRangeStart(editor.selection.getRng());
+ return getParentCell(rootElm, startElm).bind(function (fromCell) {
+ return Empty.isEmpty(fromCell) ? emptyElement(editor, fromCell) : deleteBetweenCells(editor, rootElm, forward, fromCell, from);
+ });
+ };
+
+ var deleteCaretCaption = function (editor, forward, rootElm, fromCaption) {
+ var from = CaretPosition.fromRangeStart(editor.selection.getRng());
+ return Empty.isEmpty(fromCaption) ? emptyElement(editor, fromCaption) : deleteCaretInsideCaption(editor, rootElm, forward, fromCaption, from);
+ };
+
+ var deleteCaret = function (editor, forward, startElm) {
+ var rootElm = Element.fromDom(editor.getBody());
+
+ return getParentCaption(rootElm, startElm).fold(
+ function () {
+ return deleteCaretCells(editor, forward, rootElm, startElm);
+ },
+ function (fromCaption) {
+ return deleteCaretCaption(editor, forward, rootElm, fromCaption);
+ }
+ ).getOr(false);
+ };
+
+ var backspaceDelete = function (editor, forward) {
+ var startElm = Element.fromDom(editor.selection.getStart(true));
+ return editor.selection.isCollapsed() ? deleteCaret(editor, forward, startElm) : deleteRange(editor, startElm);
+ };
+
+ return {
+ backspaceDelete: backspaceDelete
+ };
+ }
+);
+
+/**
+ * Commands.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.delete.DeleteCommands',
+ [
+ 'tinymce.core.delete.BlockBoundaryDelete',
+ 'tinymce.core.delete.BlockRangeDelete',
+ 'tinymce.core.delete.CefDelete',
+ 'tinymce.core.delete.DeleteUtils',
+ 'tinymce.core.delete.InlineBoundaryDelete',
+ 'tinymce.core.delete.TableDelete'
+ ],
+ function (BlockBoundaryDelete, BlockRangeDelete, CefDelete, DeleteUtils, BoundaryDelete, TableDelete) {
+ var nativeCommand = function (editor, command) {
+ editor.getDoc().execCommand(command, false, null);
+ };
+
+ var deleteCommand = function (editor) {
+ if (CefDelete.backspaceDelete(editor, false)) {
+ return;
+ } else if (BoundaryDelete.backspaceDelete(editor, false)) {
+ return;
+ } else if (BlockBoundaryDelete.backspaceDelete(editor, false)) {
+ return;
+ } else if (TableDelete.backspaceDelete(editor)) {
+ return;
+ } else if (BlockRangeDelete.backspaceDelete(editor, false)) {
+ return;
+ } else {
+ nativeCommand(editor, 'Delete');
+ DeleteUtils.paddEmptyBody(editor);
+ }
+ };
+
+ var forwardDeleteCommand = function (editor) {
+ if (CefDelete.backspaceDelete(editor, true)) {
+ return;
+ } else if (BoundaryDelete.backspaceDelete(editor, true)) {
+ return;
+ } else if (BlockBoundaryDelete.backspaceDelete(editor, true)) {
+ return;
+ } else if (TableDelete.backspaceDelete(editor)) {
+ return;
+ } else if (BlockRangeDelete.backspaceDelete(editor, true)) {
+ return;
+ } else {
+ nativeCommand(editor, 'ForwardDelete');
+ }
+ };
+
+ return {
+ deleteCommand: deleteCommand,
+ forwardDeleteCommand: forwardDeleteCommand
+ };
+ }
+);
+/**
+ * RangeCompare.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.RangeCompare',
+ [
+ ],
+ function () {
+ var isEq = function (rng1, rng2) {
+ return rng1 && rng2 &&
+ (rng1.startContainer === rng2.startContainer && rng1.startOffset === rng2.startOffset) &&
+ (rng1.endContainer === rng2.endContainer && rng1.endOffset === rng2.endOffset);
+ };
+
+ return {
+ isEq: isEq
+ };
+ }
+);
+
+/**
+ * NormalizeRange.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.NormalizeRange',
+ [
+ 'ephox.katamari.api.Option',
+ 'ephox.katamari.api.Struct',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.TreeWalker',
+ 'tinymce.core.fmt.CaretFormat',
+ 'tinymce.core.selection.RangeCompare'
+ ],
+ function (Option, Struct, CaretContainer, NodeType, TreeWalker, CaretFormat, RangeCompare) {
+ var position = Struct.immutable('container', 'offset');
+
+ var findParent = function (node, rootNode, predicate) {
+ while (node && node !== rootNode) {
+ if (predicate(node)) {
+ return node;
+ }
+
+ node = node.parentNode;
+ }
+
+ return null;
+ };
+
+ var hasParent = function (node, rootNode, predicate) {
+ return findParent(node, rootNode, predicate) !== null;
+ };
+
+ var hasParentWithName = function (node, rootNode, name) {
+ return hasParent(node, rootNode, function (node) {
+ return node.nodeName === name;
+ });
+ };
+
+ var isTable = function (node) {
+ return node && node.nodeName === 'TABLE';
+ };
+
+ var isTableCell = function (node) {
+ return node && /^(TD|TH|CAPTION)$/.test(node.nodeName);
+ };
+
+ var isCeFalseCaretContainer = function (node, rootNode) {
+ return CaretContainer.isCaretContainer(node) && hasParent(node, rootNode, CaretFormat.isCaretNode) === false;
+ };
+
+ var hasBrBeforeAfter = function (dom, node, left) {
+ var walker = new TreeWalker(node, dom.getParent(node.parentNode, dom.isBlock) || dom.getRoot());
+
+ while ((node = walker[left ? 'prev' : 'next']())) {
+ if (NodeType.isBr(node)) {
+ return true;
+ }
+ }
+ };
+
+ var isPrevNode = function (node, name) {
+ return node.previousSibling && node.previousSibling.nodeName === name;
+ };
+
+ var hasContentEditableFalseParent = function (body, node) {
+ while (node && node !== body) {
+ if (NodeType.isContentEditableFalse(node)) {
+ return true;
+ }
+
+ node = node.parentNode;
+ }
+
+ return false;
+ };
+
+ // Walks the dom left/right to find a suitable text node to move the endpoint into
+ // It will only walk within the current parent block or body and will stop if it hits a block or a BR/IMG
+ var findTextNodeRelative = function (dom, isAfterNode, collapsed, left, startNode) {
+ var walker, lastInlineElement, parentBlockContainer, body = dom.getRoot(), node;
+ var nonEmptyElementsMap = dom.schema.getNonEmptyElements();
+
+ parentBlockContainer = dom.getParent(startNode.parentNode, dom.isBlock) || body;
+
+ // Lean left before the BR element if it's the only BR within a block element. Gecko bug: #6680
+ // This:
|
becomes
|
+ if (left && NodeType.isBr(startNode) && isAfterNode && dom.isEmpty(parentBlockContainer)) {
+ return Option.some(position(startNode.parentNode, dom.nodeIndex(startNode)));
+ }
+
+ // Walk left until we hit a text node we can move to or a block/br/img
+ walker = new TreeWalker(startNode, parentBlockContainer);
+ while ((node = walker[left ? 'prev' : 'next']())) {
+ // Break if we hit a non content editable node
+ if (dom.getContentEditableParent(node) === "false" || isCeFalseCaretContainer(node, body)) {
+ return Option.none();
+ }
+
+ // Found text node that has a length
+ if (NodeType.isText(node) && node.nodeValue.length > 0) {
+ if (hasParentWithName(node, body, 'A') === false) {
+ return Option.some(position(node, left ? node.nodeValue.length : 0));
+ }
+
+ return Option.none();
+ }
+
+ // Break if we find a block or a BR/IMG/INPUT etc
+ if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) {
+ return Option.none();
+ }
+
+ lastInlineElement = node;
+ }
+
+ // Only fetch the last inline element when in caret mode for now
+ if (collapsed && lastInlineElement) {
+ return Option.some(position(lastInlineElement, 0));
+ }
+
+ return Option.none();
+ };
+
+ var normalizeEndPoint = function (dom, collapsed, start, rng) {
+ var container, offset, walker, body = dom.getRoot(), node, nonEmptyElementsMap;
+ var directionLeft, isAfterNode, normalized = false;
+
+ container = rng[(start ? 'start' : 'end') + 'Container'];
+ offset = rng[(start ? 'start' : 'end') + 'Offset'];
+ isAfterNode = NodeType.isElement(container) && offset === container.childNodes.length;
+ nonEmptyElementsMap = dom.schema.getNonEmptyElements();
+ directionLeft = start;
+
+ if (CaretContainer.isCaretContainer(container)) {
+ return Option.none();
+ }
+
+ if (NodeType.isElement(container) && offset > container.childNodes.length - 1) {
+ directionLeft = false;
+ }
+
+ // If the container is a document move it to the body element
+ if (NodeType.isDocument(container)) {
+ container = body;
+ offset = 0;
+ }
+
+ // If the container is body try move it into the closest text node or position
+ if (container === body) {
+ // If start is before/after a image, table etc
+ if (directionLeft) {
+ node = container.childNodes[offset > 0 ? offset - 1 : 0];
+ if (node) {
+ if (CaretContainer.isCaretContainer(node)) {
+ return Option.none();
+ }
+
+ if (nonEmptyElementsMap[node.nodeName] || isTable(node)) {
+ return Option.none();
+ }
+ }
+ }
+
+ // Resolve the index
+ if (container.hasChildNodes()) {
+ offset = Math.min(!directionLeft && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1);
+ container = container.childNodes[offset];
+ offset = NodeType.isText(container) && isAfterNode ? container.data.length : 0;
+
+ // Don't normalize non collapsed selections like
[a
]
+ if (!collapsed && container === body.lastChild && isTable(container)) {
+ return Option.none();
+ }
+
+ if (hasContentEditableFalseParent(body, container) || CaretContainer.isCaretContainer(container)) {
+ return Option.none();
+ }
+
+ // Don't walk into elements that doesn't have any child nodes like a IMG
+ if (container.hasChildNodes() && isTable(container) === false) {
+ // Walk the DOM to find a text node to place the caret at or a BR
+ node = container;
+ walker = new TreeWalker(container, body);
+
+ do {
+ if (NodeType.isContentEditableFalse(node) || CaretContainer.isCaretContainer(node)) {
+ normalized = false;
+ break;
+ }
+
+ // Found a text node use that position
+ if (NodeType.isText(node) && node.nodeValue.length > 0) {
+ offset = directionLeft ? 0 : node.nodeValue.length;
+ container = node;
+ normalized = true;
+ break;
+ }
+
+ // Found a BR/IMG/PRE element that we can place the caret before
+ if (nonEmptyElementsMap[node.nodeName.toLowerCase()] && !isTableCell(node)) {
+ offset = dom.nodeIndex(node);
+ container = node.parentNode;
+
+ // Put caret after image and pre tag when moving the end point
+ if ((node.nodeName === 'IMG' || node.nodeName === 'PRE') && !directionLeft) {
+ offset++;
+ }
+
+ normalized = true;
+ break;
+ }
+ } while ((node = (directionLeft ? walker.next() : walker.prev())));
+ }
+ }
+ }
+
+ // Lean the caret to the left if possible
+ if (collapsed) {
+ // So this: x|x
+ // Becomes: x|x
+ // Seems that only gecko has issues with this
+ if (NodeType.isText(container) && offset === 0) {
+ findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(function (pos) {
+ container = pos.container();
+ offset = pos.offset();
+ normalized = true;
+ });
+ }
+
+ // Lean left into empty inline elements when the caret is before a BR
+ // So this: |
+ // Becomes: |
+ // Seems that only gecko has issues with this.
+ // Special edge case for
+ if (NodeType.isElement(container)) {
+ node = container.childNodes[offset];
+
+ // Offset is after the containers last child
+ // then use the previous child for normalization
+ if (!node) {
+ node = container.childNodes[offset - 1];
+ }
+
+ if (node && NodeType.isBr(node) && !isPrevNode(node, 'A') &&
+ !hasBrBeforeAfter(dom, node, false) && !hasBrBeforeAfter(dom, node, true)) {
+ findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(function (pos) {
+ container = pos.container();
+ offset = pos.offset();
+ normalized = true;
+ });
+ }
+ }
+ }
+
+ // Lean the start of the selection right if possible
+ // So this: x[x]
+ // Becomes: x[x]
+ if (directionLeft && !collapsed && NodeType.isText(container) && offset === container.nodeValue.length) {
+ findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(function (pos) {
+ container = pos.container();
+ offset = pos.offset();
+ normalized = true;
+ });
+ }
+
+ return normalized ? Option.some(position(container, offset)) : Option.none();
+ };
+
+ var normalize = function (dom, rng) {
+ var collapsed = rng.collapsed, normRng = rng.cloneRange();
+
+ normalizeEndPoint(dom, collapsed, true, normRng).each(function (pos) {
+ normRng.setStart(pos.container(), pos.offset());
+ });
+
+ if (!collapsed) {
+ normalizeEndPoint(dom, collapsed, false, normRng).each(function (pos) {
+ normRng.setEnd(pos.container(), pos.offset());
+ });
+ }
+
+ // If it was collapsed then make sure it still is
+ if (collapsed) {
+ normRng.collapse(true);
+ }
+
+ return RangeCompare.isEq(rng, normRng) ? Option.none() : Option.some(normRng);
+ };
+
+ return {
+ normalize: normalize
+ };
+ }
+);
+/**
+ * InsertBr.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.newline.InsertBr',
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.sugar.api.dom.Insert',
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.TreeWalker',
+ 'tinymce.core.keyboard.BoundaryLocation',
+ 'tinymce.core.keyboard.InlineUtils',
+ 'tinymce.core.selection.NormalizeRange'
+ ],
+ function (Fun, Insert, Element, CaretFinder, CaretPosition, NodeType, TreeWalker, BoundaryLocation, InlineUtils, NormalizeRange) {
+ // Walks the parent block to the right and look for BR elements
+ var hasRightSideContent = function (schema, container, parentBlock) {
+ var walker = new TreeWalker(container, parentBlock), node;
+ var nonEmptyElementsMap = schema.getNonEmptyElements();
+
+ while ((node = walker.next())) {
+ if (nonEmptyElementsMap[node.nodeName.toLowerCase()] || node.length > 0) {
+ return true;
+ }
+ }
+ };
+
+ var scrollToBr = function (dom, selection, brElm) {
+ // Insert temp marker and scroll to that
+ var marker = dom.create('span', {}, ' ');
+ brElm.parentNode.insertBefore(marker, brElm);
+ selection.scrollIntoView(marker);
+ dom.remove(marker);
+ };
+
+ var moveSelectionToBr = function (dom, selection, brElm, extraBr) {
+ var rng = dom.createRng();
+
+ if (!extraBr) {
+ rng.setStartAfter(brElm);
+ rng.setEndAfter(brElm);
+ } else {
+ rng.setStartBefore(brElm);
+ rng.setEndBefore(brElm);
+ }
+
+ selection.setRng(rng);
+ };
+
+ var insertBrAtCaret = function (editor, evt) {
+ // We load the current event in from EnterKey.js when appropriate to heed
+ // certain event-specific variations such as ctrl-enter in a list
+ var selection = editor.selection, dom = editor.dom;
+ var brElm, extraBr;
+ var rng = selection.getRng(true);
+
+ NormalizeRange.normalize(dom, rng).each(function (normRng) {
+ rng.setStart(normRng.startContainer, normRng.startOffset);
+ rng.setEnd(normRng.endContainer, normRng.endOffset);
+ });
+
+ var offset = rng.startOffset;
+ var container = rng.startContainer;
+
+ // Resolve node index
+ if (container.nodeType === 1 && container.hasChildNodes()) {
+ var isAfterLastNodeInContainer = offset > container.childNodes.length - 1;
+
+ container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
+ if (isAfterLastNodeInContainer && container.nodeType === 3) {
+ offset = container.nodeValue.length;
+ } else {
+ offset = 0;
+ }
+ }
+
+ var parentBlock = dom.getParent(container, dom.isBlock);
+ var containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
+ var containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : ''; // IE < 9 & HTML5
+
+ // Enter inside block contained within a LI then split or insert before/after LI
+ var isControlKey = evt && evt.ctrlKey;
+ if (containerBlockName === 'LI' && !isControlKey) {
+ parentBlock = containerBlock;
+ }
+
+ if (container && container.nodeType === 3 && offset >= container.nodeValue.length) {
+ // Insert extra BR element at the end block elements
+ if (!hasRightSideContent(editor.schema, container, parentBlock)) {
+ brElm = dom.create('br');
+ rng.insertNode(brElm);
+ rng.setStartAfter(brElm);
+ rng.setEndAfter(brElm);
+ extraBr = true;
+ }
+ }
+
+ brElm = dom.create('br');
+ rng.insertNode(brElm);
+
+ scrollToBr(dom, selection, brElm);
+ moveSelectionToBr(dom, selection, brElm, extraBr);
+ editor.undoManager.add();
+ };
+
+ var insertBrBefore = function (editor, inline) {
+ var br = Element.fromTag('br');
+ Insert.before(Element.fromDom(inline), br);
+ editor.undoManager.add();
+ };
+
+ var insertBrAfter = function (editor, inline) {
+ if (!hasBrAfter(editor.getBody(), inline)) {
+ Insert.after(Element.fromDom(inline), Element.fromTag('br'));
+ }
+
+ var br = Element.fromTag('br');
+ Insert.after(Element.fromDom(inline), br);
+ scrollToBr(editor.dom, editor.selection, br.dom());
+ moveSelectionToBr(editor.dom, editor.selection, br.dom(), false);
+ editor.undoManager.add();
+ };
+
+ var isBeforeBr = function (pos) {
+ return NodeType.isBr(pos.getNode());
+ };
+
+ var hasBrAfter = function (rootNode, startNode) {
+ if (isBeforeBr(CaretPosition.after(startNode))) {
+ return true;
+ } else {
+ return CaretFinder.nextPosition(rootNode, CaretPosition.after(startNode)).map(function (pos) {
+ return NodeType.isBr(pos.getNode());
+ }).getOr(false);
+ }
+ };
+
+ var isAnchorLink = function (elm) {
+ return elm && elm.nodeName === 'A' && 'href' in elm;
+ };
+
+ var isInsideAnchor = function (location) {
+ return location.fold(
+ Fun.constant(false),
+ isAnchorLink,
+ isAnchorLink,
+ Fun.constant(false)
+ );
+ };
+
+ var readInlineAnchorLocation = function (editor) {
+ var isInlineTarget = Fun.curry(InlineUtils.isInlineTarget, editor);
+ var position = CaretPosition.fromRangeStart(editor.selection.getRng());
+ return BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), position).filter(isInsideAnchor);
+ };
+
+ var insertBrOutsideAnchor = function (editor, location) {
+ location.fold(
+ Fun.noop,
+ Fun.curry(insertBrBefore, editor),
+ Fun.curry(insertBrAfter, editor),
+ Fun.noop
+ );
+ };
+
+ var insert = function (editor, evt) {
+ var anchorLocation = readInlineAnchorLocation(editor);
+
+ if (anchorLocation.isSome()) {
+ anchorLocation.each(Fun.curry(insertBrOutsideAnchor, editor));
+ } else {
+ insertBrAtCaret(editor, evt);
+ }
+ };
+
+ return {
+ insert: insert
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.selection.Situ',
+
+ [
+ 'ephox.katamari.api.Adt',
+ 'ephox.katamari.api.Fun'
+ ],
+
+ function (Adt, Fun) {
+ var adt = Adt.generate([
+ { 'before': [ 'element' ] },
+ { 'on': [ 'element', 'offset' ] },
+ { after: [ 'element' ] }
+ ]);
+
+ // Probably don't need this given that we now have "match"
+ var cata = function (subject, onBefore, onOn, onAfter) {
+ return subject.fold(onBefore, onOn, onAfter);
+ };
+
+ var getStart = function (situ) {
+ return situ.fold(Fun.identity, Fun.identity, Fun.identity)
+ };
+
+ return {
+ before: adt.before,
+ on: adt.on,
+ after: adt.after,
+ cata: cata,
+ getStart: getStart
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.selection.Selection',
+
+ [
+ 'ephox.katamari.api.Adt',
+ 'ephox.katamari.api.Struct',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.Traverse',
+ 'ephox.sugar.api.selection.Situ'
+ ],
+
+ function (Adt, Struct, Element, Traverse, Situ) {
+ // Consider adding a type for "element"
+ var type = Adt.generate([
+ { domRange: [ 'rng' ] },
+ { relative: [ 'startSitu', 'finishSitu' ] },
+ { exact: [ 'start', 'soffset', 'finish', 'foffset' ] }
+ ]);
+
+ var range = Struct.immutable(
+ 'start',
+ 'soffset',
+ 'finish',
+ 'foffset'
+ );
+
+ var exactFromRange = function (simRange) {
+ return type.exact(simRange.start(), simRange.soffset(), simRange.finish(), simRange.foffset());
+ };
+
+ var getStart = function (selection) {
+ return selection.match({
+ domRange: function (rng) {
+ return Element.fromDom(rng.startContainer);
+ },
+ relative: function (startSitu, finishSitu) {
+ return Situ.getStart(startSitu);
+ },
+ exact: function (start, soffset, finish, foffset) {
+ return start;
+ }
+ });
+ };
+
+ var getWin = function (selection) {
+ var start = getStart(selection);
+
+ return Traverse.defaultView(start);
+ };
+
+ return {
+ domRange: type.domRange,
+ relative: type.relative,
+ exact: type.exact,
+
+ exactFromRange: exactFromRange,
+ range: range,
+
+ getWin: getWin
+ };
+ }
+);
+
+define(
+ 'tinymce.core.selection.SelectionBookmark',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.sand.api.PlatformDetection',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.node.Node',
+ 'ephox.sugar.api.node.Text',
+ 'ephox.sugar.api.search.Traverse',
+ 'ephox.sugar.api.selection.Selection',
+ 'global!document'
+ ],
+
+ function (Fun, Option, PlatformDetection, Compare, Element, Node, Text, Traverse, Selection, document) {
+ var browser = PlatformDetection.detect().browser;
+
+ var clamp = function (offset, element) {
+ var max = Node.isText(element) ? Text.get(element).length : Traverse.children(element).length + 1;
+
+ if (offset > max) {
+ return max;
+ } else if (offset < 0) {
+ return 0;
+ }
+
+ return offset;
+ };
+
+ var normalizeRng = function (rng) {
+ return Selection.range(
+ rng.start(),
+ clamp(rng.soffset(), rng.start()),
+ rng.finish(),
+ clamp(rng.foffset(), rng.finish())
+ );
+ };
+
+ var isOrContains = function (root, elm) {
+ return Compare.contains(root, elm) || Compare.eq(root, elm);
+ };
+
+ var isRngInRoot = function (root) {
+ return function (rng) {
+ return isOrContains(root, rng.start()) && isOrContains(root, rng.finish());
+ };
+ };
+
+ // var dumpRng = function (rng) {
+ // console.log('start', rng.start().dom());
+ // console.log('soffset', rng.soffset());
+ // console.log('finish', rng.finish().dom());
+ // console.log('foffset', rng.foffset());
+ // return rng;
+ // };
+
+ var shouldStore = function (editor) {
+ return editor.inline === true || browser.isIE();
+ };
+
+ var nativeRangeToSelectionRange = function (r) {
+ return Selection.range(Element.fromDom(r.startContainer), r.startOffset, Element.fromDom(r.endContainer), r.endOffset);
+ };
+
+ var readRange = function (win) {
+ var selection = win.getSelection();
+ var rng = !selection || selection.rangeCount === 0 ? Option.none() : Option.from(selection.getRangeAt(0));
+ return rng.map(nativeRangeToSelectionRange);
+ };
+
+ var getBookmark = function (root) {
+ var win = Traverse.defaultView(root);
+
+ return readRange(win.dom())
+ .filter(isRngInRoot(root));
+ };
+
+ var validate = function (root, bookmark) {
+ return Option.from(bookmark)
+ .filter(isRngInRoot(root))
+ .map(normalizeRng);
+ };
+
+ var bookmarkToNativeRng = function (bookmark) {
+ var rng = document.createRange();
+ rng.setStart(bookmark.start().dom(), bookmark.soffset());
+ rng.setEnd(bookmark.finish().dom(), bookmark.foffset());
+
+ return Option.some(rng);
+ };
+
+ var store = function (editor) {
+ var newBookmark = shouldStore(editor) ? getBookmark(Element.fromDom(editor.getBody())) : Option.none();
+
+ editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;
+ };
+
+ var storeNative = function (editor, rng) {
+ var root = Element.fromDom(editor.getBody());
+ var range = shouldStore(editor) ? Option.from(rng) : Option.none();
+
+ var newBookmark = range.map(nativeRangeToSelectionRange)
+ .filter(isRngInRoot(root));
+
+ editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark;
+ };
+
+ var getRng = function (editor) {
+ var bookmark = editor.bookmark ? editor.bookmark : Option.none();
+
+ return bookmark
+ .bind(Fun.curry(validate, Element.fromDom(editor.getBody())))
+ .bind(bookmarkToNativeRng);
+ };
+
+ var restore = function (editor) {
+ getRng(editor).each(function (rng) {
+ editor.selection.setRng(rng);
+ });
+ };
+
+ return {
+ store: store,
+ storeNative: storeNative,
+ readRange: readRange,
+ restore: restore,
+ getRng: getRng,
+ getBookmark: getBookmark,
+ validate: validate
+ };
+ }
+);
+
+/**
+ * EditorCommands.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class enables you to add custom editor commands and it contains
+ * overrides for native browser commands to address various bugs and issues.
+ *
+ * @class tinymce.EditorCommands
+ */
+define(
+ 'tinymce.core.EditorCommands',
+ [
+ 'tinymce.core.Env',
+ 'tinymce.core.InsertContent',
+ 'tinymce.core.delete.DeleteCommands',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.newline.InsertBr',
+ 'tinymce.core.selection.SelectionBookmark',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Env, InsertContent, DeleteCommands, NodeType, InsertBr, SelectionBookmark, Tools) {
+ // Added for compression purposes
+ var each = Tools.each, extend = Tools.extend;
+ var map = Tools.map, inArray = Tools.inArray, explode = Tools.explode;
+ var TRUE = true, FALSE = false;
+
+ return function (editor) {
+ var dom, selection, formatter,
+ commands = { state: {}, exec: {}, value: {} },
+ settings = editor.settings,
+ bookmark;
+
+ editor.on('PreInit', function () {
+ dom = editor.dom;
+ selection = editor.selection;
+ settings = editor.settings;
+ formatter = editor.formatter;
+ });
+
+ /**
+ * Executes the specified command.
+ *
+ * @method execCommand
+ * @param {String} command Command to execute.
+ * @param {Boolean} ui Optional user interface state.
+ * @param {Object} value Optional value for command.
+ * @param {Object} args Optional extra arguments to the execCommand.
+ * @return {Boolean} true/false if the command was found or not.
+ */
+ var execCommand = function (command, ui, value, args) {
+ var func, customCommand, state = 0;
+
+ if (editor.removed) {
+ return;
+ }
+
+ if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(command) && (!args || !args.skip_focus)) {
+ editor.focus();
+ } else {
+ SelectionBookmark.restore(editor);
+ }
+
+ args = editor.fire('BeforeExecCommand', { command: command, ui: ui, value: value });
+ if (args.isDefaultPrevented()) {
+ return false;
+ }
+
+ customCommand = command.toLowerCase();
+ if ((func = commands.exec[customCommand])) {
+ func(customCommand, ui, value);
+ editor.fire('ExecCommand', { command: command, ui: ui, value: value });
+ return true;
+ }
+
+ // Plugin commands
+ each(editor.plugins, function (p) {
+ if (p.execCommand && p.execCommand(command, ui, value)) {
+ editor.fire('ExecCommand', { command: command, ui: ui, value: value });
+ state = true;
+ return false;
+ }
+ });
+
+ if (state) {
+ return state;
+ }
+
+ // Theme commands
+ if (editor.theme && editor.theme.execCommand && editor.theme.execCommand(command, ui, value)) {
+ editor.fire('ExecCommand', { command: command, ui: ui, value: value });
+ return true;
+ }
+
+ // Browser commands
+ try {
+ state = editor.getDoc().execCommand(command, ui, value);
+ } catch (ex) {
+ // Ignore old IE errors
+ }
+
+ if (state) {
+ editor.fire('ExecCommand', { command: command, ui: ui, value: value });
+ return true;
+ }
+
+ return false;
+ };
+
+ /**
+ * Queries the current state for a command for example if the current selection is "bold".
+ *
+ * @method queryCommandState
+ * @param {String} command Command to check the state of.
+ * @return {Boolean/Number} true/false if the selected contents is bold or not, -1 if it's not found.
+ */
+ var queryCommandState = function (command) {
+ var func;
+
+ if (editor.quirks.isHidden() || editor.removed) {
+ return;
+ }
+
+ command = command.toLowerCase();
+ if ((func = commands.state[command])) {
+ return func(command);
+ }
+
+ // Browser commands
+ try {
+ return editor.getDoc().queryCommandState(command);
+ } catch (ex) {
+ // Fails sometimes see bug: 1896577
+ }
+
+ return false;
+ };
+
+ /**
+ * Queries the command value for example the current fontsize.
+ *
+ * @method queryCommandValue
+ * @param {String} command Command to check the value of.
+ * @return {Object} Command value of false if it's not found.
+ */
+ var queryCommandValue = function (command) {
+ var func;
+
+ if (editor.quirks.isHidden() || editor.removed) {
+ return;
+ }
+
+ command = command.toLowerCase();
+ if ((func = commands.value[command])) {
+ return func(command);
+ }
+
+ // Browser commands
+ try {
+ return editor.getDoc().queryCommandValue(command);
+ } catch (ex) {
+ // Fails sometimes see bug: 1896577
+ }
+ };
+
+ /**
+ * Adds commands to the command collection.
+ *
+ * @method addCommands
+ * @param {Object} commandList Name/value collection with commands to add, the names can also be comma separated.
+ * @param {String} type Optional type to add, defaults to exec. Can be value or state as well.
+ */
+ var addCommands = function (commandList, type) {
+ type = type || 'exec';
+
+ each(commandList, function (callback, command) {
+ each(command.toLowerCase().split(','), function (command) {
+ commands[type][command] = callback;
+ });
+ });
+ };
+
+ var addCommand = function (command, callback, scope) {
+ command = command.toLowerCase();
+ commands.exec[command] = function (command, ui, value, args) {
+ return callback.call(scope || editor, ui, value, args);
+ };
+ };
+
+ /**
+ * Returns true/false if the command is supported or not.
+ *
+ * @method queryCommandSupported
+ * @param {String} command Command that we check support for.
+ * @return {Boolean} true/false if the command is supported or not.
+ */
+ var queryCommandSupported = function (command) {
+ command = command.toLowerCase();
+
+ if (commands.exec[command]) {
+ return true;
+ }
+
+ // Browser commands
+ try {
+ return editor.getDoc().queryCommandSupported(command);
+ } catch (ex) {
+ // Fails sometimes see bug: 1896577
+ }
+
+ return false;
+ };
+
+ var addQueryStateHandler = function (command, callback, scope) {
+ command = command.toLowerCase();
+ commands.state[command] = function () {
+ return callback.call(scope || editor);
+ };
+ };
+
+ var addQueryValueHandler = function (command, callback, scope) {
+ command = command.toLowerCase();
+ commands.value[command] = function () {
+ return callback.call(scope || editor);
+ };
+ };
+
+ var hasCustomCommand = function (command) {
+ command = command.toLowerCase();
+ return !!commands.exec[command];
+ };
+
+ // Expose public methods
+ extend(this, {
+ execCommand: execCommand,
+ queryCommandState: queryCommandState,
+ queryCommandValue: queryCommandValue,
+ queryCommandSupported: queryCommandSupported,
+ addCommands: addCommands,
+ addCommand: addCommand,
+ addQueryStateHandler: addQueryStateHandler,
+ addQueryValueHandler: addQueryValueHandler,
+ hasCustomCommand: hasCustomCommand
+ });
+
+ // Private methods
+
+ var execNativeCommand = function (command, ui, value) {
+ if (ui === undefined) {
+ ui = FALSE;
+ }
+
+ if (value === undefined) {
+ value = null;
+ }
+
+ return editor.getDoc().execCommand(command, ui, value);
+ };
+
+ var isFormatMatch = function (name) {
+ return formatter.match(name);
+ };
+
+ var toggleFormat = function (name, value) {
+ formatter.toggle(name, value ? { value: value } : undefined);
+ editor.nodeChanged();
+ };
+
+ var storeSelection = function (type) {
+ bookmark = selection.getBookmark(type);
+ };
+
+ var restoreSelection = function () {
+ selection.moveToBookmark(bookmark);
+ };
+
+ // Add execCommand overrides
+ addCommands({
+ // Ignore these, added for compatibility
+ 'mceResetDesignMode,mceBeginUndoLevel': function () { },
+
+ // Add undo manager logic
+ 'mceEndUndoLevel,mceAddUndoLevel': function () {
+ editor.undoManager.add();
+ },
+
+ 'Cut,Copy,Paste': function (command) {
+ var doc = editor.getDoc(), failed;
+
+ // Try executing the native command
+ try {
+ execNativeCommand(command);
+ } catch (ex) {
+ // Command failed
+ failed = TRUE;
+ }
+
+ // Chrome reports the paste command as supported however older IE:s will return false for cut/paste
+ if (command === 'paste' && !doc.queryCommandEnabled(command)) {
+ failed = true;
+ }
+
+ // Present alert message about clipboard access not being available
+ if (failed || !doc.queryCommandSupported(command)) {
+ var msg = editor.translate(
+ "Your browser doesn't support direct access to the clipboard. " +
+ "Please use the Ctrl+X/C/V keyboard shortcuts instead."
+ );
+
+ if (Env.mac) {
+ msg = msg.replace(/Ctrl\+/g, '\u2318+');
+ }
+
+ editor.notificationManager.open({ text: msg, type: 'error' });
+ }
+ },
+
+ // Override unlink command
+ unlink: function () {
+ if (selection.isCollapsed()) {
+ var elm = editor.dom.getParent(editor.selection.getStart(), 'a');
+ if (elm) {
+ editor.dom.remove(elm, true);
+ }
+
+ return;
+ }
+
+ formatter.remove("link");
+ },
+
+ // Override justify commands to use the text formatter engine
+ 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone': function (command) {
+ var align = command.substring(7);
+
+ if (align == 'full') {
+ align = 'justify';
+ }
+
+ // Remove all other alignments first
+ each('left,center,right,justify'.split(','), function (name) {
+ if (align != name) {
+ formatter.remove('align' + name);
+ }
+ });
+
+ if (align != 'none') {
+ toggleFormat('align' + align);
+ }
+ },
+
+ // Override list commands to fix WebKit bug
+ 'InsertUnorderedList,InsertOrderedList': function (command) {
+ var listElm, listParent;
+
+ execNativeCommand(command);
+
+ // WebKit produces lists within block elements so we need to split them
+ // we will replace the native list creation logic to custom logic later on
+ // TODO: Remove this when the list creation logic is removed
+ listElm = dom.getParent(selection.getNode(), 'ol,ul');
+ if (listElm) {
+ listParent = listElm.parentNode;
+
+ // If list is within a text block then split that block
+ if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {
+ storeSelection();
+ dom.split(listParent, listElm);
+ restoreSelection();
+ }
+ }
+ },
+
+ // Override commands to use the text formatter engine
+ 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': function (command) {
+ toggleFormat(command);
+ },
+
+ // Override commands to use the text formatter engine
+ 'ForeColor,HiliteColor,FontName': function (command, ui, value) {
+ toggleFormat(command, value);
+ },
+
+ FontSize: function (command, ui, value) {
+ var fontClasses, fontSizes;
+
+ // Convert font size 1-7 to styles
+ if (value >= 1 && value <= 7) {
+ fontSizes = explode(settings.font_size_style_values);
+ fontClasses = explode(settings.font_size_classes);
+
+ if (fontClasses) {
+ value = fontClasses[value - 1] || value;
+ } else {
+ value = fontSizes[value - 1] || value;
+ }
+ }
+
+ toggleFormat(command, value);
+ },
+
+ RemoveFormat: function (command) {
+ formatter.remove(command);
+ },
+
+ mceBlockQuote: function () {
+ toggleFormat('blockquote');
+ },
+
+ FormatBlock: function (command, ui, value) {
+ return toggleFormat(value || 'p');
+ },
+
+ mceCleanup: function () {
+ var bookmark = selection.getBookmark();
+
+ editor.setContent(editor.getContent({ cleanup: TRUE }), { cleanup: TRUE });
+
+ selection.moveToBookmark(bookmark);
+ },
+
+ mceRemoveNode: function (command, ui, value) {
+ var node = value || selection.getNode();
+
+ // Make sure that the body node isn't removed
+ if (node != editor.getBody()) {
+ storeSelection();
+ editor.dom.remove(node, TRUE);
+ restoreSelection();
+ }
+ },
+
+ mceSelectNodeDepth: function (command, ui, value) {
+ var counter = 0;
+
+ dom.getParent(selection.getNode(), function (node) {
+ if (node.nodeType == 1 && counter++ == value) {
+ selection.select(node);
+ return FALSE;
+ }
+ }, editor.getBody());
+ },
+
+ mceSelectNode: function (command, ui, value) {
+ selection.select(value);
+ },
+
+ mceInsertContent: function (command, ui, value) {
+ InsertContent.insertAtCaret(editor, value);
+ },
+
+ mceInsertRawHTML: function (command, ui, value) {
+ selection.setContent('tiny_mce_marker');
+ editor.setContent(
+ editor.getContent().replace(/tiny_mce_marker/g, function () {
+ return value;
+ })
+ );
+ },
+
+ mceToggleFormat: function (command, ui, value) {
+ toggleFormat(value);
+ },
+
+ mceSetContent: function (command, ui, value) {
+ editor.setContent(value);
+ },
+
+ 'Indent,Outdent': function (command) {
+ var intentValue, indentUnit, value;
+
+ // Setup indent level
+ intentValue = settings.indentation;
+ indentUnit = /[a-z%]+$/i.exec(intentValue);
+ intentValue = parseInt(intentValue, 10);
+
+ if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) {
+ // If forced_root_blocks is set to false we don't have a block to indent so lets create a div
+ if (!settings.forced_root_block && !dom.getParent(selection.getNode(), dom.isBlock)) {
+ formatter.apply('div');
+ }
+
+ each(selection.getSelectedBlocks(), function (element) {
+ if (dom.getContentEditable(element) === "false") {
+ return;
+ }
+
+ if (element.nodeName !== "LI") {
+ var indentStyleName = editor.getParam('indent_use_margin', false) ? 'margin' : 'padding';
+ indentStyleName = element.nodeName === 'TABLE' ? 'margin' : indentStyleName;
+ indentStyleName += dom.getStyle(element, 'direction', true) == 'rtl' ? 'Right' : 'Left';
+
+ if (command == 'outdent') {
+ value = Math.max(0, parseInt(element.style[indentStyleName] || 0, 10) - intentValue);
+ dom.setStyle(element, indentStyleName, value ? value + indentUnit : '');
+ } else {
+ value = (parseInt(element.style[indentStyleName] || 0, 10) + intentValue) + indentUnit;
+ dom.setStyle(element, indentStyleName, value);
+ }
+ }
+ });
+ } else {
+ execNativeCommand(command);
+ }
+ },
+
+ mceRepaint: function () {
+ },
+
+ InsertHorizontalRule: function () {
+ editor.execCommand('mceInsertContent', false, '');
+ },
+
+ mceToggleVisualAid: function () {
+ editor.hasVisual = !editor.hasVisual;
+ editor.addVisual();
+ },
+
+ mceReplaceContent: function (command, ui, value) {
+ editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, selection.getContent({ format: 'text' })));
+ },
+
+ mceInsertLink: function (command, ui, value) {
+ var anchor;
+
+ if (typeof value == 'string') {
+ value = { href: value };
+ }
+
+ anchor = dom.getParent(selection.getNode(), 'a');
+
+ // Spaces are never valid in URLs and it's a very common mistake for people to make so we fix it here.
+ value.href = value.href.replace(' ', '%20');
+
+ // Remove existing links if there could be child links or that the href isn't specified
+ if (!anchor || !value.href) {
+ formatter.remove('link');
+ }
+
+ // Apply new link to selection
+ if (value.href) {
+ formatter.apply('link', value, anchor);
+ }
+ },
+
+ selectAll: function () {
+ var editingHost = dom.getParent(selection.getStart(), NodeType.isContentEditableTrue);
+ if (editingHost) {
+ var rng = dom.createRng();
+ rng.selectNodeContents(editingHost);
+ selection.setRng(rng);
+ }
+ },
+
+ "delete": function () {
+ DeleteCommands.deleteCommand(editor);
+ },
+
+ "forwardDelete": function () {
+ DeleteCommands.forwardDeleteCommand(editor);
+ },
+
+ mceNewDocument: function () {
+ editor.setContent('');
+ },
+
+ InsertLineBreak: function (command, ui, value) {
+ InsertBr.insert(editor, value);
+ return true;
+ }
+ });
+
+ // Add queryCommandState overrides
+ addCommands({
+ // Override justify commands
+ 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull': function (command) {
+ var name = 'align' + command.substring(7);
+ var nodes = selection.isCollapsed() ? [dom.getParent(selection.getNode(), dom.isBlock)] : selection.getSelectedBlocks();
+ var matches = map(nodes, function (node) {
+ return !!formatter.matchNode(node, name);
+ });
+ return inArray(matches, TRUE) !== -1;
+ },
+
+ 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': function (command) {
+ return isFormatMatch(command);
+ },
+
+ mceBlockQuote: function () {
+ return isFormatMatch('blockquote');
+ },
+
+ Outdent: function () {
+ var node;
+
+ if (settings.inline_styles) {
+ if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft, 10) > 0) {
+ return TRUE;
+ }
+
+ if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft, 10) > 0) {
+ return TRUE;
+ }
+ }
+
+ return (
+ queryCommandState('InsertUnorderedList') ||
+ queryCommandState('InsertOrderedList') ||
+ (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE'))
+ );
+ },
+
+ 'InsertUnorderedList,InsertOrderedList': function (command) {
+ var list = dom.getParent(selection.getNode(), 'ul,ol');
+
+ return list &&
+ (
+ command === 'insertunorderedlist' && list.tagName === 'UL' ||
+ command === 'insertorderedlist' && list.tagName === 'OL'
+ );
+ }
+ }, 'state');
+
+ // Add queryCommandValue overrides
+ addCommands({
+ 'FontSize,FontName': function (command) {
+ var value = 0, parent;
+
+ if ((parent = dom.getParent(selection.getNode(), 'span'))) {
+ if (command == 'fontsize') {
+ value = parent.style.fontSize;
+ } else {
+ value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase();
+ }
+ }
+
+ return value;
+ }
+ }, 'value');
+
+ // Add undo manager logic
+ addCommands({
+ Undo: function () {
+ editor.undoManager.undo();
+ },
+
+ Redo: function () {
+ editor.undoManager.redo();
+ }
+ });
+ };
+ }
+);
+
+/**
+ * EventDispatcher.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class lets you add/remove and fire events by name on the specified scope. This makes
+ * it easy to add event listener logic to any class.
+ *
+ * @class tinymce.util.EventDispatcher
+ * @example
+ * var eventDispatcher = new EventDispatcher();
+ *
+ * eventDispatcher.on('click', function() {console.log('data');});
+ * eventDispatcher.fire('click', {data: 123});
+ */
+define(
+ 'tinymce.core.util.EventDispatcher',
+ [
+ "tinymce.core.util.Tools"
+ ],
+ function (Tools) {
+ var nativeEvents = Tools.makeMap(
+ "focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange " +
+ "mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover " +
+ "draggesture dragdrop drop drag submit " +
+ "compositionstart compositionend compositionupdate touchstart touchmove touchend",
+ ' '
+ );
+
+ var Dispatcher = function (settings) {
+ var self = this, scope, bindings = {}, toggleEvent;
+
+ var returnFalse = function () {
+ return false;
+ };
+
+ var returnTrue = function () {
+ return true;
+ };
+
+ settings = settings || {};
+ scope = settings.scope || self;
+ toggleEvent = settings.toggleEvent || returnFalse;
+
+ /**
+ * Fires the specified event by name.
+ *
+ * @method fire
+ * @param {String} name Name of the event to fire.
+ * @param {Object?} args Event arguments.
+ * @return {Object} Event args instance passed in.
+ * @example
+ * instance.fire('event', {...});
+ */
+ var fire = function (name, args) {
+ var handlers, i, l, callback;
+
+ name = name.toLowerCase();
+ args = args || {};
+ args.type = name;
+
+ // Setup target is there isn't one
+ if (!args.target) {
+ args.target = scope;
+ }
+
+ // Add event delegation methods if they are missing
+ if (!args.preventDefault) {
+ // Add preventDefault method
+ args.preventDefault = function () {
+ args.isDefaultPrevented = returnTrue;
+ };
+
+ // Add stopPropagation
+ args.stopPropagation = function () {
+ args.isPropagationStopped = returnTrue;
+ };
+
+ // Add stopImmediatePropagation
+ args.stopImmediatePropagation = function () {
+ args.isImmediatePropagationStopped = returnTrue;
+ };
+
+ // Add event delegation states
+ args.isDefaultPrevented = returnFalse;
+ args.isPropagationStopped = returnFalse;
+ args.isImmediatePropagationStopped = returnFalse;
+ }
+
+ if (settings.beforeFire) {
+ settings.beforeFire(args);
+ }
+
+ handlers = bindings[name];
+ if (handlers) {
+ for (i = 0, l = handlers.length; i < l; i++) {
+ callback = handlers[i];
+
+ // Unbind handlers marked with "once"
+ if (callback.once) {
+ off(name, callback.func);
+ }
+
+ // Stop immediate propagation if needed
+ if (args.isImmediatePropagationStopped()) {
+ args.stopPropagation();
+ return args;
+ }
+
+ // If callback returns false then prevent default and stop all propagation
+ if (callback.func.call(scope, args) === false) {
+ args.preventDefault();
+ return args;
+ }
+ }
+ }
+
+ return args;
+ };
+
+ /**
+ * Binds an event listener to a specific event by name.
+ *
+ * @method on
+ * @param {String} name Event name or space separated list of events to bind.
+ * @param {callback} callback Callback to be executed when the event occurs.
+ * @param {Boolean} first Optional flag if the event should be prepended. Use this with care.
+ * @return {Object} Current class instance.
+ * @example
+ * instance.on('event', function(e) {
+ * // Callback logic
+ * });
+ */
+ var on = function (name, callback, prepend, extra) {
+ var handlers, names, i;
+
+ if (callback === false) {
+ callback = returnFalse;
+ }
+
+ if (callback) {
+ callback = {
+ func: callback
+ };
+
+ if (extra) {
+ Tools.extend(callback, extra);
+ }
+
+ names = name.toLowerCase().split(' ');
+ i = names.length;
+ while (i--) {
+ name = names[i];
+ handlers = bindings[name];
+ if (!handlers) {
+ handlers = bindings[name] = [];
+ toggleEvent(name, true);
+ }
+
+ if (prepend) {
+ handlers.unshift(callback);
+ } else {
+ handlers.push(callback);
+ }
+ }
+ }
+
+ return self;
+ };
+
+ /**
+ * Unbinds an event listener to a specific event by name.
+ *
+ * @method off
+ * @param {String?} name Name of the event to unbind.
+ * @param {callback?} callback Callback to unbind.
+ * @return {Object} Current class instance.
+ * @example
+ * // Unbind specific callback
+ * instance.off('event', handler);
+ *
+ * // Unbind all listeners by name
+ * instance.off('event');
+ *
+ * // Unbind all events
+ * instance.off();
+ */
+ var off = function (name, callback) {
+ var i, handlers, bindingName, names, hi;
+
+ if (name) {
+ names = name.toLowerCase().split(' ');
+ i = names.length;
+ while (i--) {
+ name = names[i];
+ handlers = bindings[name];
+
+ // Unbind all handlers
+ if (!name) {
+ for (bindingName in bindings) {
+ toggleEvent(bindingName, false);
+ delete bindings[bindingName];
+ }
+
+ return self;
+ }
+
+ if (handlers) {
+ // Unbind all by name
+ if (!callback) {
+ handlers.length = 0;
+ } else {
+ // Unbind specific ones
+ hi = handlers.length;
+ while (hi--) {
+ if (handlers[hi].func === callback) {
+ handlers = handlers.slice(0, hi).concat(handlers.slice(hi + 1));
+ bindings[name] = handlers;
+ }
+ }
+ }
+
+ if (!handlers.length) {
+ toggleEvent(name, false);
+ delete bindings[name];
+ }
+ }
+ }
+ } else {
+ for (name in bindings) {
+ toggleEvent(name, false);
+ }
+
+ bindings = {};
+ }
+
+ return self;
+ };
+
+ /**
+ * Binds an event listener to a specific event by name
+ * and automatically unbind the event once the callback fires.
+ *
+ * @method once
+ * @param {String} name Event name or space separated list of events to bind.
+ * @param {callback} callback Callback to be executed when the event occurs.
+ * @param {Boolean} first Optional flag if the event should be prepended. Use this with care.
+ * @return {Object} Current class instance.
+ * @example
+ * instance.once('event', function(e) {
+ * // Callback logic
+ * });
+ */
+ var once = function (name, callback, prepend) {
+ return on(name, callback, prepend, { once: true });
+ };
+
+ /**
+ * Returns true/false if the dispatcher has a event of the specified name.
+ *
+ * @method has
+ * @param {String} name Name of the event to check for.
+ * @return {Boolean} true/false if the event exists or not.
+ */
+ var has = function (name) {
+ name = name.toLowerCase();
+ return !(!bindings[name] || bindings[name].length === 0);
+ };
+
+ // Expose
+ self.fire = fire;
+ self.on = on;
+ self.off = off;
+ self.once = once;
+ self.has = has;
+ };
+
+ /**
+ * Returns true/false if the specified event name is a native browser event or not.
+ *
+ * @method isNative
+ * @param {String} name Name to check if it's native.
+ * @return {Boolean} true/false if the event is native or not.
+ * @static
+ */
+ Dispatcher.isNative = function (name) {
+ return !!nativeEvents[name.toLowerCase()];
+ };
+
+ return Dispatcher;
+ }
+);
+
+/**
+ * Observable.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This mixin will add event binding logic to classes.
+ *
+ * @mixin tinymce.util.Observable
+ */
+define(
+ 'tinymce.core.util.Observable',
+ [
+ "tinymce.core.util.EventDispatcher"
+ ],
+ function (EventDispatcher) {
+ var getEventDispatcher = function (obj) {
+ if (!obj._eventDispatcher) {
+ obj._eventDispatcher = new EventDispatcher({
+ scope: obj,
+ toggleEvent: function (name, state) {
+ if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {
+ obj.toggleNativeEvent(name, state);
+ }
+ }
+ });
+ }
+
+ return obj._eventDispatcher;
+ };
+
+ return {
+ /**
+ * Fires the specified event by name. Consult the
+ * event reference for more details on each event.
+ *
+ * @method fire
+ * @param {String} name Name of the event to fire.
+ * @param {Object?} args Event arguments.
+ * @param {Boolean?} bubble True/false if the event is to be bubbled.
+ * @return {Object} Event args instance passed in.
+ * @example
+ * instance.fire('event', {...});
+ */
+ fire: function (name, args, bubble) {
+ var self = this;
+
+ // Prevent all events except the remove event after the instance has been removed
+ if (self.removed && name !== "remove") {
+ return args;
+ }
+
+ args = getEventDispatcher(self).fire(name, args, bubble);
+
+ // Bubble event up to parents
+ if (bubble !== false && self.parent) {
+ var parent = self.parent();
+ while (parent && !args.isPropagationStopped()) {
+ parent.fire(name, args, false);
+ parent = parent.parent();
+ }
+ }
+
+ return args;
+ },
+
+ /**
+ * Binds an event listener to a specific event by name. Consult the
+ * event reference for more details on each event.
+ *
+ * @method on
+ * @param {String} name Event name or space separated list of events to bind.
+ * @param {callback} callback Callback to be executed when the event occurs.
+ * @param {Boolean} first Optional flag if the event should be prepended. Use this with care.
+ * @return {Object} Current class instance.
+ * @example
+ * instance.on('event', function(e) {
+ * // Callback logic
+ * });
+ */
+ on: function (name, callback, prepend) {
+ return getEventDispatcher(this).on(name, callback, prepend);
+ },
+
+ /**
+ * Unbinds an event listener to a specific event by name. Consult the
+ * event reference for more details on each event.
+ *
+ * @method off
+ * @param {String?} name Name of the event to unbind.
+ * @param {callback?} callback Callback to unbind.
+ * @return {Object} Current class instance.
+ * @example
+ * // Unbind specific callback
+ * instance.off('event', handler);
+ *
+ * // Unbind all listeners by name
+ * instance.off('event');
+ *
+ * // Unbind all events
+ * instance.off();
+ */
+ off: function (name, callback) {
+ return getEventDispatcher(this).off(name, callback);
+ },
+
+ /**
+ * Bind the event callback and once it fires the callback is removed. Consult the
+ * event reference for more details on each event.
+ *
+ * @method once
+ * @param {String} name Name of the event to bind.
+ * @param {callback} callback Callback to bind only once.
+ * @return {Object} Current class instance.
+ */
+ once: function (name, callback) {
+ return getEventDispatcher(this).once(name, callback);
+ },
+
+ /**
+ * Returns true/false if the object has a event of the specified name.
+ *
+ * @method hasEventListeners
+ * @param {String} name Name of the event to check for.
+ * @return {Boolean} true/false if the event exists or not.
+ */
+ hasEventListeners: function (name) {
+ return getEventDispatcher(this).has(name);
+ }
+ };
+ }
+);
+/**
+ * EditorObservable.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This mixin contains the event logic for the tinymce.Editor class.
+ *
+ * @mixin tinymce.EditorObservable
+ * @extends tinymce.util.Observable
+ */
+define(
+ 'tinymce.core.EditorObservable',
+ [
+ "tinymce.core.util.Observable",
+ "tinymce.core.dom.DOMUtils",
+ "tinymce.core.util.Tools"
+ ],
+ function (Observable, DOMUtils, Tools) {
+ var DOM = DOMUtils.DOM, customEventRootDelegates;
+
+ /**
+ * Returns the event target so for the specified event. Some events fire
+ * only on document, some fire on documentElement etc. This also handles the
+ * custom event root setting where it returns that element instead of the body.
+ *
+ * @private
+ * @param {tinymce.Editor} editor Editor instance to get event target from.
+ * @param {String} eventName Name of the event for example "click".
+ * @return {Element/Document} HTML Element or document target to bind on.
+ */
+ var getEventTarget = function (editor, eventName) {
+ if (eventName == 'selectionchange') {
+ return editor.getDoc();
+ }
+
+ // Need to bind mousedown/mouseup etc to document not body in iframe mode
+ // Since the user might click on the HTML element not the BODY
+ if (!editor.inline && /^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(eventName)) {
+ return editor.getDoc().documentElement;
+ }
+
+ // Bind to event root instead of body if it's defined
+ if (editor.settings.event_root) {
+ if (!editor.eventRoot) {
+ editor.eventRoot = DOM.select(editor.settings.event_root)[0];
+ }
+
+ return editor.eventRoot;
+ }
+
+ return editor.getBody();
+ };
+
+ /**
+ * Binds a event delegate for the specified name this delegate will fire
+ * the event to the editor dispatcher.
+ *
+ * @private
+ * @param {tinymce.Editor} editor Editor instance to get event target from.
+ * @param {String} eventName Name of the event for example "click".
+ */
+ var bindEventDelegate = function (editor, eventName) {
+ var eventRootElm, delegate;
+
+ var isListening = function (editor) {
+ return !editor.hidden && !editor.readonly;
+ };
+
+ if (!editor.delegates) {
+ editor.delegates = {};
+ }
+
+ if (editor.delegates[eventName] || editor.removed) {
+ return;
+ }
+
+ eventRootElm = getEventTarget(editor, eventName);
+
+ if (editor.settings.event_root) {
+ if (!customEventRootDelegates) {
+ customEventRootDelegates = {};
+ editor.editorManager.on('removeEditor', function () {
+ var name;
+
+ if (!editor.editorManager.activeEditor) {
+ if (customEventRootDelegates) {
+ for (name in customEventRootDelegates) {
+ editor.dom.unbind(getEventTarget(editor, name));
+ }
+
+ customEventRootDelegates = null;
+ }
+ }
+ });
+ }
+
+ if (customEventRootDelegates[eventName]) {
+ return;
+ }
+
+ delegate = function (e) {
+ var target = e.target, editors = editor.editorManager.get(), i = editors.length;
+
+ while (i--) {
+ var body = editors[i].getBody();
+
+ if (body === target || DOM.isChildOf(target, body)) {
+ if (isListening(editors[i])) {
+ editors[i].fire(eventName, e);
+ }
+ }
+ }
+ };
+
+ customEventRootDelegates[eventName] = delegate;
+ DOM.bind(eventRootElm, eventName, delegate);
+ } else {
+ delegate = function (e) {
+ if (isListening(editor)) {
+ editor.fire(eventName, e);
+ }
+ };
+
+ DOM.bind(eventRootElm, eventName, delegate);
+ editor.delegates[eventName] = delegate;
+ }
+ };
+
+ var EditorObservable = {
+ /**
+ * Bind any pending event delegates. This gets executed after the target body/document is created.
+ *
+ * @private
+ */
+ bindPendingEventDelegates: function () {
+ var self = this;
+
+ Tools.each(self._pendingNativeEvents, function (name) {
+ bindEventDelegate(self, name);
+ });
+ },
+
+ /**
+ * Toggles a native event on/off this is called by the EventDispatcher when
+ * the first native event handler is added and when the last native event handler is removed.
+ *
+ * @private
+ */
+ toggleNativeEvent: function (name, state) {
+ var self = this;
+
+ // Never bind focus/blur since the FocusManager fakes those
+ if (name == "focus" || name == "blur") {
+ return;
+ }
+
+ if (state) {
+ if (self.initialized) {
+ bindEventDelegate(self, name);
+ } else {
+ if (!self._pendingNativeEvents) {
+ self._pendingNativeEvents = [name];
+ } else {
+ self._pendingNativeEvents.push(name);
+ }
+ }
+ } else if (self.initialized) {
+ self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
+ delete self.delegates[name];
+ }
+ },
+
+ /**
+ * Unbinds all native event handlers that means delegates, custom events bound using the Events API etc.
+ *
+ * @private
+ */
+ unbindAllNativeEvents: function () {
+ var self = this, name;
+
+ if (self.delegates) {
+ for (name in self.delegates) {
+ self.dom.unbind(getEventTarget(self, name), name, self.delegates[name]);
+ }
+
+ delete self.delegates;
+ }
+
+ if (!self.inline) {
+ self.getBody().onload = null;
+ self.dom.unbind(self.getWin());
+ self.dom.unbind(self.getDoc());
+ }
+
+ self.dom.unbind(self.getBody());
+ self.dom.unbind(self.getContainer());
+ }
+ };
+
+ EditorObservable = Tools.extend({}, Observable, EditorObservable);
+
+ return EditorObservable;
+ }
+);
+
+/**
+ * Mode.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Mode switcher logic.
+ *
+ * @private
+ * @class tinymce.Mode
+ */
+define(
+ 'tinymce.core.Mode',
+ [
+ ],
+ function () {
+ var setEditorCommandState = function (editor, cmd, state) {
+ try {
+ editor.getDoc().execCommand(cmd, false, state);
+ } catch (ex) {
+ // Ignore
+ }
+ };
+
+ var clickBlocker = function (editor) {
+ var target, handler;
+
+ target = editor.getBody();
+
+ handler = function (e) {
+ if (editor.dom.getParents(e.target, 'a').length > 0) {
+ e.preventDefault();
+ }
+ };
+
+ editor.dom.bind(target, 'click', handler);
+
+ return {
+ unbind: function () {
+ editor.dom.unbind(target, 'click', handler);
+ }
+ };
+ };
+
+ var toggleReadOnly = function (editor, state) {
+ if (editor._clickBlocker) {
+ editor._clickBlocker.unbind();
+ editor._clickBlocker = null;
+ }
+
+ if (state) {
+ editor._clickBlocker = clickBlocker(editor);
+ editor.selection.controlSelection.hideResizeRect();
+ editor.readonly = true;
+ editor.getBody().contentEditable = false;
+ } else {
+ editor.readonly = false;
+ editor.getBody().contentEditable = true;
+ setEditorCommandState(editor, "StyleWithCSS", false);
+ setEditorCommandState(editor, "enableInlineTableEditing", false);
+ setEditorCommandState(editor, "enableObjectResizing", false);
+ editor.focus();
+ editor.nodeChanged();
+ }
+ };
+
+ var setMode = function (editor, mode) {
+ var currentMode = editor.readonly ? 'readonly' : 'design';
+
+ if (mode == currentMode) {
+ return;
+ }
+
+ if (editor.initialized) {
+ toggleReadOnly(editor, mode == 'readonly');
+ } else {
+ editor.on('init', function () {
+ toggleReadOnly(editor, mode == 'readonly');
+ });
+ }
+
+ // Event is NOT preventable
+ editor.fire('SwitchMode', { mode: mode });
+ };
+
+ return {
+ setMode: setMode
+ };
+ }
+);
+/**
+ * Shortcuts.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Contains logic for handling keyboard shortcuts.
+ *
+ * @class tinymce.Shortcuts
+ * @example
+ * editor.shortcuts.add('ctrl+a', "description of the shortcut", function() {});
+ * editor.shortcuts.add('meta+a', "description of the shortcut", function() {}); // "meta" maps to Command on Mac and Ctrl on PC
+ * editor.shortcuts.add('ctrl+alt+a', "description of the shortcut", function() {});
+ * editor.shortcuts.add('access+a', "description of the shortcut", function() {}); // "access" maps to ctrl+alt on Mac and shift+alt on PC
+ */
+define(
+ 'tinymce.core.Shortcuts',
+ [
+ 'tinymce.core.util.Tools',
+ 'tinymce.core.Env'
+ ],
+ function (Tools, Env) {
+ var each = Tools.each, explode = Tools.explode;
+
+ var keyCodeLookup = {
+ "f9": 120,
+ "f10": 121,
+ "f11": 122
+ };
+
+ var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access');
+
+ return function (editor) {
+ var self = this, shortcuts = {}, pendingPatterns = [];
+
+ var parseShortcut = function (pattern) {
+ var id, key, shortcut = {};
+
+ // Parse modifiers and keys ctrl+alt+b for example
+ each(explode(pattern, '+'), function (value) {
+ if (value in modifierNames) {
+ shortcut[value] = true;
+ } else {
+ // Allow numeric keycodes like ctrl+219 for ctrl+[
+ if (/^[0-9]{2,}$/.test(value)) {
+ shortcut.keyCode = parseInt(value, 10);
+ } else {
+ shortcut.charCode = value.charCodeAt(0);
+ shortcut.keyCode = keyCodeLookup[value] || value.toUpperCase().charCodeAt(0);
+ }
+ }
+ });
+
+ // Generate unique id for modifier combination and set default state for unused modifiers
+ id = [shortcut.keyCode];
+ for (key in modifierNames) {
+ if (shortcut[key]) {
+ id.push(key);
+ } else {
+ shortcut[key] = false;
+ }
+ }
+ shortcut.id = id.join(',');
+
+ // Handle special access modifier differently depending on Mac/Win
+ if (shortcut.access) {
+ shortcut.alt = true;
+
+ if (Env.mac) {
+ shortcut.ctrl = true;
+ } else {
+ shortcut.shift = true;
+ }
+ }
+
+ // Handle special meta modifier differently depending on Mac/Win
+ if (shortcut.meta) {
+ if (Env.mac) {
+ shortcut.meta = true;
+ } else {
+ shortcut.ctrl = true;
+ shortcut.meta = false;
+ }
+ }
+
+ return shortcut;
+ };
+
+ var createShortcut = function (pattern, desc, cmdFunc, scope) {
+ var shortcuts;
+
+ shortcuts = Tools.map(explode(pattern, '>'), parseShortcut);
+ shortcuts[shortcuts.length - 1] = Tools.extend(shortcuts[shortcuts.length - 1], {
+ func: cmdFunc,
+ scope: scope || editor
+ });
+
+ return Tools.extend(shortcuts[0], {
+ desc: editor.translate(desc),
+ subpatterns: shortcuts.slice(1)
+ });
+ };
+
+ var hasModifier = function (e) {
+ return e.altKey || e.ctrlKey || e.metaKey;
+ };
+
+ var isFunctionKey = function (e) {
+ return e.type === "keydown" && e.keyCode >= 112 && e.keyCode <= 123;
+ };
+
+ var matchShortcut = function (e, shortcut) {
+ if (!shortcut) {
+ return false;
+ }
+
+ if (shortcut.ctrl != e.ctrlKey || shortcut.meta != e.metaKey) {
+ return false;
+ }
+
+ if (shortcut.alt != e.altKey || shortcut.shift != e.shiftKey) {
+ return false;
+ }
+
+ if (e.keyCode == shortcut.keyCode || (e.charCode && e.charCode == shortcut.charCode)) {
+ e.preventDefault();
+ return true;
+ }
+
+ return false;
+ };
+
+ var executeShortcutAction = function (shortcut) {
+ return shortcut.func ? shortcut.func.call(shortcut.scope) : null;
+ };
+
+ editor.on('keyup keypress keydown', function (e) {
+ if ((hasModifier(e) || isFunctionKey(e)) && !e.isDefaultPrevented()) {
+ each(shortcuts, function (shortcut) {
+ if (matchShortcut(e, shortcut)) {
+ pendingPatterns = shortcut.subpatterns.slice(0);
+
+ if (e.type == "keydown") {
+ executeShortcutAction(shortcut);
+ }
+
+ return true;
+ }
+ });
+
+ if (matchShortcut(e, pendingPatterns[0])) {
+ if (pendingPatterns.length === 1) {
+ if (e.type == "keydown") {
+ executeShortcutAction(pendingPatterns[0]);
+ }
+ }
+
+ pendingPatterns.shift();
+ }
+ }
+ });
+
+ /**
+ * Adds a keyboard shortcut for some command or function.
+ *
+ * @method add
+ * @param {String} pattern Shortcut pattern. Like for example: ctrl+alt+o.
+ * @param {String} desc Text description for the command.
+ * @param {String/Function} cmdFunc Command name string or function to execute when the key is pressed.
+ * @param {Object} scope Optional scope to execute the function in.
+ * @return {Boolean} true/false state if the shortcut was added or not.
+ */
+ self.add = function (pattern, desc, cmdFunc, scope) {
+ var cmd;
+
+ cmd = cmdFunc;
+
+ if (typeof cmdFunc === 'string') {
+ cmdFunc = function () {
+ editor.execCommand(cmd, false, null);
+ };
+ } else if (Tools.isArray(cmd)) {
+ cmdFunc = function () {
+ editor.execCommand(cmd[0], cmd[1], cmd[2]);
+ };
+ }
+
+ each(explode(Tools.trim(pattern.toLowerCase())), function (pattern) {
+ var shortcut = createShortcut(pattern, desc, cmdFunc, scope);
+ shortcuts[shortcut.id] = shortcut;
+ });
+
+ return true;
+ };
+
+ /**
+ * Remove a keyboard shortcut by pattern.
+ *
+ * @method remove
+ * @param {String} pattern Shortcut pattern. Like for example: ctrl+alt+o.
+ * @return {Boolean} true/false state if the shortcut was removed or not.
+ */
+ self.remove = function (pattern) {
+ var shortcut = createShortcut(pattern);
+
+ if (shortcuts[shortcut.id]) {
+ delete shortcuts[shortcut.id];
+ return true;
+ }
+
+ return false;
+ };
+ };
+ }
+);
+
+/**
+ * SaxParser.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/*eslint max-depth:[2, 9] */
+
+/**
+ * This class parses HTML code using pure JavaScript and executes various events for each item it finds. It will
+ * always execute the events in the right order for tag soup code like
. It will also remove elements
+ * and attributes that doesn't fit the schema if the validate setting is enabled.
+ *
+ * @example
+ * var parser = new tinymce.html.SaxParser({
+ * validate: true,
+ *
+ * comment: function(text) {
+ * console.log('Comment:', text);
+ * },
+ *
+ * cdata: function(text) {
+ * console.log('CDATA:', text);
+ * },
+ *
+ * text: function(text, raw) {
+ * console.log('Text:', text, 'Raw:', raw);
+ * },
+ *
+ * start: function(name, attrs, empty) {
+ * console.log('Start:', name, attrs, empty);
+ * },
+ *
+ * end: function(name) {
+ * console.log('End:', name);
+ * },
+ *
+ * pi: function(name, text) {
+ * console.log('PI:', name, text);
+ * },
+ *
+ * doctype: function(text) {
+ * console.log('DocType:', text);
+ * }
+ * }, schema);
+ * @class tinymce.html.SaxParser
+ * @version 3.4
+ */
+define(
+ 'tinymce.core.html.SaxParser',
+ [
+ "tinymce.core.html.Schema",
+ "tinymce.core.html.Entities",
+ "tinymce.core.util.Tools"
+ ],
+ function (Schema, Entities, Tools) {
+ var each = Tools.each;
+
+ var isValidPrefixAttrName = function (name) {
+ return name.indexOf('data-') === 0 || name.indexOf('aria-') === 0;
+ };
+
+ var trimComments = function (text) {
+ return text.replace(//g, '');
+ };
+
+ /**
+ * Returns the index of the end tag for a specific start tag. This can be
+ * used to skip all children of a parent element from being processed.
+ *
+ * @private
+ * @method findEndTag
+ * @param {tinymce.html.Schema} schema Schema instance to use to match short ended elements.
+ * @param {String} html HTML string to find the end tag in.
+ * @param {Number} startIndex Indext to start searching at should be after the start tag.
+ * @return {Number} Index of the end tag.
+ */
+ var findEndTag = function (schema, html, startIndex) {
+ var count = 1, index, matches, tokenRegExp, shortEndedElements;
+
+ shortEndedElements = schema.getShortEndedElements();
+ tokenRegExp = /<([!?\/])?([A-Za-z0-9\-_\:\.]+)((?:\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g;
+ tokenRegExp.lastIndex = index = startIndex;
+
+ while ((matches = tokenRegExp.exec(html))) {
+ index = tokenRegExp.lastIndex;
+
+ if (matches[1] === '/') { // End element
+ count--;
+ } else if (!matches[1]) { // Start element
+ if (matches[2] in shortEndedElements) {
+ continue;
+ }
+
+ count++;
+ }
+
+ if (count === 0) {
+ break;
+ }
+ }
+
+ return index;
+ };
+
+ /**
+ * Constructs a new SaxParser instance.
+ *
+ * @constructor
+ * @method SaxParser
+ * @param {Object} settings Name/value collection of settings. comment, cdata, text, start and end are callbacks.
+ * @param {tinymce.html.Schema} schema HTML Schema class to use when parsing.
+ */
+ var SaxParser = function (settings, schema) {
+ var self = this;
+
+ var noop = function () { };
+
+ settings = settings || {};
+ self.schema = schema = schema || new Schema();
+
+ if (settings.fix_self_closing !== false) {
+ settings.fix_self_closing = true;
+ }
+
+ // Add handler functions from settings and setup default handlers
+ each('comment cdata text start end pi doctype'.split(' '), function (name) {
+ if (name) {
+ self[name] = settings[name] || noop;
+ }
+ });
+
+ /**
+ * Parses the specified HTML string and executes the callbacks for each item it finds.
+ *
+ * @example
+ * new SaxParser({...}).parse('text');
+ * @method parse
+ * @param {String} html Html string to sax parse.
+ */
+ self.parse = function (html) {
+ var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name;
+ var isInternalElement, removeInternalElements, shortEndedElements, fillAttrsMap, isShortEnded;
+ var validate, elementRule, isValidElement, attr, attribsValue, validAttributesMap, validAttributePatterns;
+ var attributesRequired, attributesDefault, attributesForced, processHtml;
+ var anyAttributesRequired, selfClosing, tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0;
+ var decode = Entities.decode, fixSelfClosing, filteredUrlAttrs = Tools.makeMap('src,href,data,background,formaction,poster');
+ var scriptUriRegExp = /((java|vb)script|mhtml):/i, dataUriRegExp = /^data:/i;
+
+ var processEndTag = function (name) {
+ var pos, i;
+
+ // Find position of parent of the same type
+ pos = stack.length;
+ while (pos--) {
+ if (stack[pos].name === name) {
+ break;
+ }
+ }
+
+ // Found parent
+ if (pos >= 0) {
+ // Close all the open elements
+ for (i = stack.length - 1; i >= pos; i--) {
+ name = stack[i];
+
+ if (name.valid) {
+ self.end(name.name);
+ }
+ }
+
+ // Remove the open elements from the stack
+ stack.length = pos;
+ }
+ };
+
+ var parseAttribute = function (match, name, value, val2, val3) {
+ var attrRule, i, trimRegExp = /[\s\u0000-\u001F]+/g;
+
+ name = name.toLowerCase();
+ value = name in fillAttrsMap ? name : decode(value || val2 || val3 || ''); // Handle boolean attribute than value attribute
+
+ // Validate name and value pass through all data- attributes
+ if (validate && !isInternalElement && isValidPrefixAttrName(name) === false) {
+ attrRule = validAttributesMap[name];
+
+ // Find rule by pattern matching
+ if (!attrRule && validAttributePatterns) {
+ i = validAttributePatterns.length;
+ while (i--) {
+ attrRule = validAttributePatterns[i];
+ if (attrRule.pattern.test(name)) {
+ break;
+ }
+ }
+
+ // No rule matched
+ if (i === -1) {
+ attrRule = null;
+ }
+ }
+
+ // No attribute rule found
+ if (!attrRule) {
+ return;
+ }
+
+ // Validate value
+ if (attrRule.validValues && !(value in attrRule.validValues)) {
+ return;
+ }
+ }
+
+ // Block any javascript: urls or non image data uris
+ if (filteredUrlAttrs[name] && !settings.allow_script_urls) {
+ var uri = value.replace(trimRegExp, '');
+
+ try {
+ // Might throw malformed URI sequence
+ uri = decodeURIComponent(uri);
+ } catch (ex) {
+ // Fallback to non UTF-8 decoder
+ uri = unescape(uri);
+ }
+
+ if (scriptUriRegExp.test(uri)) {
+ return;
+ }
+
+ if (!settings.allow_html_data_urls && dataUriRegExp.test(uri) && !/^data:image\//i.test(uri)) {
+ return;
+ }
+ }
+
+ // Block data or event attributes on elements marked as internal
+ if (isInternalElement && (name in filteredUrlAttrs || name.indexOf('on') === 0)) {
+ return;
+ }
+
+ // Add attribute to list and map
+ attrList.map[name] = value;
+ attrList.push({
+ name: name,
+ value: value
+ });
+ };
+
+ // Precompile RegExps and map objects
+ tokenRegExp = new RegExp('<(?:' +
+ '(?:!--([\\w\\W]*?)-->)|' + // Comment
+ '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + // CDATA
+ '(?:!DOCTYPE([\\w\\W]*?)>)|' + // DOCTYPE
+ '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + // PI
+ '(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|' + // End element
+ '(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\\/|\\s+)>)' + // Start element
+ ')', 'g');
+
+ attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g;
+
+ // Setup lookup tables for empty elements and boolean attributes
+ shortEndedElements = schema.getShortEndedElements();
+ selfClosing = settings.self_closing_elements || schema.getSelfClosingElements();
+ fillAttrsMap = schema.getBoolAttrs();
+ validate = settings.validate;
+ removeInternalElements = settings.remove_internals;
+ fixSelfClosing = settings.fix_self_closing;
+ specialElements = schema.getSpecialElements();
+ processHtml = html + '>';
+
+ while ((matches = tokenRegExp.exec(processHtml))) { // Adds and extra '>' to keep regexps from doing catastrofic backtracking on malformed html
+ // Text
+ if (index < matches.index) {
+ self.text(decode(html.substr(index, matches.index - index)));
+ }
+
+ if ((value = matches[6])) { // End element
+ value = value.toLowerCase();
+
+ // IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements
+ if (value.charAt(0) === ':') {
+ value = value.substr(1);
+ }
+
+ processEndTag(value);
+ } else if ((value = matches[7])) { // Start element
+ // Did we consume the extra character then treat it as text
+ // This handles the case with html like this: "text a html.length) {
+ self.text(decode(html.substr(matches.index)));
+ index = matches.index + matches[0].length;
+ continue;
+ }
+
+ value = value.toLowerCase();
+
+ // IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements
+ if (value.charAt(0) === ':') {
+ value = value.substr(1);
+ }
+
+ isShortEnded = value in shortEndedElements;
+
+ // Is self closing tag for example an
after an open
+ if (fixSelfClosing && selfClosing[value] && stack.length > 0 && stack[stack.length - 1].name === value) {
+ processEndTag(value);
+ }
+
+ // Validate element
+ if (!validate || (elementRule = schema.getElementRule(value))) {
+ isValidElement = true;
+
+ // Grab attributes map and patters when validation is enabled
+ if (validate) {
+ validAttributesMap = elementRule.attributes;
+ validAttributePatterns = elementRule.attributePatterns;
+ }
+
+ // Parse attributes
+ if ((attribsValue = matches[8])) {
+ isInternalElement = attribsValue.indexOf('data-mce-type') !== -1; // Check if the element is an internal element
+
+ // If the element has internal attributes then remove it if we are told to do so
+ if (isInternalElement && removeInternalElements) {
+ isValidElement = false;
+ }
+
+ attrList = [];
+ attrList.map = {};
+
+ attribsValue.replace(attrRegExp, parseAttribute);
+ } else {
+ attrList = [];
+ attrList.map = {};
+ }
+
+ // Process attributes if validation is enabled
+ if (validate && !isInternalElement) {
+ attributesRequired = elementRule.attributesRequired;
+ attributesDefault = elementRule.attributesDefault;
+ attributesForced = elementRule.attributesForced;
+ anyAttributesRequired = elementRule.removeEmptyAttrs;
+
+ // Check if any attribute exists
+ if (anyAttributesRequired && !attrList.length) {
+ isValidElement = false;
+ }
+
+ // Handle forced attributes
+ if (attributesForced) {
+ i = attributesForced.length;
+ while (i--) {
+ attr = attributesForced[i];
+ name = attr.name;
+ attrValue = attr.value;
+
+ if (attrValue === '{$uid}') {
+ attrValue = 'mce_' + idCount++;
+ }
+
+ attrList.map[name] = attrValue;
+ attrList.push({ name: name, value: attrValue });
+ }
+ }
+
+ // Handle default attributes
+ if (attributesDefault) {
+ i = attributesDefault.length;
+ while (i--) {
+ attr = attributesDefault[i];
+ name = attr.name;
+
+ if (!(name in attrList.map)) {
+ attrValue = attr.value;
+
+ if (attrValue === '{$uid}') {
+ attrValue = 'mce_' + idCount++;
+ }
+
+ attrList.map[name] = attrValue;
+ attrList.push({ name: name, value: attrValue });
+ }
+ }
+ }
+
+ // Handle required attributes
+ if (attributesRequired) {
+ i = attributesRequired.length;
+ while (i--) {
+ if (attributesRequired[i] in attrList.map) {
+ break;
+ }
+ }
+
+ // None of the required attributes where found
+ if (i === -1) {
+ isValidElement = false;
+ }
+ }
+
+ // Invalidate element if it's marked as bogus
+ if ((attr = attrList.map['data-mce-bogus'])) {
+ if (attr === 'all') {
+ index = findEndTag(schema, html, tokenRegExp.lastIndex);
+ tokenRegExp.lastIndex = index;
+ continue;
+ }
+
+ isValidElement = false;
+ }
+ }
+
+ if (isValidElement) {
+ self.start(value, attrList, isShortEnded);
+ }
+ } else {
+ isValidElement = false;
+ }
+
+ // Treat script, noscript and style a bit different since they may include code that looks like elements
+ if ((endRegExp = specialElements[value])) {
+ endRegExp.lastIndex = index = matches.index + matches[0].length;
+
+ if ((matches = endRegExp.exec(html))) {
+ if (isValidElement) {
+ text = html.substr(index, matches.index - index);
+ }
+
+ index = matches.index + matches[0].length;
+ } else {
+ text = html.substr(index);
+ index = html.length;
+ }
+
+ if (isValidElement) {
+ if (text.length > 0) {
+ self.text(text, true);
+ }
+
+ self.end(value);
+ }
+
+ tokenRegExp.lastIndex = index;
+ continue;
+ }
+
+ // Push value on to stack
+ if (!isShortEnded) {
+ if (!attribsValue || attribsValue.indexOf('/') != attribsValue.length - 1) {
+ stack.push({ name: value, valid: isValidElement });
+ } else if (isValidElement) {
+ self.end(value);
+ }
+ }
+ } else if ((value = matches[1])) { // Comment
+ // Padd comment value to avoid browsers from parsing invalid comments as HTML
+ if (value.charAt(0) === '>') {
+ value = ' ' + value;
+ }
+
+ if (!settings.allow_conditional_comments && value.substr(0, 3).toLowerCase() === '[if') {
+ value = ' ' + value;
+ }
+
+ self.comment(value);
+ } else if ((value = matches[2])) { // CDATA
+ self.cdata(trimComments(value));
+ } else if ((value = matches[3])) { // DOCTYPE
+ self.doctype(value);
+ } else if ((value = matches[4])) { // PI
+ self.pi(value, matches[5]);
+ }
+
+ index = matches.index + matches[0].length;
+ }
+
+ // Text
+ if (index < html.length) {
+ self.text(decode(html.substr(index)));
+ }
+
+ // Close any open elements
+ for (i = stack.length - 1; i >= 0; i--) {
+ value = stack[i];
+
+ if (value.valid) {
+ self.end(value.name);
+ }
+ }
+ };
+ };
+
+ SaxParser.findEndTag = findEndTag;
+
+ return SaxParser;
+ }
+);
+/**
+ * TrimHtml.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.dom.TrimHtml',
+ [
+ 'tinymce.core.html.SaxParser',
+ 'tinymce.core.text.Zwsp'
+ ],
+ function (SaxParser, Zwsp) {
+ var trimHtml = function (tempAttrs, html) {
+ var trimContentRegExp = new RegExp([
+ '\\s?(' + tempAttrs.join('|') + ')="[^"]+"' // Trim temporaty data-mce prefixed attributes like data-mce-selected
+ ].join('|'), 'gi');
+
+ return html.replace(trimContentRegExp, '');
+ };
+
+ var trimInternal = function (serializer, html) {
+ var content = html;
+ var bogusAllRegExp = /<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g;
+ var endTagIndex, index, matchLength, matches, shortEndedElements;
+ var schema = serializer.schema;
+
+ content = trimHtml(serializer.getTempAttrs(), content);
+ shortEndedElements = schema.getShortEndedElements();
+
+ // Remove all bogus elements marked with "all"
+ while ((matches = bogusAllRegExp.exec(content))) {
+ index = bogusAllRegExp.lastIndex;
+ matchLength = matches[0].length;
+
+ if (shortEndedElements[matches[1]]) {
+ endTagIndex = index;
+ } else {
+ endTagIndex = SaxParser.findEndTag(schema, content, index);
+ }
+
+ content = content.substring(0, index - matchLength) + content.substring(endTagIndex);
+ bogusAllRegExp.lastIndex = index - matchLength;
+ }
+
+ return content;
+ };
+
+ var trimExternal = function (serializer, html) {
+ return Zwsp.trim(trimInternal(serializer, html));
+ };
+
+ return {
+ trimExternal: trimExternal,
+ trimInternal: trimInternal
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.search.PredicateExists',
+
+ [
+ 'ephox.sugar.api.search.PredicateFind'
+ ],
+
+ function (PredicateFind) {
+ var any = function (predicate) {
+ return PredicateFind.first(predicate).isSome();
+ };
+
+ var ancestor = function (scope, predicate, isRoot) {
+ return PredicateFind.ancestor(scope, predicate, isRoot).isSome();
+ };
+
+ var closest = function (scope, predicate, isRoot) {
+ return PredicateFind.closest(scope, predicate, isRoot).isSome();
+ };
+
+ var sibling = function (scope, predicate) {
+ return PredicateFind.sibling(scope, predicate).isSome();
+ };
+
+ var child = function (scope, predicate) {
+ return PredicateFind.child(scope, predicate).isSome();
+ };
+
+ var descendant = function (scope, predicate) {
+ return PredicateFind.descendant(scope, predicate).isSome();
+ };
+
+ return {
+ any: any,
+ ancestor: ancestor,
+ closest: closest,
+ sibling: sibling,
+ child: child,
+ descendant: descendant
+ };
+ }
+);
+
+define(
+ 'ephox.sugar.api.dom.Focus',
+
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.PredicateExists',
+ 'ephox.sugar.api.search.Traverse',
+ 'global!document'
+ ],
+
+ function (Fun, Option, Compare, Element, PredicateExists, Traverse, document) {
+ var focus = function (element) {
+ element.dom().focus();
+ };
+
+ var blur = function (element) {
+ element.dom().blur();
+ };
+
+ var hasFocus = function (element) {
+ var doc = Traverse.owner(element).dom();
+ return element.dom() === doc.activeElement;
+ };
+
+ var active = function (_doc) {
+ var doc = _doc !== undefined ? _doc.dom() : document;
+ return Option.from(doc.activeElement).map(Element.fromDom);
+ };
+
+ var focusInside = function (element) {
+ // Only call focus if the focus is not already inside it.
+ var doc = Traverse.owner(element);
+ var inside = active(doc).filter(function (a) {
+ return PredicateExists.closest(a, Fun.curry(Compare.eq, element));
+ });
+
+ inside.fold(function () {
+ focus(element);
+ }, Fun.noop);
+ };
+
+ /**
+ * Return the descendant element that has focus.
+ * Use instead of SelectorFind.descendant(container, ':focus')
+ * because the :focus selector relies on keyboard focus.
+ */
+ var search = function (element) {
+ return active(Traverse.owner(element)).filter(function (e) {
+ return element.dom().contains(e.dom());
+ });
+ };
+
+ return {
+ hasFocus: hasFocus,
+ focus: focus,
+ blur: blur,
+ active: active,
+ search: search,
+ focusInside: focusInside
+ };
+ }
+);
+/**
+ * EditorFocus.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.focus.EditorFocus',
+ [
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.dom.Focus',
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.Env',
+ 'tinymce.core.caret.CaretFinder',
+ 'tinymce.core.dom.ElementType',
+ 'tinymce.core.selection.RangeNodes',
+ 'tinymce.core.selection.SelectionBookmark'
+ ],
+ function (Option, Compare, Focus, Element, Env, CaretFinder, ElementType, RangeNodes, SelectionBookmark) {
+ var getContentEditableHost = function (editor, node) {
+ return editor.dom.getParent(node, function (node) {
+ return editor.dom.getContentEditable(node) === "true";
+ });
+ };
+
+ var getCollapsedNode = function (rng) {
+ return rng.collapsed ? Option.from(RangeNodes.getNode(rng.startContainer, rng.startOffset)).map(Element.fromDom) : Option.none();
+ };
+
+ var getFocusInElement = function (root, rng) {
+ return getCollapsedNode(rng).bind(function (node) {
+ if (ElementType.isTableSection(node)) {
+ return Option.some(node);
+ } else if (Compare.contains(root, node) === false) {
+ return Option.some(root);
+ } else {
+ return Option.none();
+ }
+ });
+ };
+
+ var normalizeSelection = function (editor, rng) {
+ getFocusInElement(Element.fromDom(editor.getBody()), rng).bind(function (elm) {
+ return CaretFinder.firstPositionIn(elm.dom());
+ }).fold(
+ function () {
+ editor.selection.normalize();
+ },
+ function (caretPos) {
+ editor.selection.setRng(caretPos.toRange());
+ }
+ );
+ };
+
+ var focusBody = function (body) {
+ if (body.setActive) {
+ // IE 11 sometimes throws "Invalid function" then fallback to focus
+ // setActive is better since it doesn't scroll to the element being focused
+ try {
+ body.setActive();
+ } catch (ex) {
+ body.focus();
+ }
+ } else {
+ body.focus();
+ }
+ };
+
+ var hasElementFocus = function (elm) {
+ return Focus.hasFocus(elm) || Focus.search(elm).isSome();
+ };
+
+ var hasIframeFocus = function (editor) {
+ return editor.iframeElement && Focus.hasFocus(Element.fromDom(editor.iframeElement));
+ };
+
+ var hasInlineFocus = function (editor) {
+ var rawBody = editor.getBody();
+ return rawBody && hasElementFocus(Element.fromDom(rawBody));
+ };
+
+ var hasFocus = function (editor) {
+ return editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor);
+ };
+
+ var focusEditor = function (editor) {
+ var selection = editor.selection, contentEditable = editor.settings.content_editable;
+ var body = editor.getBody(), contentEditableHost, rng = selection.getRng();
+
+ editor.quirks.refreshContentEditable();
+
+ // Move focus to contentEditable=true child if needed
+ contentEditableHost = getContentEditableHost(editor, selection.getNode());
+ if (editor.$.contains(body, contentEditableHost)) {
+ focusBody(contentEditableHost);
+ normalizeSelection(editor, rng);
+ activateEditor(editor);
+ return;
+ }
+
+ if (editor.bookmark !== undefined && hasFocus(editor) === false) {
+ SelectionBookmark.getRng(editor).each(function (bookmarkRng) {
+ editor.selection.setRng(bookmarkRng);
+ rng = bookmarkRng;
+ });
+ }
+
+ // Focus the window iframe
+ if (!contentEditable) {
+ // WebKit needs this call to fire focusin event properly see #5948
+ // But Opera pre Blink engine will produce an empty selection so skip Opera
+ if (!Env.opera) {
+ focusBody(body);
+ }
+
+ editor.getWin().focus();
+ }
+
+ // Focus the body as well since it's contentEditable
+ if (Env.gecko || contentEditable) {
+ focusBody(body);
+ normalizeSelection(editor, rng);
+ }
+
+ activateEditor(editor);
+ };
+
+ var activateEditor = function (editor) {
+ editor.editorManager.setActive(editor);
+ };
+
+ var focus = function (editor, skipFocus) {
+ if (editor.removed) {
+ return;
+ }
+
+ skipFocus ? activateEditor(editor) : focusEditor(editor);
+ };
+
+ return {
+ focus: focus,
+ hasFocus: hasFocus
+ };
+ }
+);
+
+/**
+ * EditorView.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2016 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.EditorView',
+ [
+ 'ephox.katamari.api.Fun',
+ 'ephox.katamari.api.Option',
+ 'ephox.sugar.api.dom.Compare',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.properties.Css',
+ 'ephox.sugar.api.search.Traverse'
+ ],
+ function (Fun, Option, Compare, Element, Css, Traverse) {
+ var getProp = function (propName, elm) {
+ var rawElm = elm.dom();
+ return rawElm[propName];
+ };
+
+ var getComputedSizeProp = function (propName, elm) {
+ return parseInt(Css.get(elm, propName), 10);
+ };
+
+ var getClientWidth = Fun.curry(getProp, 'clientWidth');
+ var getClientHeight = Fun.curry(getProp, 'clientHeight');
+ var getMarginTop = Fun.curry(getComputedSizeProp, 'margin-top');
+ var getMarginLeft = Fun.curry(getComputedSizeProp, 'margin-left');
+
+ var getBoundingClientRect = function (elm) {
+ return elm.dom().getBoundingClientRect();
+ };
+
+ var isInsideElementContentArea = function (bodyElm, clientX, clientY) {
+ var clientWidth = getClientWidth(bodyElm);
+ var clientHeight = getClientHeight(bodyElm);
+
+ return clientX >= 0 && clientY >= 0 && clientX <= clientWidth && clientY <= clientHeight;
+ };
+
+ var transpose = function (inline, elm, clientX, clientY) {
+ var clientRect = getBoundingClientRect(elm);
+ var deltaX = inline ? clientRect.left + elm.dom().clientLeft + getMarginLeft(elm) : 0;
+ var deltaY = inline ? clientRect.top + elm.dom().clientTop + getMarginTop(elm) : 0;
+ var x = clientX - deltaX;
+ var y = clientY - deltaY;
+
+ return { x: x, y: y };
+ };
+
+ // Checks if the specified coordinate is within the visual content area excluding the scrollbars
+ var isXYInContentArea = function (editor, clientX, clientY) {
+ var bodyElm = Element.fromDom(editor.getBody());
+ var targetElm = editor.inline ? bodyElm : Traverse.documentElement(bodyElm);
+ var transposedPoint = transpose(editor.inline, targetElm, clientX, clientY);
+
+ return isInsideElementContentArea(targetElm, transposedPoint.x, transposedPoint.y);
+ };
+
+ var fromDomSafe = function (node) {
+ return Option.from(node).map(Element.fromDom);
+ };
+
+ var isEditorAttachedToDom = function (editor) {
+ var rawContainer = editor.inline ? editor.getBody() : editor.getContentAreaContainer();
+
+ return fromDomSafe(rawContainer).map(function (container) {
+ return Compare.contains(Traverse.owner(container), container);
+ }).getOr(false);
+ };
+
+ return {
+ isXYInContentArea: isXYInContentArea,
+ isEditorAttachedToDom: isEditorAttachedToDom
+ };
+ }
+);
+
+/**
+ * NotificationManagerImpl.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.ui.NotificationManagerImpl',
+ [
+ ],
+ function () {
+ return function () {
+ var unimplemented = function () {
+ throw new Error('Theme did not provide a NotificationManager implementation.');
+ };
+
+ return {
+ open: unimplemented,
+ close: unimplemented,
+ reposition: unimplemented,
+ getArgs: unimplemented
+ };
+ };
+ }
+);
+
+/**
+ * NotificationManager.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class handles the creation of TinyMCE's notifications.
+ *
+ * @class tinymce.NotificationManager
+ * @example
+ * // Opens a new notification of type "error" with text "An error occurred."
+ * tinymce.activeEditor.notificationManager.open({
+ * text: 'An error occurred.',
+ * type: 'error'
+ * });
+ */
+define(
+ 'tinymce.core.api.NotificationManager',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Option',
+ 'tinymce.core.EditorView',
+ 'tinymce.core.ui.NotificationManagerImpl',
+ 'tinymce.core.util.Delay'
+ ],
+ function (Arr, Option, EditorView, NotificationManagerImpl, Delay) {
+ return function (editor) {
+ var notifications = [];
+
+ var getImplementation = function () {
+ var theme = editor.theme;
+ return theme && theme.getNotificationManagerImpl ? theme.getNotificationManagerImpl() : NotificationManagerImpl();
+ };
+
+ var getTopNotification = function () {
+ return Option.from(notifications[0]);
+ };
+
+ var isEqual = function (a, b) {
+ return a.type === b.type && a.text === b.text && !a.progressBar && !a.timeout && !b.progressBar && !b.timeout;
+ };
+
+ var reposition = function () {
+ if (notifications.length > 0) {
+ getImplementation().reposition(notifications);
+ }
+ };
+
+ var addNotification = function (notification) {
+ notifications.push(notification);
+ };
+
+ var closeNotification = function (notification) {
+ Arr.findIndex(notifications, function (otherNotification) {
+ return otherNotification === notification;
+ }).each(function (index) {
+ // Mutate here since third party might have stored away the window array
+ // TODO: Consider breaking this api
+ notifications.splice(index, 1);
+ });
+ };
+
+ var open = function (args) {
+ // Never open notification if editor has been removed.
+ if (editor.removed || !EditorView.isEditorAttachedToDom(editor)) {
+ return;
+ }
+
+ return Arr.find(notifications, function (notification) {
+ return isEqual(getImplementation().getArgs(notification), args);
+ }).getOrThunk(function () {
+ editor.editorManager.setActive(editor);
+
+ var notification = getImplementation().open(args, function () {
+ closeNotification(notification);
+ reposition();
+ });
+
+ addNotification(notification);
+ reposition();
+ return notification;
+ });
+ };
+
+ var close = function () {
+ getTopNotification().each(function (notification) {
+ getImplementation().close(notification);
+ closeNotification(notification);
+ reposition();
+ });
+ };
+
+ var getNotifications = function () {
+ return notifications;
+ };
+
+ var registerEvents = function (editor) {
+ editor.on('SkinLoaded', function () {
+ var serviceMessage = editor.settings.service_message;
+
+ if (serviceMessage) {
+ open({
+ text: serviceMessage,
+ type: 'warning',
+ timeout: 0,
+ icon: ''
+ });
+ }
+ });
+
+ editor.on('ResizeEditor ResizeWindow', function () {
+ Delay.requestAnimationFrame(reposition);
+ });
+
+ editor.on('remove', function () {
+ Arr.each(notifications, function (notification) {
+ getImplementation().close(notification);
+ });
+ });
+ };
+
+ registerEvents(editor);
+
+ return {
+ /**
+ * Opens a new notification.
+ *
+ * @method open
+ * @param {Object} args Optional name/value settings collection contains things like timeout/color/message etc.
+ */
+ open: open,
+
+ /**
+ * Closes the top most notification.
+ *
+ * @method close
+ */
+ close: close,
+
+ /**
+ * Returns the currently opened notification objects.
+ *
+ * @method getNotifications
+ * @return {Array} Array of the currently opened notifications.
+ */
+ getNotifications: getNotifications
+ };
+ };
+ }
+);
+
+/**
+ * WindowManagerImpl.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.ui.WindowManagerImpl',
+ [
+ ],
+ function () {
+ return function () {
+ var unimplemented = function () {
+ throw new Error('Theme did not provide a WindowManager implementation.');
+ };
+
+ return {
+ open: unimplemented,
+ alert: unimplemented,
+ confirm: unimplemented,
+ close: unimplemented,
+ getParams: unimplemented,
+ setParams: unimplemented
+ };
+ };
+ }
+);
+
+/**
+ * WindowManager.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class handles the creation of native windows and dialogs. This class can be extended to provide for example inline dialogs.
+ *
+ * @class tinymce.WindowManager
+ * @example
+ * // Opens a new dialog with the file.htm file and the size 320x240
+ * // It also adds a custom parameter this can be retrieved by using tinyMCEPopup.getWindowArg inside the dialog.
+ * tinymce.activeEditor.windowManager.open({
+ * url: 'file.htm',
+ * width: 320,
+ * height: 240
+ * }, {
+ * custom_param: 1
+ * });
+ *
+ * // Displays an alert box using the active editors window manager instance
+ * tinymce.activeEditor.windowManager.alert('Hello world!');
+ *
+ * // Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm
+ * });
+ */
+define(
+ 'tinymce.core.api.WindowManager',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Option',
+ 'tinymce.core.selection.SelectionBookmark',
+ 'tinymce.core.ui.WindowManagerImpl'
+ ],
+ function (Arr, Option, SelectionBookmark, WindowManagerImpl) {
+ return function (editor) {
+ var windows = [];
+
+ var getImplementation = function () {
+ var theme = editor.theme;
+ return theme && theme.getWindowManagerImpl ? theme.getWindowManagerImpl() : WindowManagerImpl();
+ };
+
+ var funcBind = function (scope, f) {
+ return function () {
+ return f ? f.apply(scope, arguments) : undefined;
+ };
+ };
+
+ var fireOpenEvent = function (win) {
+ editor.fire('OpenWindow', {
+ win: win
+ });
+ };
+
+ var fireCloseEvent = function (win) {
+ editor.fire('CloseWindow', {
+ win: win
+ });
+ };
+
+ var addWindow = function (win) {
+ windows.push(win);
+ fireOpenEvent(win);
+ };
+
+ var closeWindow = function (win) {
+ Arr.findIndex(windows, function (otherWindow) {
+ return otherWindow === win;
+ }).each(function (index) {
+ // Mutate here since third party might have stored away the window array, consider breaking this api
+ windows.splice(index, 1);
+
+ fireCloseEvent(win);
+
+ // Move focus back to editor when the last window is closed
+ if (windows.length === 0) {
+ editor.focus();
+ }
+ });
+ };
+
+ var getTopWindow = function () {
+ return Option.from(windows[windows.length - 1]);
+ };
+
+ var open = function (args, params) {
+ editor.editorManager.setActive(editor);
+ SelectionBookmark.store(editor);
+
+ var win = getImplementation().open(args, params, closeWindow);
+ addWindow(win);
+ return win;
+ };
+
+ var alert = function (message, callback, scope) {
+ var win = getImplementation().alert(message, funcBind(scope ? scope : this, callback), closeWindow);
+ addWindow(win);
+ };
+
+ var confirm = function (message, callback, scope) {
+ var win = getImplementation().confirm(message, funcBind(scope ? scope : this, callback), closeWindow);
+ addWindow(win);
+ };
+
+ var close = function () {
+ getTopWindow().each(function (win) {
+ getImplementation().close(win);
+ closeWindow(win);
+ });
+ };
+
+ var getParams = function () {
+ return getTopWindow().map(getImplementation().getParams).getOr(null);
+ };
+
+ var setParams = function (params) {
+ getTopWindow().each(function (win) {
+ getImplementation().setParams(win, params);
+ });
+ };
+
+ var getWindows = function () {
+ return windows;
+ };
+
+ editor.on('remove', function () {
+ Arr.each(windows.slice(0), function (win) {
+ getImplementation().close(win);
+ });
+ });
+
+ return {
+ // Used by the legacy3x compat layer and possible third party
+ // TODO: Deprecate this, and possible switch to a immutable window array for getWindows
+ windows: windows,
+
+ /**
+ * Opens a new window.
+ *
+ * @method open
+ * @param {Object} args Optional name/value settings collection contains things like width/height/url etc.
+ * @param {Object} params Options like title, file, width, height etc.
+ * @option {String} title Window title.
+ * @option {String} file URL of the file to open in the window.
+ * @option {Number} width Width in pixels.
+ * @option {Number} height Height in pixels.
+ * @option {Boolean} autoScroll Specifies whether the popup window can have scrollbars if required (i.e. content
+ * larger than the popup size specified).
+ */
+ open: open,
+
+ /**
+ * Creates a alert dialog. Please don't use the blocking behavior of this
+ * native version use the callback method instead then it can be extended.
+ *
+ * @method alert
+ * @param {String} message Text to display in the new alert dialog.
+ * @param {function} callback Callback function to be executed after the user has selected ok.
+ * @param {Object} scope Optional scope to execute the callback in.
+ * @example
+ * // Displays an alert box using the active editors window manager instance
+ * tinymce.activeEditor.windowManager.alert('Hello world!');
+ */
+ alert: alert,
+
+ /**
+ * Creates a confirm dialog. Please don't use the blocking behavior of this
+ * native version use the callback method instead then it can be extended.
+ *
+ * @method confirm
+ * @param {String} message Text to display in the new confirm dialog.
+ * @param {function} callback Callback function to be executed after the user has selected ok or cancel.
+ * @param {Object} scope Optional scope to execute the callback in.
+ * @example
+ * // Displays an confirm box and an alert message will be displayed depending on what you choose in the confirm
+ * tinymce.activeEditor.windowManager.confirm("Do you want to do something", function(s) {
+ * if (s)
+ * tinymce.activeEditor.windowManager.alert("Ok");
+ * else
+ * tinymce.activeEditor.windowManager.alert("Cancel");
+ * });
+ */
+ confirm: confirm,
+
+ /**
+ * Closes the top most window.
+ *
+ * @method close
+ */
+ close: close,
+
+ /**
+ * Returns the params of the last window open call. This can be used in iframe based
+ * dialog to get params passed from the tinymce plugin.
+ *
+ * @example
+ * var dialogArguments = top.tinymce.activeEditor.windowManager.getParams();
+ *
+ * @method getParams
+ * @return {Object} Name/value object with parameters passed from windowManager.open call.
+ */
+ getParams: getParams,
+
+ /**
+ * Sets the params of the last opened window.
+ *
+ * @method setParams
+ * @param {Object} params Params object to set for the last opened window.
+ */
+ setParams: setParams,
+
+ /**
+ * Returns the currently opened window objects.
+ *
+ * @method getWindows
+ * @return {Array} Array of the currently opened windows.
+ */
+ getWindows: getWindows
+ };
+ };
+ }
+);
+
+/**
+ * ErrorReporter.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Various error reporting helper functions.
+ *
+ * @class tinymce.ErrorReporter
+ * @private
+ */
+define(
+ 'tinymce.core.ErrorReporter',
+ [
+ 'global!window',
+ 'tinymce.core.AddOnManager'
+ ],
+ function (window, AddOnManager) {
+ var PluginManager = AddOnManager.PluginManager;
+
+ var resolvePluginName = function (targetUrl, suffix) {
+ for (var name in PluginManager.urls) {
+ var matchUrl = PluginManager.urls[name] + '/plugin' + suffix + '.js';
+ if (matchUrl === targetUrl) {
+ return name;
+ }
+ }
+
+ return null;
+ };
+
+ var pluginUrlToMessage = function (editor, url) {
+ var plugin = resolvePluginName(url, editor.suffix);
+ return plugin ?
+ 'Failed to load plugin: ' + plugin + ' from url ' + url :
+ 'Failed to load plugin url: ' + url;
+ };
+
+ var displayNotification = function (editor, message) {
+ editor.notificationManager.open({
+ type: 'error',
+ text: message
+ });
+ };
+
+ var displayError = function (editor, message) {
+ if (editor._skinLoaded) {
+ displayNotification(editor, message);
+ } else {
+ editor.on('SkinLoaded', function () {
+ displayNotification(editor, message);
+ });
+ }
+ };
+
+ var uploadError = function (editor, message) {
+ displayError(editor, 'Failed to upload image: ' + message);
+ };
+
+ var pluginLoadError = function (editor, url) {
+ displayError(editor, pluginUrlToMessage(editor, url));
+ };
+
+ var initError = function (message) {
+ var console = window.console;
+ if (console && !window.test) { // Skip test env
+ if (console.error) {
+ console.error.apply(console, arguments);
+ } else {
+ console.log.apply(console, arguments);
+ }
+ }
+ };
+
+ return {
+ pluginLoadError: pluginLoadError,
+ uploadError: uploadError,
+ displayError: displayError,
+ initError: initError
+ };
+ }
+);
+/**
+ * PluginManager.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.PluginManager',
+ [
+ 'tinymce.core.AddOnManager'
+ ],
+ function (AddOnManager) {
+ return AddOnManager.PluginManager;
+ }
+);
+
+/**
+ * ThemeManager.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.ThemeManager',
+ [
+ 'tinymce.core.AddOnManager'
+ ],
+ function (AddOnManager) {
+ return AddOnManager.ThemeManager;
+ }
+);
+
+define(
+ 'ephox.sand.api.XMLHttpRequest',
+
+ [
+ 'ephox.sand.util.Global'
+ ],
+
+ function (Global) {
+ /*
+ * IE8 and above per
+ * https://developer.mozilla.org/en/docs/XMLHttpRequest
+ */
+ return function () {
+ var f = Global.getOrDie('XMLHttpRequest');
+ return new f();
+ };
+ }
+);
+/**
+ * Uploader.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Upload blobs or blob infos to the specified URL or handler.
+ *
+ * @private
+ * @class tinymce.file.Uploader
+ * @example
+ * var uploader = new Uploader({
+ * url: '/upload.php',
+ * basePath: '/base/path',
+ * credentials: true,
+ * handler: function(data, success, failure) {
+ * ...
+ * }
+ * });
+ *
+ * uploader.upload(blobInfos).then(function(result) {
+ * ...
+ * });
+ */
+define(
+ 'tinymce.core.file.Uploader',
+ [
+ 'ephox.sand.api.XMLHttpRequest',
+ 'global!window',
+ 'tinymce.core.util.Fun',
+ 'tinymce.core.util.Promise',
+ 'tinymce.core.util.Tools'
+ ],
+ function (XMLHttpRequest, window, Fun, Promise, Tools) {
+ return function (uploadStatus, settings) {
+ var pendingPromises = {};
+
+ var pathJoin = function (path1, path2) {
+ if (path1) {
+ return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '');
+ }
+
+ return path2;
+ };
+
+ var defaultHandler = function (blobInfo, success, failure, progress) {
+ var xhr, formData;
+
+ xhr = new XMLHttpRequest();
+ xhr.open('POST', settings.url);
+ xhr.withCredentials = settings.credentials;
+
+ xhr.upload.onprogress = function (e) {
+ progress(e.loaded / e.total * 100);
+ };
+
+ xhr.onerror = function () {
+ failure("Image upload failed due to a XHR Transport error. Code: " + xhr.status);
+ };
+
+ xhr.onload = function () {
+ var json;
+
+ if (xhr.status < 200 || xhr.status >= 300) {
+ failure("HTTP Error: " + xhr.status);
+ return;
+ }
+
+ json = JSON.parse(xhr.responseText);
+
+ if (!json || typeof json.location != "string") {
+ failure("Invalid JSON: " + xhr.responseText);
+ return;
+ }
+
+ success(pathJoin(settings.basePath, json.location));
+ };
+
+ formData = new window.FormData(); // TODO: Stick this in sand
+ formData.append('file', blobInfo.blob(), blobInfo.filename());
+
+ xhr.send(formData);
+ };
+
+ var noUpload = function () {
+ return new Promise(function (resolve) {
+ resolve([]);
+ });
+ };
+
+ var handlerSuccess = function (blobInfo, url) {
+ return {
+ url: url,
+ blobInfo: blobInfo,
+ status: true
+ };
+ };
+
+ var handlerFailure = function (blobInfo, error) {
+ return {
+ url: '',
+ blobInfo: blobInfo,
+ status: false,
+ error: error
+ };
+ };
+
+ var resolvePending = function (blobUri, result) {
+ Tools.each(pendingPromises[blobUri], function (resolve) {
+ resolve(result);
+ });
+
+ delete pendingPromises[blobUri];
+ };
+
+ var uploadBlobInfo = function (blobInfo, handler, openNotification) {
+ uploadStatus.markPending(blobInfo.blobUri());
+
+ return new Promise(function (resolve) {
+ var notification, progress;
+
+ var noop = function () {
+ };
+
+ try {
+ var closeNotification = function () {
+ if (notification) {
+ notification.close();
+ progress = noop; // Once it's closed it's closed
+ }
+ };
+
+ var success = function (url) {
+ closeNotification();
+ uploadStatus.markUploaded(blobInfo.blobUri(), url);
+ resolvePending(blobInfo.blobUri(), handlerSuccess(blobInfo, url));
+ resolve(handlerSuccess(blobInfo, url));
+ };
+
+ var failure = function (error) {
+ closeNotification();
+ uploadStatus.removeFailed(blobInfo.blobUri());
+ resolvePending(blobInfo.blobUri(), handlerFailure(blobInfo, error));
+ resolve(handlerFailure(blobInfo, error));
+ };
+
+ progress = function (percent) {
+ if (percent < 0 || percent > 100) {
+ return;
+ }
+
+ if (!notification) {
+ notification = openNotification();
+ }
+
+ notification.progressBar.value(percent);
+ };
+
+ handler(blobInfo, success, failure, progress);
+ } catch (ex) {
+ resolve(handlerFailure(blobInfo, ex.message));
+ }
+ });
+ };
+
+ var isDefaultHandler = function (handler) {
+ return handler === defaultHandler;
+ };
+
+ var pendingUploadBlobInfo = function (blobInfo) {
+ var blobUri = blobInfo.blobUri();
+
+ return new Promise(function (resolve) {
+ pendingPromises[blobUri] = pendingPromises[blobUri] || [];
+ pendingPromises[blobUri].push(resolve);
+ });
+ };
+
+ var uploadBlobs = function (blobInfos, openNotification) {
+ blobInfos = Tools.grep(blobInfos, function (blobInfo) {
+ return !uploadStatus.isUploaded(blobInfo.blobUri());
+ });
+
+ return Promise.all(Tools.map(blobInfos, function (blobInfo) {
+ return uploadStatus.isPending(blobInfo.blobUri()) ?
+ pendingUploadBlobInfo(blobInfo) : uploadBlobInfo(blobInfo, settings.handler, openNotification);
+ }));
+ };
+
+ var upload = function (blobInfos, openNotification) {
+ return (!settings.url && isDefaultHandler(settings.handler)) ? noUpload() : uploadBlobs(blobInfos, openNotification);
+ };
+
+ settings = Tools.extend({
+ credentials: false,
+ // We are adding a notify argument to this (at the moment, until it doesn't work)
+ handler: defaultHandler
+ }, settings);
+
+ return {
+ upload: upload
+ };
+ };
+ }
+);
+define(
+ 'ephox.sand.api.Blob',
+
+ [
+ 'ephox.sand.util.Global'
+ ],
+
+ function (Global) {
+ /*
+ * IE10 and above per
+ * https://developer.mozilla.org/en-US/docs/Web/API/Blob
+ */
+ return function (parts, properties) {
+ var f = Global.getOrDie('Blob');
+ return new f(parts, properties);
+ };
+ }
+);
+define(
+ 'ephox.sand.api.FileReader',
+
+ [
+ 'ephox.sand.util.Global'
+ ],
+
+ function (Global) {
+ /*
+ * IE10 and above per
+ * https://developer.mozilla.org/en-US/docs/Web/API/FileReader
+ */
+ return function () {
+ var f = Global.getOrDie('FileReader');
+ return new f();
+ };
+ }
+);
+define(
+ 'ephox.sand.api.Uint8Array',
+
+ [
+ 'ephox.sand.util.Global'
+ ],
+
+ function (Global) {
+ /*
+ * https://developer.mozilla.org/en-US/docs/Web/API/Uint8Array
+ *
+ * IE10 and above per
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays
+ */
+ return function (arr) {
+ var f = Global.getOrDie('Uint8Array');
+ return new f(arr);
+ };
+ }
+);
+define(
+ 'ephox.sand.api.Window',
+
+ [
+ 'ephox.sand.util.Global'
+ ],
+
+ function (Global) {
+ /******************************************************************************************
+ * BIG BIG WARNING: Don't put anything other than top-level window functions in here.
+ *
+ * Objects that are technically available as window.X should be in their own module X (e.g. Blob, FileReader, URL).
+ ******************************************************************************************
+ */
+
+ /*
+ * IE10 and above per
+ * https://developer.mozilla.org/en/docs/Web/API/window.requestAnimationFrame
+ */
+ var requestAnimationFrame = function (callback) {
+ var f = Global.getOrDie('requestAnimationFrame');
+ f(callback);
+ };
+
+ /*
+ * IE10 and above per
+ * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64.atob
+ */
+ var atob = function (base64) {
+ var f = Global.getOrDie('atob');
+ return f(base64);
+ };
+
+ return {
+ atob: atob,
+ requestAnimationFrame: requestAnimationFrame
+ };
+ }
+);
+/**
+ * Conversions.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Converts blob/uris back and forth.
+ *
+ * @private
+ * @class tinymce.file.Conversions
+ */
+define(
+ 'tinymce.core.file.Conversions',
+ [
+ 'ephox.sand.api.Blob',
+ 'ephox.sand.api.FileReader',
+ 'ephox.sand.api.Uint8Array',
+ 'ephox.sand.api.Window',
+ 'ephox.sand.api.XMLHttpRequest',
+ 'tinymce.core.util.Promise'
+ ],
+ function (Blob, FileReader, Uint8Array, Window, XMLHttpRequest, Promise) {
+ var blobUriToBlob = function (url) {
+ return new Promise(function (resolve, reject) {
+
+ var rejectWithError = function () {
+ reject("Cannot convert " + url + " to Blob. Resource might not exist or is inaccessible.");
+ };
+
+ try {
+ var xhr = new XMLHttpRequest();
+
+ xhr.open('GET', url, true);
+ xhr.responseType = 'blob';
+
+ xhr.onload = function () {
+ if (this.status == 200) {
+ resolve(this.response);
+ } else {
+ // IE11 makes it into onload but responds with status 500
+ rejectWithError();
+ }
+ };
+
+ // Chrome fires an error event instead of the exception
+ // Also there seems to be no way to intercept the message that is logged to the console
+ xhr.onerror = rejectWithError;
+
+ xhr.send();
+ } catch (ex) {
+ rejectWithError();
+ }
+ });
+ };
+
+ var parseDataUri = function (uri) {
+ var type, matches;
+
+ uri = decodeURIComponent(uri).split(',');
+
+ matches = /data:([^;]+)/.exec(uri[0]);
+ if (matches) {
+ type = matches[1];
+ }
+
+ return {
+ type: type,
+ data: uri[1]
+ };
+ };
+
+ var dataUriToBlob = function (uri) {
+ return new Promise(function (resolve) {
+ var str, arr, i;
+
+ uri = parseDataUri(uri);
+
+ // Might throw error if data isn't proper base64
+ try {
+ str = Window.atob(uri.data);
+ } catch (e) {
+ resolve(new Blob([]));
+ return;
+ }
+
+ arr = new Uint8Array(str.length);
+
+ for (i = 0; i < arr.length; i++) {
+ arr[i] = str.charCodeAt(i);
+ }
+
+ resolve(new Blob([arr], { type: uri.type }));
+ });
+ };
+
+ var uriToBlob = function (url) {
+ if (url.indexOf('blob:') === 0) {
+ return blobUriToBlob(url);
+ }
+
+ if (url.indexOf('data:') === 0) {
+ return dataUriToBlob(url);
+ }
+
+ return null;
+ };
+
+ var blobToDataUri = function (blob) {
+ return new Promise(function (resolve) {
+ var reader = new FileReader();
+
+ reader.onloadend = function () {
+ resolve(reader.result);
+ };
+
+ reader.readAsDataURL(blob);
+ });
+ };
+
+ return {
+ uriToBlob: uriToBlob,
+ blobToDataUri: blobToDataUri,
+ parseDataUri: parseDataUri
+ };
+ }
+);
+/**
+ * ImageScanner.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Finds images with data uris or blob uris. If data uris are found it will convert them into blob uris.
+ *
+ * @private
+ * @class tinymce.file.ImageScanner
+ */
+define(
+ 'tinymce.core.file.ImageScanner',
+ [
+ "tinymce.core.util.Promise",
+ "tinymce.core.util.Arr",
+ "tinymce.core.util.Fun",
+ "tinymce.core.file.Conversions",
+ "tinymce.core.Env"
+ ],
+ function (Promise, Arr, Fun, Conversions, Env) {
+ var count = 0;
+
+ var uniqueId = function (prefix) {
+ return (prefix || 'blobid') + (count++);
+ };
+
+ var imageToBlobInfo = function (blobCache, img, resolve, reject) {
+ var base64, blobInfo;
+
+ if (img.src.indexOf('blob:') === 0) {
+ blobInfo = blobCache.getByUri(img.src);
+
+ if (blobInfo) {
+ resolve({
+ image: img,
+ blobInfo: blobInfo
+ });
+ } else {
+ Conversions.uriToBlob(img.src).then(function (blob) {
+ Conversions.blobToDataUri(blob).then(function (dataUri) {
+ base64 = Conversions.parseDataUri(dataUri).data;
+ blobInfo = blobCache.create(uniqueId(), blob, base64);
+ blobCache.add(blobInfo);
+
+ resolve({
+ image: img,
+ blobInfo: blobInfo
+ });
+ });
+ }, function (err) {
+ reject(err);
+ });
+ }
+
+ return;
+ }
+
+ base64 = Conversions.parseDataUri(img.src).data;
+ blobInfo = blobCache.findFirst(function (cachedBlobInfo) {
+ return cachedBlobInfo.base64() === base64;
+ });
+
+ if (blobInfo) {
+ resolve({
+ image: img,
+ blobInfo: blobInfo
+ });
+ } else {
+ Conversions.uriToBlob(img.src).then(function (blob) {
+ blobInfo = blobCache.create(uniqueId(), blob, base64);
+ blobCache.add(blobInfo);
+
+ resolve({
+ image: img,
+ blobInfo: blobInfo
+ });
+ }, function (err) {
+ reject(err);
+ });
+ }
+ };
+
+ var getAllImages = function (elm) {
+ return elm ? elm.getElementsByTagName('img') : [];
+ };
+
+ return function (uploadStatus, blobCache) {
+ var cachedPromises = {};
+
+ var findAll = function (elm, predicate) {
+ var images, promises;
+
+ if (!predicate) {
+ predicate = Fun.constant(true);
+ }
+
+ images = Arr.filter(getAllImages(elm), function (img) {
+ var src = img.src;
+
+ if (!Env.fileApi) {
+ return false;
+ }
+
+ if (img.hasAttribute('data-mce-bogus')) {
+ return false;
+ }
+
+ if (img.hasAttribute('data-mce-placeholder')) {
+ return false;
+ }
+
+ if (!src || src == Env.transparentSrc) {
+ return false;
+ }
+
+ if (src.indexOf('blob:') === 0) {
+ return !uploadStatus.isUploaded(src);
+ }
+
+ if (src.indexOf('data:') === 0) {
+ return predicate(img);
+ }
+
+ return false;
+ });
+
+ promises = Arr.map(images, function (img) {
+ var newPromise;
+
+ if (cachedPromises[img.src]) {
+ // Since the cached promise will return the cached image
+ // We need to wrap it and resolve with the actual image
+ return new Promise(function (resolve) {
+ cachedPromises[img.src].then(function (imageInfo) {
+ if (typeof imageInfo === 'string') { // error apparently
+ return imageInfo;
+ }
+ resolve({
+ image: img,
+ blobInfo: imageInfo.blobInfo
+ });
+ });
+ });
+ }
+
+ newPromise = new Promise(function (resolve, reject) {
+ imageToBlobInfo(blobCache, img, resolve, reject);
+ }).then(function (result) {
+ delete cachedPromises[result.image.src];
+ return result;
+ })['catch'](function (error) {
+ delete cachedPromises[img.src];
+ return error;
+ });
+
+ cachedPromises[img.src] = newPromise;
+
+ return newPromise;
+ });
+
+ return Promise.all(promises);
+ };
+
+ return {
+ findAll: findAll
+ };
+ };
+ }
+);
+/**
+ * Uuid.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Generates unique ids.
+ *
+ * @class tinymce.util.Uuid
+ * @private
+ */
+define(
+ 'tinymce.core.util.Uuid',
+ [
+ ],
+ function () {
+ var count = 0;
+
+ var seed = function () {
+ var rnd = function () {
+ return Math.round(Math.random() * 0xFFFFFFFF).toString(36);
+ };
+
+ var now = new Date().getTime();
+ return 's' + now.toString(36) + rnd() + rnd() + rnd();
+ };
+
+ var uuid = function (prefix) {
+ return prefix + (count++) + seed();
+ };
+
+ return {
+ uuid: uuid
+ };
+ }
+);
+
+/**
+ * BlobCache.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Hold blob info objects where a blob has extra internal information.
+ *
+ * @private
+ * @class tinymce.file.BlobCache
+ */
+define(
+ 'tinymce.core.file.BlobCache',
+ [
+ 'ephox.sand.api.URL',
+ 'tinymce.core.util.Arr',
+ 'tinymce.core.util.Fun',
+ 'tinymce.core.util.Uuid'
+ ],
+ function (URL, Arr, Fun, Uuid) {
+ return function () {
+ var cache = [], constant = Fun.constant;
+
+ var mimeToExt = function (mime) {
+ var mimes = {
+ 'image/jpeg': 'jpg',
+ 'image/jpg': 'jpg',
+ 'image/gif': 'gif',
+ 'image/png': 'png'
+ };
+
+ return mimes[mime.toLowerCase()] || 'dat';
+ };
+
+ var create = function (o, blob, base64, filename) {
+ return typeof o === 'object' ? toBlobInfo(o) : toBlobInfo({
+ id: o,
+ name: filename,
+ blob: blob,
+ base64: base64
+ });
+ };
+
+ var toBlobInfo = function (o) {
+ var id, name;
+
+ if (!o.blob || !o.base64) {
+ throw "blob and base64 representations of the image are required for BlobInfo to be created";
+ }
+
+ id = o.id || Uuid.uuid('blobid');
+ name = o.name || id;
+
+ return {
+ id: constant(id),
+ name: constant(name),
+ filename: constant(name + '.' + mimeToExt(o.blob.type)),
+ blob: constant(o.blob),
+ base64: constant(o.base64),
+ blobUri: constant(o.blobUri || URL.createObjectURL(o.blob)),
+ uri: constant(o.uri)
+ };
+ };
+
+ var add = function (blobInfo) {
+ if (!get(blobInfo.id())) {
+ cache.push(blobInfo);
+ }
+ };
+
+ var get = function (id) {
+ return findFirst(function (cachedBlobInfo) {
+ return cachedBlobInfo.id() === id;
+ });
+ };
+
+ var findFirst = function (predicate) {
+ return Arr.filter(cache, predicate)[0];
+ };
+
+ var getByUri = function (blobUri) {
+ return findFirst(function (blobInfo) {
+ return blobInfo.blobUri() == blobUri;
+ });
+ };
+
+ var removeByUri = function (blobUri) {
+ cache = Arr.filter(cache, function (blobInfo) {
+ if (blobInfo.blobUri() === blobUri) {
+ URL.revokeObjectURL(blobInfo.blobUri());
+ return false;
+ }
+
+ return true;
+ });
+ };
+
+ var destroy = function () {
+ Arr.each(cache, function (cachedBlobInfo) {
+ URL.revokeObjectURL(cachedBlobInfo.blobUri());
+ });
+
+ cache = [];
+ };
+
+ return {
+ create: create,
+ add: add,
+ get: get,
+ getByUri: getByUri,
+ findFirst: findFirst,
+ removeByUri: removeByUri,
+ destroy: destroy
+ };
+ };
+ }
+);
+/**
+ * UploadStatus.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Holds the current status of a blob uri, if it's pending or uploaded and what the result urls was.
+ *
+ * @private
+ * @class tinymce.file.UploadStatus
+ */
+define(
+ 'tinymce.core.file.UploadStatus',
+ [
+ ],
+ function () {
+ return function () {
+ var PENDING = 1, UPLOADED = 2;
+ var blobUriStatuses = {};
+
+ var createStatus = function (status, resultUri) {
+ return {
+ status: status,
+ resultUri: resultUri
+ };
+ };
+
+ var hasBlobUri = function (blobUri) {
+ return blobUri in blobUriStatuses;
+ };
+
+ var getResultUri = function (blobUri) {
+ var result = blobUriStatuses[blobUri];
+
+ return result ? result.resultUri : null;
+ };
+
+ var isPending = function (blobUri) {
+ return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === PENDING : false;
+ };
+
+ var isUploaded = function (blobUri) {
+ return hasBlobUri(blobUri) ? blobUriStatuses[blobUri].status === UPLOADED : false;
+ };
+
+ var markPending = function (blobUri) {
+ blobUriStatuses[blobUri] = createStatus(PENDING, null);
+ };
+
+ var markUploaded = function (blobUri, resultUri) {
+ blobUriStatuses[blobUri] = createStatus(UPLOADED, resultUri);
+ };
+
+ var removeFailed = function (blobUri) {
+ delete blobUriStatuses[blobUri];
+ };
+
+ var destroy = function () {
+ blobUriStatuses = {};
+ };
+
+ return {
+ hasBlobUri: hasBlobUri,
+ getResultUri: getResultUri,
+ isPending: isPending,
+ isUploaded: isUploaded,
+ markPending: markPending,
+ markUploaded: markUploaded,
+ removeFailed: removeFailed,
+ destroy: destroy
+ };
+ };
+ }
+);
+/**
+ * EditorUpload.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Handles image uploads, updates undo stack and patches over various internal functions.
+ *
+ * @private
+ * @class tinymce.EditorUpload
+ */
+define(
+ 'tinymce.core.EditorUpload',
+ [
+ "tinymce.core.util.Arr",
+ "tinymce.core.file.Uploader",
+ "tinymce.core.file.ImageScanner",
+ "tinymce.core.file.BlobCache",
+ "tinymce.core.file.UploadStatus",
+ "tinymce.core.ErrorReporter"
+ ],
+ function (Arr, Uploader, ImageScanner, BlobCache, UploadStatus, ErrorReporter) {
+ return function (editor) {
+ var blobCache = new BlobCache(), uploader, imageScanner, settings = editor.settings;
+ var uploadStatus = new UploadStatus();
+
+ var aliveGuard = function (callback) {
+ return function (result) {
+ if (editor.selection) {
+ return callback(result);
+ }
+
+ return [];
+ };
+ };
+
+ var cacheInvalidator = function () {
+ return '?' + (new Date()).getTime();
+ };
+
+ // Replaces strings without regexps to avoid FF regexp to big issue
+ var replaceString = function (content, search, replace) {
+ var index = 0;
+
+ do {
+ index = content.indexOf(search, index);
+
+ if (index !== -1) {
+ content = content.substring(0, index) + replace + content.substr(index + search.length);
+ index += replace.length - search.length + 1;
+ }
+ } while (index !== -1);
+
+ return content;
+ };
+
+ var replaceImageUrl = function (content, targetUrl, replacementUrl) {
+ content = replaceString(content, 'src="' + targetUrl + '"', 'src="' + replacementUrl + '"');
+ content = replaceString(content, 'data-mce-src="' + targetUrl + '"', 'data-mce-src="' + replacementUrl + '"');
+
+ return content;
+ };
+
+ var replaceUrlInUndoStack = function (targetUrl, replacementUrl) {
+ Arr.each(editor.undoManager.data, function (level) {
+ if (level.type === 'fragmented') {
+ level.fragments = Arr.map(level.fragments, function (fragment) {
+ return replaceImageUrl(fragment, targetUrl, replacementUrl);
+ });
+ } else {
+ level.content = replaceImageUrl(level.content, targetUrl, replacementUrl);
+ }
+ });
+ };
+
+ var openNotification = function () {
+ return editor.notificationManager.open({
+ text: editor.translate('Image uploading...'),
+ type: 'info',
+ timeout: -1,
+ progressBar: true
+ });
+ };
+
+ var replaceImageUri = function (image, resultUri) {
+ blobCache.removeByUri(image.src);
+ replaceUrlInUndoStack(image.src, resultUri);
+
+ editor.$(image).attr({
+ src: settings.images_reuse_filename ? resultUri + cacheInvalidator() : resultUri,
+ 'data-mce-src': editor.convertURL(resultUri, 'src')
+ });
+ };
+
+ var uploadImages = function (callback) {
+ if (!uploader) {
+ uploader = new Uploader(uploadStatus, {
+ url: settings.images_upload_url,
+ basePath: settings.images_upload_base_path,
+ credentials: settings.images_upload_credentials,
+ handler: settings.images_upload_handler
+ });
+ }
+
+ return scanForImages().then(aliveGuard(function (imageInfos) {
+ var blobInfos;
+
+ blobInfos = Arr.map(imageInfos, function (imageInfo) {
+ return imageInfo.blobInfo;
+ });
+
+ return uploader.upload(blobInfos, openNotification).then(aliveGuard(function (result) {
+ var filteredResult = Arr.map(result, function (uploadInfo, index) {
+ var image = imageInfos[index].image;
+
+ if (uploadInfo.status && editor.settings.images_replace_blob_uris !== false) {
+ replaceImageUri(image, uploadInfo.url);
+ } else if (uploadInfo.error) {
+ ErrorReporter.uploadError(editor, uploadInfo.error);
+ }
+
+ return {
+ element: image,
+ status: uploadInfo.status
+ };
+ });
+
+ if (callback) {
+ callback(filteredResult);
+ }
+
+ return filteredResult;
+ }));
+ }));
+ };
+
+ var uploadImagesAuto = function (callback) {
+ if (settings.automatic_uploads !== false) {
+ return uploadImages(callback);
+ }
+ };
+
+ var isValidDataUriImage = function (imgElm) {
+ return settings.images_dataimg_filter ? settings.images_dataimg_filter(imgElm) : true;
+ };
+
+ var scanForImages = function () {
+ if (!imageScanner) {
+ imageScanner = new ImageScanner(uploadStatus, blobCache);
+ }
+
+ return imageScanner.findAll(editor.getBody(), isValidDataUriImage).then(aliveGuard(function (result) {
+ result = Arr.filter(result, function (resultItem) {
+ // ImageScanner internally converts images that it finds, but it may fail to do so if image source is inaccessible.
+ // In such case resultItem will contain appropriate text error message, instead of image data.
+ if (typeof resultItem === 'string') {
+ ErrorReporter.displayError(editor, resultItem);
+ return false;
+ }
+ return true;
+ });
+
+ Arr.each(result, function (resultItem) {
+ replaceUrlInUndoStack(resultItem.image.src, resultItem.blobInfo.blobUri());
+ resultItem.image.src = resultItem.blobInfo.blobUri();
+ resultItem.image.removeAttribute('data-mce-src');
+ });
+
+ return result;
+ }));
+ };
+
+ var destroy = function () {
+ blobCache.destroy();
+ uploadStatus.destroy();
+ imageScanner = uploader = null;
+ };
+
+ var replaceBlobUris = function (content) {
+ return content.replace(/src="(blob:[^"]+)"/g, function (match, blobUri) {
+ var resultUri = uploadStatus.getResultUri(blobUri);
+
+ if (resultUri) {
+ return 'src="' + resultUri + '"';
+ }
+
+ var blobInfo = blobCache.getByUri(blobUri);
+
+ if (!blobInfo) {
+ blobInfo = Arr.reduce(editor.editorManager.get(), function (result, editor) {
+ return result || editor.editorUpload && editor.editorUpload.blobCache.getByUri(blobUri);
+ }, null);
+ }
+
+ if (blobInfo) {
+ return 'src="data:' + blobInfo.blob().type + ';base64,' + blobInfo.base64() + '"';
+ }
+
+ return match;
+ });
+ };
+
+ editor.on('setContent', function () {
+ if (editor.settings.automatic_uploads !== false) {
+ uploadImagesAuto();
+ } else {
+ scanForImages();
+ }
+ });
+
+ editor.on('RawSaveContent', function (e) {
+ e.content = replaceBlobUris(e.content);
+ });
+
+ editor.on('getContent', function (e) {
+ if (e.source_view || e.format == 'raw') {
+ return;
+ }
+
+ e.content = replaceBlobUris(e.content);
+ });
+
+ editor.on('PostRender', function () {
+ editor.parser.addNodeFilter('img', function (images) {
+ Arr.each(images, function (img) {
+ var src = img.attr('src');
+
+ if (blobCache.getByUri(src)) {
+ return;
+ }
+
+ var resultUri = uploadStatus.getResultUri(src);
+ if (resultUri) {
+ img.attr('src', resultUri);
+ }
+ });
+ });
+ });
+
+ return {
+ blobCache: blobCache,
+ uploadImages: uploadImages,
+ uploadImagesAuto: uploadImagesAuto,
+ scanForImages: scanForImages,
+ destroy: destroy
+ };
+ };
+ }
+);
+/**
+ * ForceBlocks.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Makes sure that everything gets wrapped in paragraphs.
+ *
+ * @private
+ * @class tinymce.ForceBlocks
+ */
+define(
+ 'tinymce.core.ForceBlocks',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Fun',
+ 'ephox.sugar.api.node.Element',
+ 'tinymce.core.dom.Bookmarks',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.Parents',
+ 'tinymce.core.focus.EditorFocus'
+ ],
+ function (Arr, Fun, Element, Bookmarks, NodeType, Parents, EditorFocus) {
+ var isBlockElement = function (blockElements, node) {
+ return blockElements.hasOwnProperty(node.nodeName);
+ };
+
+ var isValidTarget = function (blockElements, node) {
+ if (NodeType.isText(node)) {
+ return true;
+ } else if (NodeType.isElement(node)) {
+ return !isBlockElement(blockElements, node) && !Bookmarks.isBookmarkNode(node);
+ } else {
+ return false;
+ }
+ };
+
+ var hasBlockParent = function (blockElements, root, node) {
+ return Arr.exists(Parents.parents(Element.fromDom(node), Element.fromDom(root)), function (elm) {
+ return isBlockElement(blockElements, elm.dom());
+ });
+ };
+
+ var addRootBlocks = function (editor) {
+ var settings = editor.settings, dom = editor.dom, selection = editor.selection;
+ var schema = editor.schema, blockElements = schema.getBlockElements();
+ var node = selection.getStart(), rootNode = editor.getBody(), rng;
+ var startContainer, startOffset, endContainer, endOffset, rootBlockNode;
+ var tempNode, wrapped, restoreSelection;
+ var rootNodeName, forcedRootBlock;
+
+ forcedRootBlock = settings.forced_root_block;
+
+ if (!node || !NodeType.isElement(node) || !forcedRootBlock) {
+ return;
+ }
+
+ rootNodeName = rootNode.nodeName.toLowerCase();
+ if (!schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase()) || hasBlockParent(blockElements, rootNode, node)) {
+ return;
+ }
+
+ // Get current selection
+ rng = selection.getRng();
+ startContainer = rng.startContainer;
+ startOffset = rng.startOffset;
+ endContainer = rng.endContainer;
+ endOffset = rng.endOffset;
+ restoreSelection = EditorFocus.hasFocus(editor);
+
+ // Wrap non block elements and text nodes
+ node = rootNode.firstChild;
+ while (node) {
+ if (isValidTarget(blockElements, node)) {
+ // Remove empty text nodes
+ if (NodeType.isText(node) && node.nodeValue.length === 0) {
+ tempNode = node;
+ node = node.nextSibling;
+ dom.remove(tempNode);
+ continue;
+ }
+
+ if (!rootBlockNode) {
+ rootBlockNode = dom.create(forcedRootBlock, editor.settings.forced_root_block_attrs);
+ node.parentNode.insertBefore(rootBlockNode, node);
+ wrapped = true;
+ }
+
+ tempNode = node;
+ node = node.nextSibling;
+ rootBlockNode.appendChild(tempNode);
+ } else {
+ rootBlockNode = null;
+ node = node.nextSibling;
+ }
+ }
+
+ if (wrapped && restoreSelection) {
+ rng.setStart(startContainer, startOffset);
+ rng.setEnd(endContainer, endOffset);
+ selection.setRng(rng);
+ editor.nodeChanged();
+ }
+ };
+
+ var setup = function (editor) {
+ if (editor.settings.forced_root_block) {
+ editor.on('NodeChange', Fun.curry(addRootBlocks, editor));
+ }
+ };
+
+ return {
+ setup: setup
+ };
+ }
+);
+/**
+ * NodeChange.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class handles the nodechange event dispatching both manual and through selection change events.
+ *
+ * @class tinymce.NodeChange
+ * @private
+ */
+define(
+ 'tinymce.core.NodeChange',
+ [
+ 'tinymce.core.Env',
+ 'tinymce.core.selection.RangeCompare',
+ 'tinymce.core.util.Delay'
+ ],
+ function (Env, RangeCompare, Delay) {
+ return function (editor) {
+ var lastRng, lastPath = [];
+
+ /**
+ * Returns true/false if the current element path has been changed or not.
+ *
+ * @private
+ * @return {Boolean} True if the element path is the same false if it's not.
+ */
+ var isSameElementPath = function (startElm) {
+ var i, currentPath;
+
+ currentPath = editor.$(startElm).parentsUntil(editor.getBody()).add(startElm);
+ if (currentPath.length === lastPath.length) {
+ for (i = currentPath.length; i >= 0; i--) {
+ if (currentPath[i] !== lastPath[i]) {
+ break;
+ }
+ }
+
+ if (i === -1) {
+ lastPath = currentPath;
+ return true;
+ }
+ }
+
+ lastPath = currentPath;
+
+ return false;
+ };
+
+ // Gecko doesn't support the "selectionchange" event
+ if (!('onselectionchange' in editor.getDoc())) {
+ editor.on('NodeChange Click MouseUp KeyUp Focus', function (e) {
+ var nativeRng, fakeRng;
+
+ // Since DOM Ranges mutate on modification
+ // of the DOM we need to clone it's contents
+ nativeRng = editor.selection.getRng();
+ fakeRng = {
+ startContainer: nativeRng.startContainer,
+ startOffset: nativeRng.startOffset,
+ endContainer: nativeRng.endContainer,
+ endOffset: nativeRng.endOffset
+ };
+
+ // Always treat nodechange as a selectionchange since applying
+ // formatting to the current range wouldn't update the range but it's parent
+ if (e.type == 'nodechange' || !RangeCompare.isEq(fakeRng, lastRng)) {
+ editor.fire('SelectionChange');
+ }
+
+ lastRng = fakeRng;
+ });
+ }
+
+ // IE has a bug where it fires a selectionchange on right click that has a range at the start of the body
+ // When the contextmenu event fires the selection is located at the right location
+ editor.on('contextmenu', function () {
+ editor.fire('SelectionChange');
+ });
+
+ // Selection change is delayed ~200ms on IE when you click inside the current range
+ editor.on('SelectionChange', function () {
+ var startElm = editor.selection.getStart(true);
+
+ // When focusout from after cef element to other input element the startelm can be undefined.
+ // IE 8 will fire a selectionchange event with an incorrect selection
+ // when focusing out of table cells. Click inside cell -> toolbar = Invalid SelectionChange event
+ if (!startElm || (!Env.range && editor.selection.isCollapsed())) {
+ return;
+ }
+
+ if (!isSameElementPath(startElm) && editor.dom.isChildOf(startElm, editor.getBody())) {
+ editor.nodeChanged({ selectionChange: true });
+ }
+ });
+
+ // Fire an extra nodeChange on mouseup for compatibility reasons
+ editor.on('MouseUp', function (e) {
+ if (!e.isDefaultPrevented()) {
+ // Delay nodeChanged call for WebKit edge case issue where the range
+ // isn't updated until after you click outside a selected image
+ if (editor.selection.getNode().nodeName == 'IMG') {
+ Delay.setEditorTimeout(editor, function () {
+ editor.nodeChanged();
+ });
+ } else {
+ editor.nodeChanged();
+ }
+ }
+ });
+
+ /**
+ * Dispatches out a onNodeChange event to all observers. This method should be called when you
+ * need to update the UI states or element path etc.
+ *
+ * @method nodeChanged
+ * @param {Object} args Optional args to pass to NodeChange event handlers.
+ */
+ this.nodeChanged = function (args) {
+ var selection = editor.selection, node, parents, root;
+
+ // Fix for bug #1896577 it seems that this can not be fired while the editor is loading
+ if (editor.initialized && selection && !editor.settings.disable_nodechange && !editor.readonly) {
+ // Get start node
+ root = editor.getBody();
+ node = selection.getStart(true) || root;
+
+ // Make sure the node is within the editor root or is the editor root
+ if (node.ownerDocument != editor.getDoc() || !editor.dom.isChildOf(node, root)) {
+ node = root;
+ }
+
+ // Get parents and add them to object
+ parents = [];
+ editor.dom.getParent(node, function (node) {
+ if (node === root) {
+ return true;
+ }
+
+ parents.push(node);
+ });
+
+ args = args || {};
+ args.element = node;
+ args.parents = parents;
+
+ editor.fire('NodeChange', args);
+ }
+ };
+ };
+ }
+);
+
+/**
+ * MousePosition.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module calculates an absolute coordinate inside the editor body for both local and global mouse events.
+ *
+ * @private
+ * @class tinymce.dom.MousePosition
+ */
+define(
+ 'tinymce.core.dom.MousePosition',
+ [
+ ],
+ function () {
+ var getAbsolutePosition = function (elm) {
+ var doc, docElem, win, clientRect;
+
+ clientRect = elm.getBoundingClientRect();
+ doc = elm.ownerDocument;
+ docElem = doc.documentElement;
+ win = doc.defaultView;
+
+ return {
+ top: clientRect.top + win.pageYOffset - docElem.clientTop,
+ left: clientRect.left + win.pageXOffset - docElem.clientLeft
+ };
+ };
+
+ var getBodyPosition = function (editor) {
+ return editor.inline ? getAbsolutePosition(editor.getBody()) : { left: 0, top: 0 };
+ };
+
+ var getScrollPosition = function (editor) {
+ var body = editor.getBody();
+ return editor.inline ? { left: body.scrollLeft, top: body.scrollTop } : { left: 0, top: 0 };
+ };
+
+ var getBodyScroll = function (editor) {
+ var body = editor.getBody(), docElm = editor.getDoc().documentElement;
+ var inlineScroll = { left: body.scrollLeft, top: body.scrollTop };
+ var iframeScroll = { left: body.scrollLeft || docElm.scrollLeft, top: body.scrollTop || docElm.scrollTop };
+
+ return editor.inline ? inlineScroll : iframeScroll;
+ };
+
+ var getMousePosition = function (editor, event) {
+ if (event.target.ownerDocument !== editor.getDoc()) {
+ var iframePosition = getAbsolutePosition(editor.getContentAreaContainer());
+ var scrollPosition = getBodyScroll(editor);
+
+ return {
+ left: event.pageX - iframePosition.left + scrollPosition.left,
+ top: event.pageY - iframePosition.top + scrollPosition.top
+ };
+ }
+
+ return {
+ left: event.pageX,
+ top: event.pageY
+ };
+ };
+
+ var calculatePosition = function (bodyPosition, scrollPosition, mousePosition) {
+ return {
+ pageX: (mousePosition.left - bodyPosition.left) + scrollPosition.left,
+ pageY: (mousePosition.top - bodyPosition.top) + scrollPosition.top
+ };
+ };
+
+ var calc = function (editor, event) {
+ return calculatePosition(getBodyPosition(editor), getScrollPosition(editor), getMousePosition(editor, event));
+ };
+
+ return {
+ calc: calc
+ };
+ }
+);
+
+/**
+ * DragDropOverrides.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module contains logic overriding the drag/drop logic of the editor.
+ *
+ * @private
+ * @class tinymce.DragDropOverrides
+ */
+define(
+ 'tinymce.core.DragDropOverrides',
+ [
+ 'global!document',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.dom.MousePosition',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.util.Arr',
+ 'tinymce.core.util.Delay',
+ 'tinymce.core.util.Fun'
+ ],
+ function (document, DOMUtils, MousePosition, NodeType, Arr, Delay, Fun) {
+ var isContentEditableFalse = NodeType.isContentEditableFalse,
+ isContentEditableTrue = NodeType.isContentEditableTrue;
+
+ var isDraggable = function (rootElm, elm) {
+ return isContentEditableFalse(elm) && elm !== rootElm;
+ };
+
+ var isValidDropTarget = function (editor, targetElement, dragElement) {
+ if (targetElement === dragElement || editor.dom.isChildOf(targetElement, dragElement)) {
+ return false;
+ }
+
+ if (isContentEditableFalse(targetElement)) {
+ return false;
+ }
+
+ return true;
+ };
+
+ var cloneElement = function (elm) {
+ var cloneElm = elm.cloneNode(true);
+ cloneElm.removeAttribute('data-mce-selected');
+ return cloneElm;
+ };
+
+ var createGhost = function (editor, elm, width, height) {
+ var clonedElm = elm.cloneNode(true);
+
+ editor.dom.setStyles(clonedElm, { width: width, height: height });
+ editor.dom.setAttrib(clonedElm, 'data-mce-selected', null);
+
+ var ghostElm = editor.dom.create('div', {
+ 'class': 'mce-drag-container',
+ 'data-mce-bogus': 'all',
+ unselectable: 'on',
+ contenteditable: 'false'
+ });
+
+ editor.dom.setStyles(ghostElm, {
+ position: 'absolute',
+ opacity: 0.5,
+ overflow: 'hidden',
+ border: 0,
+ padding: 0,
+ margin: 0,
+ width: width,
+ height: height
+ });
+
+ editor.dom.setStyles(clonedElm, {
+ margin: 0,
+ boxSizing: 'border-box'
+ });
+
+ ghostElm.appendChild(clonedElm);
+
+ return ghostElm;
+ };
+
+ var appendGhostToBody = function (ghostElm, bodyElm) {
+ if (ghostElm.parentNode !== bodyElm) {
+ bodyElm.appendChild(ghostElm);
+ }
+ };
+
+ var moveGhost = function (ghostElm, position, width, height, maxX, maxY) {
+ var overflowX = 0, overflowY = 0;
+
+ ghostElm.style.left = position.pageX + 'px';
+ ghostElm.style.top = position.pageY + 'px';
+
+ if (position.pageX + width > maxX) {
+ overflowX = (position.pageX + width) - maxX;
+ }
+
+ if (position.pageY + height > maxY) {
+ overflowY = (position.pageY + height) - maxY;
+ }
+
+ ghostElm.style.width = (width - overflowX) + 'px';
+ ghostElm.style.height = (height - overflowY) + 'px';
+ };
+
+ var removeElement = function (elm) {
+ if (elm && elm.parentNode) {
+ elm.parentNode.removeChild(elm);
+ }
+ };
+
+ var isLeftMouseButtonPressed = function (e) {
+ return e.button === 0;
+ };
+
+ var hasDraggableElement = function (state) {
+ return state.element;
+ };
+
+ var applyRelPos = function (state, position) {
+ return {
+ pageX: position.pageX - state.relX,
+ pageY: position.pageY + 5
+ };
+ };
+
+ var start = function (state, editor) {
+ return function (e) {
+ if (isLeftMouseButtonPressed(e)) {
+ var ceElm = Arr.find(editor.dom.getParents(e.target), Fun.or(isContentEditableFalse, isContentEditableTrue));
+
+ if (isDraggable(editor.getBody(), ceElm)) {
+ var elmPos = editor.dom.getPos(ceElm);
+ var bodyElm = editor.getBody();
+ var docElm = editor.getDoc().documentElement;
+
+ state.element = ceElm;
+ state.screenX = e.screenX;
+ state.screenY = e.screenY;
+ state.maxX = (editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2;
+ state.maxY = (editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2;
+ state.relX = e.pageX - elmPos.x;
+ state.relY = e.pageY - elmPos.y;
+ state.width = ceElm.offsetWidth;
+ state.height = ceElm.offsetHeight;
+ state.ghost = createGhost(editor, ceElm, state.width, state.height);
+ }
+ }
+ };
+ };
+
+ var move = function (state, editor) {
+ // Reduces laggy drag behavior on Gecko
+ var throttledPlaceCaretAt = Delay.throttle(function (clientX, clientY) {
+ editor._selectionOverrides.hideFakeCaret();
+ editor.selection.placeCaretAt(clientX, clientY);
+ }, 0);
+
+ return function (e) {
+ var movement = Math.max(Math.abs(e.screenX - state.screenX), Math.abs(e.screenY - state.screenY));
+
+ if (hasDraggableElement(state) && !state.dragging && movement > 10) {
+ var args = editor.fire('dragstart', { target: state.element });
+ if (args.isDefaultPrevented()) {
+ return;
+ }
+
+ state.dragging = true;
+ editor.focus();
+ }
+
+ if (state.dragging) {
+ var targetPos = applyRelPos(state, MousePosition.calc(editor, e));
+
+ appendGhostToBody(state.ghost, editor.getBody());
+ moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY);
+
+ throttledPlaceCaretAt(e.clientX, e.clientY);
+ }
+ };
+ };
+
+ // Returns the raw element instead of the fake cE=false element
+ var getRawTarget = function (selection) {
+ var rng = selection.getSel().getRangeAt(0);
+ var startContainer = rng.startContainer;
+ return startContainer.nodeType === 3 ? startContainer.parentNode : startContainer;
+ };
+
+ var drop = function (state, editor) {
+ return function (e) {
+ if (state.dragging) {
+ if (isValidDropTarget(editor, getRawTarget(editor.selection), state.element)) {
+ var targetClone = cloneElement(state.element);
+
+ var args = editor.fire('drop', {
+ targetClone: targetClone,
+ clientX: e.clientX,
+ clientY: e.clientY
+ });
+
+ if (!args.isDefaultPrevented()) {
+ targetClone = args.targetClone;
+
+ editor.undoManager.transact(function () {
+ removeElement(state.element);
+ editor.insertContent(editor.dom.getOuterHTML(targetClone));
+ editor._selectionOverrides.hideFakeCaret();
+ });
+ }
+ }
+ }
+
+ removeDragState(state);
+ };
+ };
+
+ var stop = function (state, editor) {
+ return function () {
+ removeDragState(state);
+ if (state.dragging) {
+ editor.fire('dragend');
+ }
+ };
+ };
+
+ var removeDragState = function (state) {
+ state.dragging = false;
+ state.element = null;
+ removeElement(state.ghost);
+ };
+
+ var bindFakeDragEvents = function (editor) {
+ var state = {}, pageDom, dragStartHandler, dragHandler, dropHandler, dragEndHandler, rootDocument;
+
+ pageDom = DOMUtils.DOM;
+ rootDocument = document;
+ dragStartHandler = start(state, editor);
+ dragHandler = move(state, editor);
+ dropHandler = drop(state, editor);
+ dragEndHandler = stop(state, editor);
+
+ editor.on('mousedown', dragStartHandler);
+ editor.on('mousemove', dragHandler);
+ editor.on('mouseup', dropHandler);
+
+ pageDom.bind(rootDocument, 'mousemove', dragHandler);
+ pageDom.bind(rootDocument, 'mouseup', dragEndHandler);
+
+ editor.on('remove', function () {
+ pageDom.unbind(rootDocument, 'mousemove', dragHandler);
+ pageDom.unbind(rootDocument, 'mouseup', dragEndHandler);
+ });
+ };
+
+ var blockIeDrop = function (editor) {
+ editor.on('drop', function (e) {
+ // FF doesn't pass out clientX/clientY for drop since this is for IE we just use null instead
+ var realTarget = typeof e.clientX !== 'undefined' ? editor.getDoc().elementFromPoint(e.clientX, e.clientY) : null;
+
+ if (isContentEditableFalse(realTarget) || isContentEditableFalse(editor.dom.getContentEditableParent(realTarget))) {
+ e.preventDefault();
+ }
+ });
+ };
+
+ var init = function (editor) {
+ bindFakeDragEvents(editor);
+ blockIeDrop(editor);
+ };
+
+ return {
+ init: init
+ };
+ }
+);
+
+/**
+ * FakeCaret.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module contains logic for rendering a fake visual caret.
+ *
+ * @private
+ * @class tinymce.caret.FakeCaret
+ */
+define(
+ 'tinymce.core.caret.FakeCaret',
+ [
+ 'global!clearInterval',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.caret.CaretContainerRemove',
+ 'tinymce.core.dom.DomQuery',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.geom.ClientRect',
+ 'tinymce.core.util.Delay'
+ ],
+ function (clearInterval, CaretContainer, CaretContainerRemove, DomQuery, NodeType, ClientRect, Delay) {
+ var isContentEditableFalse = NodeType.isContentEditableFalse;
+
+ var isTableCell = function (node) {
+ return node && /^(TD|TH)$/i.test(node.nodeName);
+ };
+
+ return function (rootNode, isBlock) {
+ var cursorInterval, $lastVisualCaret = null, caretContainerNode;
+
+ var getAbsoluteClientRect = function (node, before) {
+ var clientRect = ClientRect.collapse(node.getBoundingClientRect(), before),
+ docElm, scrollX, scrollY, margin, rootRect;
+
+ if (rootNode.tagName == 'BODY') {
+ docElm = rootNode.ownerDocument.documentElement;
+ scrollX = rootNode.scrollLeft || docElm.scrollLeft;
+ scrollY = rootNode.scrollTop || docElm.scrollTop;
+ } else {
+ rootRect = rootNode.getBoundingClientRect();
+ scrollX = rootNode.scrollLeft - rootRect.left;
+ scrollY = rootNode.scrollTop - rootRect.top;
+ }
+
+ clientRect.left += scrollX;
+ clientRect.right += scrollX;
+ clientRect.top += scrollY;
+ clientRect.bottom += scrollY;
+ clientRect.width = 1;
+
+ margin = node.offsetWidth - node.clientWidth;
+
+ if (margin > 0) {
+ if (before) {
+ margin *= -1;
+ }
+
+ clientRect.left += margin;
+ clientRect.right += margin;
+ }
+
+ return clientRect;
+ };
+
+ var trimInlineCaretContainers = function () {
+ var contentEditableFalseNodes, node, sibling, i, data;
+
+ contentEditableFalseNodes = DomQuery('*[contentEditable=false]', rootNode);
+ for (i = 0; i < contentEditableFalseNodes.length; i++) {
+ node = contentEditableFalseNodes[i];
+
+ sibling = node.previousSibling;
+ if (CaretContainer.endsWithCaretContainer(sibling)) {
+ data = sibling.data;
+
+ if (data.length == 1) {
+ sibling.parentNode.removeChild(sibling);
+ } else {
+ sibling.deleteData(data.length - 1, 1);
+ }
+ }
+
+ sibling = node.nextSibling;
+ if (CaretContainer.startsWithCaretContainer(sibling)) {
+ data = sibling.data;
+
+ if (data.length == 1) {
+ sibling.parentNode.removeChild(sibling);
+ } else {
+ sibling.deleteData(0, 1);
+ }
+ }
+ }
+
+ return null;
+ };
+
+ var show = function (before, node) {
+ var clientRect, rng;
+
+ hide();
+
+ if (isTableCell(node)) {
+ return null;
+ }
+
+ if (isBlock(node)) {
+ caretContainerNode = CaretContainer.insertBlock('p', node, before);
+ clientRect = getAbsoluteClientRect(node, before);
+ DomQuery(caretContainerNode).css('top', clientRect.top);
+
+ $lastVisualCaret = DomQuery('').css(clientRect).appendTo(rootNode);
+
+ if (before) {
+ $lastVisualCaret.addClass('mce-visual-caret-before');
+ }
+
+ startBlink();
+
+ rng = node.ownerDocument.createRange();
+ rng.setStart(caretContainerNode, 0);
+ rng.setEnd(caretContainerNode, 0);
+ } else {
+ caretContainerNode = CaretContainer.insertInline(node, before);
+ rng = node.ownerDocument.createRange();
+
+ if (isContentEditableFalse(caretContainerNode.nextSibling)) {
+ rng.setStart(caretContainerNode, 0);
+ rng.setEnd(caretContainerNode, 0);
+ } else {
+ rng.setStart(caretContainerNode, 1);
+ rng.setEnd(caretContainerNode, 1);
+ }
+
+ return rng;
+ }
+
+ return rng;
+ };
+
+ var hide = function () {
+ trimInlineCaretContainers();
+
+ if (caretContainerNode) {
+ CaretContainerRemove.remove(caretContainerNode);
+ caretContainerNode = null;
+ }
+
+ if ($lastVisualCaret) {
+ $lastVisualCaret.remove();
+ $lastVisualCaret = null;
+ }
+
+ clearInterval(cursorInterval);
+ };
+
+ var hasFocus = function () {
+ return rootNode.ownerDocument.activeElement === rootNode;
+ };
+
+ var startBlink = function () {
+ cursorInterval = Delay.setInterval(function () {
+ if (hasFocus()) {
+ DomQuery('div.mce-visual-caret', rootNode).toggleClass('mce-visual-caret-hidden');
+ } else {
+ DomQuery('div.mce-visual-caret', rootNode).addClass('mce-visual-caret-hidden');
+ }
+ }, 500);
+ };
+
+ var destroy = function () {
+ Delay.clearInterval(cursorInterval);
+ };
+
+ var getCss = function () {
+ return (
+ '.mce-visual-caret {' +
+ 'position: absolute;' +
+ 'background-color: black;' +
+ 'background-color: currentcolor;' +
+ '}' +
+ '.mce-visual-caret-hidden {' +
+ 'display: none;' +
+ '}' +
+ '*[data-mce-caret] {' +
+ 'position: absolute;' +
+ 'left: -1000px;' +
+ 'right: auto;' +
+ 'top: 0;' +
+ 'margin: 0;' +
+ 'padding: 0;' +
+ '}'
+ );
+ };
+
+ return {
+ show: show,
+ hide: hide,
+ getCss: getCss,
+ destroy: destroy
+ };
+ };
+ }
+);
+/**
+ * Dimensions.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module measures nodes and returns client rects. The client rects has an
+ * extra node property.
+ *
+ * @private
+ * @class tinymce.dom.Dimensions
+ */
+define(
+ 'tinymce.core.dom.Dimensions',
+ [
+ "tinymce.core.util.Arr",
+ "tinymce.core.dom.NodeType",
+ "tinymce.core.geom.ClientRect"
+ ],
+ function (Arr, NodeType, ClientRect) {
+ var getClientRects = function (node) {
+ var toArrayWithNode = function (clientRects) {
+ return Arr.map(clientRects, function (clientRect) {
+ clientRect = ClientRect.clone(clientRect);
+ clientRect.node = node;
+
+ return clientRect;
+ });
+ };
+
+ if (Arr.isArray(node)) {
+ return Arr.reduce(node, function (result, node) {
+ return result.concat(getClientRects(node));
+ }, []);
+ }
+
+ if (NodeType.isElement(node)) {
+ return toArrayWithNode(node.getClientRects());
+ }
+
+ if (NodeType.isText(node)) {
+ var rng = node.ownerDocument.createRange();
+
+ rng.setStart(node, 0);
+ rng.setEnd(node, node.data.length);
+
+ return toArrayWithNode(rng.getClientRects());
+ }
+ };
+
+ return {
+ /**
+ * Returns the client rects for a specific node.
+ *
+ * @method getClientRects
+ * @param {Array/DOMNode} node Node or array of nodes to get client rects on.
+ * @param {Array} Array of client rects with a extra node property.
+ */
+ getClientRects: getClientRects
+ };
+ }
+);
+/**
+ * LineUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Utility functions for working with lines.
+ *
+ * @private
+ * @class tinymce.caret.LineUtils
+ */
+define(
+ 'tinymce.core.caret.LineUtils',
+ [
+ "tinymce.core.util.Fun",
+ "tinymce.core.util.Arr",
+ "tinymce.core.dom.NodeType",
+ "tinymce.core.dom.Dimensions",
+ "tinymce.core.geom.ClientRect",
+ "tinymce.core.caret.CaretUtils",
+ "tinymce.core.caret.CaretCandidate"
+ ],
+ function (Fun, Arr, NodeType, Dimensions, ClientRect, CaretUtils, CaretCandidate) {
+ var isContentEditableFalse = NodeType.isContentEditableFalse,
+ findNode = CaretUtils.findNode,
+ curry = Fun.curry;
+
+ var distanceToRectLeft = function (clientRect, clientX) {
+ return Math.abs(clientRect.left - clientX);
+ };
+
+ var distanceToRectRight = function (clientRect, clientX) {
+ return Math.abs(clientRect.right - clientX);
+ };
+
+ var findClosestClientRect = function (clientRects, clientX) {
+ var isInside = function (clientX, clientRect) {
+ return clientX >= clientRect.left && clientX <= clientRect.right;
+ };
+
+ return Arr.reduce(clientRects, function (oldClientRect, clientRect) {
+ var oldDistance, newDistance;
+
+ oldDistance = Math.min(distanceToRectLeft(oldClientRect, clientX), distanceToRectRight(oldClientRect, clientX));
+ newDistance = Math.min(distanceToRectLeft(clientRect, clientX), distanceToRectRight(clientRect, clientX));
+
+ if (isInside(clientX, clientRect)) {
+ return clientRect;
+ }
+
+ if (isInside(clientX, oldClientRect)) {
+ return oldClientRect;
+ }
+
+ // cE=false has higher priority
+ if (newDistance == oldDistance && isContentEditableFalse(clientRect.node)) {
+ return clientRect;
+ }
+
+ if (newDistance < oldDistance) {
+ return clientRect;
+ }
+
+ return oldClientRect;
+ });
+ };
+
+ var walkUntil = function (direction, rootNode, predicateFn, node) {
+ while ((node = findNode(node, direction, CaretCandidate.isEditableCaretCandidate, rootNode))) {
+ if (predicateFn(node)) {
+ return;
+ }
+ }
+ };
+
+ var findLineNodeRects = function (rootNode, targetNodeRect) {
+ var clientRects = [];
+
+ var collect = function (checkPosFn, node) {
+ var lineRects;
+
+ lineRects = Arr.filter(Dimensions.getClientRects(node), function (clientRect) {
+ return !checkPosFn(clientRect, targetNodeRect);
+ });
+
+ clientRects = clientRects.concat(lineRects);
+
+ return lineRects.length === 0;
+ };
+
+ clientRects.push(targetNodeRect);
+ walkUntil(-1, rootNode, curry(collect, ClientRect.isAbove), targetNodeRect.node);
+ walkUntil(1, rootNode, curry(collect, ClientRect.isBelow), targetNodeRect.node);
+
+ return clientRects;
+ };
+
+ var getContentEditableFalseChildren = function (rootNode) {
+ return Arr.filter(Arr.toArray(rootNode.getElementsByTagName('*')), isContentEditableFalse);
+ };
+
+ var caretInfo = function (clientRect, clientX) {
+ return {
+ node: clientRect.node,
+ before: distanceToRectLeft(clientRect, clientX) < distanceToRectRight(clientRect, clientX)
+ };
+ };
+
+ var closestCaret = function (rootNode, clientX, clientY) {
+ var contentEditableFalseNodeRects, closestNodeRect;
+
+ contentEditableFalseNodeRects = Dimensions.getClientRects(getContentEditableFalseChildren(rootNode));
+ contentEditableFalseNodeRects = Arr.filter(contentEditableFalseNodeRects, function (clientRect) {
+ return clientY >= clientRect.top && clientY <= clientRect.bottom;
+ });
+
+ closestNodeRect = findClosestClientRect(contentEditableFalseNodeRects, clientX);
+ if (closestNodeRect) {
+ closestNodeRect = findClosestClientRect(findLineNodeRects(rootNode, closestNodeRect), clientX);
+ if (closestNodeRect && isContentEditableFalse(closestNodeRect.node)) {
+ return caretInfo(closestNodeRect, clientX);
+ }
+ }
+
+ return null;
+ };
+
+ return {
+ findClosestClientRect: findClosestClientRect,
+ findLineNodeRects: findLineNodeRects,
+ closestCaret: closestCaret
+ };
+ }
+);
+/**
+ * RangePoint.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.dom.RangePoint',
+ [
+ 'ephox.katamari.api.Arr',
+ 'tinymce.core.geom.ClientRect'
+ ],
+ function (Arr, ClientRect) {
+ var isXYWithinRange = function (clientX, clientY, range) {
+ if (range.collapsed) {
+ return false;
+ }
+
+ return Arr.foldl(range.getClientRects(), function (state, rect) {
+ return state || ClientRect.containsXY(rect, clientX, clientY);
+ }, false);
+ };
+
+ return {
+ isXYWithinRange: isXYWithinRange
+ };
+ }
+);
+define(
+ 'ephox.katamari.api.Throttler',
+
+ [
+ 'global!clearTimeout',
+ 'global!setTimeout'
+ ],
+
+ function (clearTimeout, setTimeout) {
+ // Run a function fn afer rate ms. If another invocation occurs
+ // during the time it is waiting, update the arguments f will run
+ // with (but keep the current schedule)
+ var adaptable = function (fn, rate) {
+ var timer = null;
+ var args = null;
+ var cancel = function () {
+ if (timer !== null) {
+ clearTimeout(timer);
+ timer = null;
+ args = null;
+ }
+ };
+ var throttle = function () {
+ args = arguments;
+ if (timer === null) {
+ timer = setTimeout(function () {
+ fn.apply(null, args);
+ timer = null;
+ args = null;
+ }, rate);
+ }
+ };
+
+ return {
+ cancel: cancel,
+ throttle: throttle
+ };
+ };
+
+ // Run a function fn after rate ms. If another invocation occurs
+ // during the time it is waiting, ignore it completely.
+ var first = function (fn, rate) {
+ var timer = null;
+ var cancel = function () {
+ if (timer !== null) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ };
+ var throttle = function () {
+ var args = arguments;
+ if (timer === null) {
+ timer = setTimeout(function () {
+ fn.apply(null, args);
+ timer = null;
+ args = null;
+ }, rate);
+ }
+ };
+
+ return {
+ cancel: cancel,
+ throttle: throttle
+ };
+ };
+
+ // Run a function fn after rate ms. If another invocation occurs
+ // during the time it is waiting, reschedule the function again
+ // with the new arguments.
+ var last = function (fn, rate) {
+ var timer = null;
+ var cancel = function () {
+ if (timer !== null) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ };
+ var throttle = function () {
+ var args = arguments;
+ if (timer !== null) clearTimeout(timer);
+ timer = setTimeout(function () {
+ fn.apply(null, args);
+ timer = null;
+ args = null;
+ }, rate);
+ };
+
+ return {
+ cancel: cancel,
+ throttle: throttle
+ };
+ };
+
+ return {
+ adaptable: adaptable,
+ first: first,
+ last: last
+ };
+ }
+);
+/**
+ * CefUtils.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.CefUtils',
+ [
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.caret.CaretUtils',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.util.Fun'
+ ],
+ function (CaretPosition, CaretUtils, NodeType, Fun) {
+ var isContentEditableTrue = NodeType.isContentEditableTrue;
+ var isContentEditableFalse = NodeType.isContentEditableFalse;
+
+ var showCaret = function (direction, editor, node, before) {
+ // TODO: Figure out a better way to handle this dependency
+ return editor._selectionOverrides.showCaret(direction, node, before);
+ };
+
+ var getNodeRange = function (node) {
+ var rng = node.ownerDocument.createRange();
+ rng.selectNode(node);
+ return rng;
+ };
+
+ var selectNode = function (editor, node) {
+ var e;
+
+ e = editor.fire('BeforeObjectSelected', { target: node });
+ if (e.isDefaultPrevented()) {
+ return null;
+ }
+
+ return getNodeRange(node);
+ };
+
+ var renderCaretAtRange = function (editor, range) {
+ var caretPosition, ceRoot;
+
+ range = CaretUtils.normalizeRange(1, editor.getBody(), range);
+ caretPosition = CaretPosition.fromRangeStart(range);
+
+ if (isContentEditableFalse(caretPosition.getNode())) {
+ return showCaret(1, editor, caretPosition.getNode(), !caretPosition.isAtEnd());
+ }
+
+ if (isContentEditableFalse(caretPosition.getNode(true))) {
+ return showCaret(1, editor, caretPosition.getNode(true), false);
+ }
+
+ // TODO: Should render caret before/after depending on where you click on the page forces after now
+ ceRoot = editor.dom.getParent(caretPosition.getNode(), Fun.or(isContentEditableFalse, isContentEditableTrue));
+ if (isContentEditableFalse(ceRoot)) {
+ return showCaret(1, editor, ceRoot, false);
+ }
+
+ return null;
+ };
+
+ var renderRangeCaret = function (editor, range) {
+ var caretRange;
+
+ if (!range || !range.collapsed) {
+ return range;
+ }
+
+ caretRange = renderCaretAtRange(editor, range);
+ if (caretRange) {
+ return caretRange;
+ }
+
+ return range;
+ };
+
+ return {
+ showCaret: showCaret,
+ selectNode: selectNode,
+ renderCaretAtRange: renderCaretAtRange,
+ renderRangeCaret: renderRangeCaret
+ };
+ }
+);
+
+/**
+ * CefFocus.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.focus.CefFocus',
+ [
+ 'ephox.katamari.api.Throttler',
+ 'tinymce.core.keyboard.CefUtils'
+ ],
+ function (Throttler, CefUtils) {
+ var setup = function (editor) {
+ var renderFocusCaret = Throttler.first(function () {
+ if (!editor.removed) {
+ var caretRange = CefUtils.renderRangeCaret(editor, editor.selection.getRng());
+ editor.selection.setRng(caretRange);
+ }
+ }, 0);
+
+ editor.on('focus', function () {
+ renderFocusCaret.throttle();
+ });
+
+ editor.on('blur', function () {
+ renderFocusCaret.cancel();
+ });
+ };
+
+ return {
+ setup: setup
+ };
+ }
+);
+
+/**
+ * VK.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This file exposes a set of the common KeyCodes for use. Please grow it as needed.
+ */
+define(
+ 'tinymce.core.util.VK',
+ [
+ "tinymce.core.Env"
+ ],
+ function (Env) {
+ return {
+ BACKSPACE: 8,
+ DELETE: 46,
+ DOWN: 40,
+ ENTER: 13,
+ LEFT: 37,
+ RIGHT: 39,
+ SPACEBAR: 32,
+ TAB: 9,
+ UP: 38,
+
+ modifierPressed: function (e) {
+ return e.shiftKey || e.ctrlKey || e.altKey || this.metaKeyPressed(e);
+ },
+
+ metaKeyPressed: function (e) {
+ // Check if ctrl or meta key is pressed. Edge case for AltGr on Windows where it produces ctrlKey+altKey states
+ return (Env.mac ? e.metaKey : e.ctrlKey && !e.altKey);
+ }
+ };
+ }
+);
+
+/**
+ * SelectionOverrides.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.SelectionOverrides',
+ [
+ 'ephox.katamari.api.Arr',
+ 'ephox.sugar.api.dom.Remove',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.properties.Attr',
+ 'ephox.sugar.api.search.SelectorFilter',
+ 'ephox.sugar.api.search.SelectorFind',
+ 'tinymce.core.DragDropOverrides',
+ 'tinymce.core.EditorView',
+ 'tinymce.core.Env',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.caret.CaretUtils',
+ 'tinymce.core.caret.CaretWalker',
+ 'tinymce.core.caret.FakeCaret',
+ 'tinymce.core.caret.LineUtils',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.RangePoint',
+ 'tinymce.core.focus.CefFocus',
+ 'tinymce.core.keyboard.CefUtils',
+ 'tinymce.core.util.VK'
+ ],
+ function (
+ Arr, Remove, Element, Attr, SelectorFilter, SelectorFind, DragDropOverrides, EditorView, Env, CaretContainer, CaretPosition, CaretUtils, CaretWalker, FakeCaret,
+ LineUtils, NodeType, RangePoint, CefFocus, CefUtils, VK
+ ) {
+ var isContentEditableTrue = NodeType.isContentEditableTrue,
+ isContentEditableFalse = NodeType.isContentEditableFalse,
+ isAfterContentEditableFalse = CaretUtils.isAfterContentEditableFalse,
+ isBeforeContentEditableFalse = CaretUtils.isBeforeContentEditableFalse;
+
+ var SelectionOverrides = function (editor) {
+ var isBlock = function (node) {
+ return editor.dom.isBlock(node);
+ };
+
+ var rootNode = editor.getBody();
+ var fakeCaret = new FakeCaret(editor.getBody(), isBlock),
+ realSelectionId = 'sel-' + editor.dom.uniqueId(),
+ selectedContentEditableNode;
+
+ var isFakeSelectionElement = function (elm) {
+ return editor.dom.hasClass(elm, 'mce-offscreen-selection');
+ };
+
+ var getRealSelectionElement = function () {
+ var container = editor.dom.get(realSelectionId);
+ return container ? container.getElementsByTagName('*')[0] : container;
+ };
+
+ var setRange = function (range) {
+ //console.log('setRange', range);
+ if (range) {
+ editor.selection.setRng(range);
+ }
+ };
+
+ var getRange = function () {
+ return editor.selection.getRng();
+ };
+
+ var scrollIntoView = function (node, alignToTop) {
+ editor.selection.scrollIntoView(node, alignToTop);
+ };
+
+ var showCaret = function (direction, node, before) {
+ var e;
+
+ e = editor.fire('ShowCaret', {
+ target: node,
+ direction: direction,
+ before: before
+ });
+
+ if (e.isDefaultPrevented()) {
+ return null;
+ }
+
+ scrollIntoView(node, direction === -1);
+
+ return fakeCaret.show(before, node);
+ };
+
+ var getNormalizedRangeEndPoint = function (direction, range) {
+ range = CaretUtils.normalizeRange(direction, rootNode, range);
+
+ if (direction == -1) {
+ return CaretPosition.fromRangeStart(range);
+ }
+
+ return CaretPosition.fromRangeEnd(range);
+ };
+
+ var showBlockCaretContainer = function (blockCaretContainer) {
+ if (blockCaretContainer.hasAttribute('data-mce-caret')) {
+ CaretContainer.showCaretContainerBlock(blockCaretContainer);
+ setRange(getRange()); // Removes control rect on IE
+ scrollIntoView(blockCaretContainer[0]);
+ }
+ };
+
+ var registerEvents = function () {
+ var getContentEditableRoot = function (node) {
+ var root = editor.getBody();
+
+ while (node && node != root) {
+ if (isContentEditableTrue(node) || isContentEditableFalse(node)) {
+ return node;
+ }
+
+ node = node.parentNode;
+ }
+
+ return null;
+ };
+
+ // Some browsers (Chrome) lets you place the caret after a cE=false
+ // Make sure we render the caret container in this case
+ editor.on('mouseup', function (e) {
+ var range = getRange();
+
+ if (range.collapsed && EditorView.isXYInContentArea(editor, e.clientX, e.clientY)) {
+ setRange(CefUtils.renderCaretAtRange(editor, range));
+ }
+ });
+
+ editor.on('click', function (e) {
+ var contentEditableRoot;
+
+ contentEditableRoot = getContentEditableRoot(e.target);
+ if (contentEditableRoot) {
+ // Prevent clicks on links in a cE=false element
+ if (isContentEditableFalse(contentEditableRoot)) {
+ e.preventDefault();
+ editor.focus();
+ }
+
+ // Removes fake selection if a cE=true is clicked within a cE=false like the toc title
+ if (isContentEditableTrue(contentEditableRoot)) {
+ if (editor.dom.isChildOf(contentEditableRoot, editor.selection.getNode())) {
+ removeContentEditableSelection();
+ }
+ }
+ }
+ });
+
+ editor.on('blur NewBlock', function () {
+ removeContentEditableSelection();
+ });
+
+ var handleTouchSelect = function (editor) {
+ var moved = false;
+
+ editor.on('touchstart', function () {
+ moved = false;
+ });
+
+ editor.on('touchmove', function () {
+ moved = true;
+ });
+
+ editor.on('touchend', function (e) {
+ var contentEditableRoot = getContentEditableRoot(e.target);
+
+ if (isContentEditableFalse(contentEditableRoot)) {
+ if (!moved) {
+ e.preventDefault();
+ setContentEditableSelection(CefUtils.selectNode(editor, contentEditableRoot));
+ }
+ }
+ });
+ };
+
+ var hasNormalCaretPosition = function (elm) {
+ var caretWalker = new CaretWalker(elm);
+
+ if (!elm.firstChild) {
+ return false;
+ }
+
+ var startPos = CaretPosition.before(elm.firstChild);
+ var newPos = caretWalker.next(startPos);
+
+ return newPos && !isBeforeContentEditableFalse(newPos) && !isAfterContentEditableFalse(newPos);
+ };
+
+ var isInSameBlock = function (node1, node2) {
+ var block1 = editor.dom.getParent(node1, editor.dom.isBlock);
+ var block2 = editor.dom.getParent(node2, editor.dom.isBlock);
+ return block1 === block2;
+ };
+
+ // Checks if the target node is in a block and if that block has a caret position better than the
+ // suggested caretNode this is to prevent the caret from being sucked in towards a cE=false block if
+ // they are adjacent on the vertical axis
+ var hasBetterMouseTarget = function (targetNode, caretNode) {
+ var targetBlock = editor.dom.getParent(targetNode, editor.dom.isBlock);
+ var caretBlock = editor.dom.getParent(caretNode, editor.dom.isBlock);
+
+ return targetBlock && !isInSameBlock(targetBlock, caretBlock) && hasNormalCaretPosition(targetBlock);
+ };
+
+ handleTouchSelect(editor);
+
+ editor.on('mousedown', function (e) {
+ var contentEditableRoot;
+
+ if (EditorView.isXYInContentArea(editor, e.clientX, e.clientY) === false) {
+ return;
+ }
+
+ contentEditableRoot = getContentEditableRoot(e.target);
+ if (contentEditableRoot) {
+ if (isContentEditableFalse(contentEditableRoot)) {
+ e.preventDefault();
+ setContentEditableSelection(CefUtils.selectNode(editor, contentEditableRoot));
+ } else {
+ removeContentEditableSelection();
+
+ // Check that we're not attempting a shift + click select within a contenteditable='true' element
+ if (!(isContentEditableTrue(contentEditableRoot) && e.shiftKey) && !RangePoint.isXYWithinRange(e.clientX, e.clientY, editor.selection.getRng())) {
+ editor.selection.placeCaretAt(e.clientX, e.clientY);
+ }
+ }
+ } else {
+ // Remove needs to be called here since the mousedown might alter the selection without calling selection.setRng
+ // and therefore not fire the AfterSetSelectionRange event.
+ removeContentEditableSelection();
+ hideFakeCaret();
+
+ var caretInfo = LineUtils.closestCaret(rootNode, e.clientX, e.clientY);
+ if (caretInfo) {
+ if (!hasBetterMouseTarget(e.target, caretInfo.node)) {
+ e.preventDefault();
+ editor.getBody().focus();
+ setRange(showCaret(1, caretInfo.node, caretInfo.before));
+ }
+ }
+ }
+ });
+
+ editor.on('keypress', function (e) {
+ if (VK.modifierPressed(e)) {
+ return;
+ }
+
+ switch (e.keyCode) {
+ default:
+ if (isContentEditableFalse(editor.selection.getNode())) {
+ e.preventDefault();
+ }
+ break;
+ }
+ });
+
+ editor.on('getSelectionRange', function (e) {
+ var rng = e.range;
+
+ if (selectedContentEditableNode) {
+ if (!selectedContentEditableNode.parentNode) {
+ selectedContentEditableNode = null;
+ return;
+ }
+
+ rng = rng.cloneRange();
+ rng.selectNode(selectedContentEditableNode);
+ e.range = rng;
+ }
+ });
+
+ editor.on('setSelectionRange', function (e) {
+ var rng;
+
+ rng = setContentEditableSelection(e.range, e.forward);
+ if (rng) {
+ e.range = rng;
+ }
+ });
+
+ editor.on('AfterSetSelectionRange', function (e) {
+ var rng = e.range;
+
+ if (!isRangeInCaretContainer(rng)) {
+ hideFakeCaret();
+ }
+
+ if (!isFakeSelectionElement(rng.startContainer.parentNode)) {
+ removeContentEditableSelection();
+ }
+ });
+
+ editor.on('copy', function (e) {
+ var clipboardData = e.clipboardData;
+
+ // Make sure we get proper html/text for the fake cE=false selection
+ // Doesn't work at all on Edge since it doesn't have proper clipboardData support
+ if (!e.isDefaultPrevented() && e.clipboardData && !Env.ie) {
+ var realSelectionElement = getRealSelectionElement();
+ if (realSelectionElement) {
+ e.preventDefault();
+ clipboardData.clearData();
+ clipboardData.setData('text/html', realSelectionElement.outerHTML);
+ clipboardData.setData('text/plain', realSelectionElement.outerText);
+ }
+ }
+ });
+
+ DragDropOverrides.init(editor);
+ CefFocus.setup(editor);
+ };
+
+ var addCss = function () {
+ var styles = editor.contentStyles, rootClass = '.mce-content-body';
+
+ styles.push(fakeCaret.getCss());
+ styles.push(
+ rootClass + ' .mce-offscreen-selection {' +
+ 'position: absolute;' +
+ 'left: -9999999999px;' +
+ 'max-width: 1000000px;' +
+ '}' +
+ rootClass + ' *[contentEditable=false] {' +
+ 'cursor: default;' +
+ '}' +
+ rootClass + ' *[contentEditable=true] {' +
+ 'cursor: text;' +
+ '}'
+ );
+ };
+
+ var isWithinCaretContainer = function (node) {
+ return (
+ CaretContainer.isCaretContainer(node) ||
+ CaretContainer.startsWithCaretContainer(node) ||
+ CaretContainer.endsWithCaretContainer(node)
+ );
+ };
+
+ var isRangeInCaretContainer = function (rng) {
+ return isWithinCaretContainer(rng.startContainer) || isWithinCaretContainer(rng.endContainer);
+ };
+
+ var setContentEditableSelection = function (range, forward) {
+ var node, $ = editor.$, dom = editor.dom, $realSelectionContainer, sel,
+ startContainer, startOffset, endOffset, e, caretPosition, targetClone, origTargetClone;
+
+ if (!range) {
+ return null;
+ }
+
+ if (range.collapsed) {
+ if (!isRangeInCaretContainer(range)) {
+ if (forward === false) {
+ caretPosition = getNormalizedRangeEndPoint(-1, range);
+
+ if (isContentEditableFalse(caretPosition.getNode(true))) {
+ return showCaret(-1, caretPosition.getNode(true), false);
+ }
+
+ if (isContentEditableFalse(caretPosition.getNode())) {
+ return showCaret(-1, caretPosition.getNode(), !caretPosition.isAtEnd());
+ }
+ } else {
+ caretPosition = getNormalizedRangeEndPoint(1, range);
+
+ if (isContentEditableFalse(caretPosition.getNode())) {
+ return showCaret(1, caretPosition.getNode(), !caretPosition.isAtEnd());
+ }
+
+ if (isContentEditableFalse(caretPosition.getNode(true))) {
+ return showCaret(1, caretPosition.getNode(true), false);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ startContainer = range.startContainer;
+ startOffset = range.startOffset;
+ endOffset = range.endOffset;
+
+ // Normalizes [] to []
+ if (startContainer.nodeType === 3 && startOffset === 0 && isContentEditableFalse(startContainer.parentNode)) {
+ startContainer = startContainer.parentNode;
+ startOffset = dom.nodeIndex(startContainer);
+ startContainer = startContainer.parentNode;
+ }
+
+ if (startContainer.nodeType != 1) {
+ return null;
+ }
+
+ if (endOffset == startOffset + 1) {
+ node = startContainer.childNodes[startOffset];
+ }
+
+ if (!isContentEditableFalse(node)) {
+ return null;
+ }
+
+ targetClone = origTargetClone = node.cloneNode(true);
+ e = editor.fire('ObjectSelected', { target: node, targetClone: targetClone });
+ if (e.isDefaultPrevented()) {
+ return null;
+ }
+
+ $realSelectionContainer = SelectorFind.descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).fold(
+ function () {
+ return $([]);
+ },
+ function (elm) {
+ return $([elm.dom()]);
+ }
+ );
+
+ targetClone = e.targetClone;
+ if ($realSelectionContainer.length === 0) {
+ $realSelectionContainer = $(
+ ''
+ ).attr('id', realSelectionId);
+
+ $realSelectionContainer.appendTo(editor.getBody());
+ }
+
+ range = editor.dom.createRng();
+
+ // WHY is IE making things so hard! Copy on x produces: x
+ // This is a ridiculous hack where we place the selection from a block over the inline element
+ // so that just the inline element is copied as is and not converted.
+ if (targetClone === origTargetClone && Env.ie) {
+ $realSelectionContainer.empty().append('
\u00a0
').append(targetClone);
+ range.setStartAfter($realSelectionContainer[0].firstChild.firstChild);
+ range.setEndAfter(targetClone);
+ } else {
+ $realSelectionContainer.empty().append('\u00a0').append(targetClone).append('\u00a0');
+ range.setStart($realSelectionContainer[0].firstChild, 1);
+ range.setEnd($realSelectionContainer[0].lastChild, 0);
+ }
+
+ $realSelectionContainer.css({
+ top: dom.getPos(node, editor.getBody()).y
+ });
+
+ $realSelectionContainer[0].focus();
+ sel = editor.selection.getSel();
+ sel.removeAllRanges();
+ sel.addRange(range);
+
+ Arr.each(SelectorFilter.descendants(Element.fromDom(editor.getBody()), '*[data-mce-selected]'), function (elm) {
+ Attr.remove(elm, 'data-mce-selected');
+ });
+
+ node.setAttribute('data-mce-selected', 1);
+ selectedContentEditableNode = node;
+ hideFakeCaret();
+
+ return range;
+ };
+
+ var removeContentEditableSelection = function () {
+ if (selectedContentEditableNode) {
+ selectedContentEditableNode.removeAttribute('data-mce-selected');
+ SelectorFind.descendant(Element.fromDom(editor.getBody()), '#' + realSelectionId).each(Remove.remove);
+ selectedContentEditableNode = null;
+ }
+ };
+
+ var destroy = function () {
+ fakeCaret.destroy();
+ selectedContentEditableNode = null;
+ };
+
+ var hideFakeCaret = function () {
+ fakeCaret.hide();
+ };
+
+ if (Env.ceFalse) {
+ registerEvents();
+ addCss();
+ }
+
+ return {
+ showCaret: showCaret,
+ showBlockCaretContainer: showBlockCaretContainer,
+ hideFakeCaret: hideFakeCaret,
+ destroy: destroy
+ };
+ };
+
+ return SelectionOverrides;
+ }
+);
+
+/**
+ * Diff.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * JS Implementation of the O(ND) Difference Algorithm by Eugene W. Myers.
+ *
+ * @class tinymce.undo.Diff
+ * @private
+ */
+define(
+ 'tinymce.core.undo.Diff',
+ [
+ ],
+ function () {
+ var KEEP = 0, INSERT = 1, DELETE = 2;
+
+ var diff = function (left, right) {
+ var size = left.length + right.length + 2;
+ var vDown = new Array(size);
+ var vUp = new Array(size);
+
+ var snake = function (start, end, diag) {
+ return {
+ start: start,
+ end: end,
+ diag: diag
+ };
+ };
+
+ var buildScript = function (start1, end1, start2, end2, script) {
+ var middle = getMiddleSnake(start1, end1, start2, end2);
+
+ if (middle === null || middle.start === end1 && middle.diag === end1 - end2 ||
+ middle.end === start1 && middle.diag === start1 - start2) {
+ var i = start1;
+ var j = start2;
+ while (i < end1 || j < end2) {
+ if (i < end1 && j < end2 && left[i] === right[j]) {
+ script.push([KEEP, left[i]]);
+ ++i;
+ ++j;
+ } else {
+ if (end1 - start1 > end2 - start2) {
+ script.push([DELETE, left[i]]);
+ ++i;
+ } else {
+ script.push([INSERT, right[j]]);
+ ++j;
+ }
+ }
+ }
+ } else {
+ buildScript(start1, middle.start, start2, middle.start - middle.diag, script);
+ for (var i2 = middle.start; i2 < middle.end; ++i2) {
+ script.push([KEEP, left[i2]]);
+ }
+ buildScript(middle.end, end1, middle.end - middle.diag, end2, script);
+ }
+ };
+
+ var buildSnake = function (start, diag, end1, end2) {
+ var end = start;
+ while (end - diag < end2 && end < end1 && left[end] === right[end - diag]) {
+ ++end;
+ }
+ return snake(start, end, diag);
+ };
+
+ var getMiddleSnake = function (start1, end1, start2, end2) {
+ // Myers Algorithm
+ // Initialisations
+ var m = end1 - start1;
+ var n = end2 - start2;
+ if (m === 0 || n === 0) {
+ return null;
+ }
+
+ var delta = m - n;
+ var sum = n + m;
+ var offset = (sum % 2 === 0 ? sum : sum + 1) / 2;
+ vDown[1 + offset] = start1;
+ vUp[1 + offset] = end1 + 1;
+
+ for (var d = 0; d <= offset; ++d) {
+ // Down
+ for (var k = -d; k <= d; k += 2) {
+ // First step
+
+ var i = k + offset;
+ if (k === -d || k != d && vDown[i - 1] < vDown[i + 1]) {
+ vDown[i] = vDown[i + 1];
+ } else {
+ vDown[i] = vDown[i - 1] + 1;
+ }
+
+ var x = vDown[i];
+ var y = x - start1 + start2 - k;
+
+ while (x < end1 && y < end2 && left[x] === right[y]) {
+ vDown[i] = ++x;
+ ++y;
+ }
+ // Second step
+ if (delta % 2 != 0 && delta - d <= k && k <= delta + d) {
+ if (vUp[i - delta] <= vDown[i]) {
+ return buildSnake(vUp[i - delta], k + start1 - start2, end1, end2);
+ }
+ }
+ }
+
+ // Up
+ for (k = delta - d; k <= delta + d; k += 2) {
+ // First step
+ i = k + offset - delta;
+ if (k === delta - d || k != delta + d && vUp[i + 1] <= vUp[i - 1]) {
+ vUp[i] = vUp[i + 1] - 1;
+ } else {
+ vUp[i] = vUp[i - 1];
+ }
+
+ x = vUp[i] - 1;
+ y = x - start1 + start2 - k;
+ while (x >= start1 && y >= start2 && left[x] === right[y]) {
+ vUp[i] = x--;
+ y--;
+ }
+ // Second step
+ if (delta % 2 === 0 && -d <= k && k <= d) {
+ if (vUp[i] <= vDown[i + delta]) {
+ return buildSnake(vUp[i], k + start1 - start2, end1, end2);
+ }
+ }
+ }
+ }
+ };
+
+ var script = [];
+ buildScript(0, left.length, 0, right.length, script);
+ return script;
+ };
+
+ return {
+ KEEP: KEEP,
+ DELETE: DELETE,
+ INSERT: INSERT,
+ diff: diff
+ };
+ }
+);
+/**
+ * Fragments.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module reads and applies html fragments from/to dom nodes.
+ *
+ * @class tinymce.undo.Fragments
+ * @private
+ */
+define(
+ 'tinymce.core.undo.Fragments',
+ [
+ 'global!document',
+ 'tinymce.core.html.Entities',
+ 'tinymce.core.undo.Diff',
+ 'tinymce.core.util.Arr'
+ ],
+ function (document, Entities, Diff, Arr) {
+ var getOuterHtml = function (elm) {
+ if (elm.nodeType === 1) {
+ return elm.outerHTML;
+ } else if (elm.nodeType === 3) {
+ return Entities.encodeRaw(elm.data, false);
+ } else if (elm.nodeType === 8) {
+ return '';
+ }
+
+ return '';
+ };
+
+ var createFragment = function (html) {
+ var frag, node, container;
+
+ container = document.createElement("div");
+ frag = document.createDocumentFragment();
+
+ if (html) {
+ container.innerHTML = html;
+ }
+
+ while ((node = container.firstChild)) {
+ frag.appendChild(node);
+ }
+
+ return frag;
+ };
+
+ var insertAt = function (elm, html, index) {
+ var fragment = createFragment(html);
+ if (elm.hasChildNodes() && index < elm.childNodes.length) {
+ var target = elm.childNodes[index];
+ target.parentNode.insertBefore(fragment, target);
+ } else {
+ elm.appendChild(fragment);
+ }
+ };
+
+ var removeAt = function (elm, index) {
+ if (elm.hasChildNodes() && index < elm.childNodes.length) {
+ var target = elm.childNodes[index];
+ target.parentNode.removeChild(target);
+ }
+ };
+
+ var applyDiff = function (diff, elm) {
+ var index = 0;
+ Arr.each(diff, function (action) {
+ if (action[0] === Diff.KEEP) {
+ index++;
+ } else if (action[0] === Diff.INSERT) {
+ insertAt(elm, action[1], index);
+ index++;
+ } else if (action[0] === Diff.DELETE) {
+ removeAt(elm, index);
+ }
+ });
+ };
+
+ var read = function (elm) {
+ return Arr.filter(Arr.map(elm.childNodes, getOuterHtml), function (item) {
+ return item.length > 0;
+ });
+ };
+
+ var write = function (fragments, elm) {
+ var currentFragments = Arr.map(elm.childNodes, getOuterHtml);
+ applyDiff(Diff.diff(currentFragments, fragments), elm);
+ return elm;
+ };
+
+ return {
+ read: read,
+ write: write
+ };
+ }
+);
+/**
+ * Levels.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module handles getting/setting undo levels to/from editor instances.
+ *
+ * @class tinymce.undo.Levels
+ * @private
+ */
+define(
+ 'tinymce.core.undo.Levels',
+ [
+ 'ephox.katamari.api.Arr',
+ 'tinymce.core.dom.TrimHtml',
+ 'tinymce.core.undo.Fragments'
+ ],
+ function (Arr, TrimHtml, Fragments) {
+ var hasIframes = function (html) {
+ return html.indexOf('') !== -1;
+ };
+
+ var createFragmentedLevel = function (fragments) {
+ return {
+ type: 'fragmented',
+ fragments: fragments,
+ content: '',
+ bookmark: null,
+ beforeBookmark: null
+ };
+ };
+
+ var createCompleteLevel = function (content) {
+ return {
+ type: 'complete',
+ fragments: null,
+ content: content,
+ bookmark: null,
+ beforeBookmark: null
+ };
+ };
+
+ var createFromEditor = function (editor) {
+ var fragments, content, trimmedFragments;
+
+ fragments = Fragments.read(editor.getBody());
+ trimmedFragments = Arr.bind(fragments, function (html) {
+ var trimmed = TrimHtml.trimInternal(editor.serializer, html);
+ return trimmed.length > 0 ? [trimmed] : [];
+ });
+ content = trimmedFragments.join('');
+
+ return hasIframes(content) ? createFragmentedLevel(trimmedFragments) : createCompleteLevel(content);
+ };
+
+ var applyToEditor = function (editor, level, before) {
+ if (level.type === 'fragmented') {
+ Fragments.write(level.fragments, editor.getBody());
+ } else {
+ editor.setContent(level.content, { format: 'raw' });
+ }
+
+ editor.selection.moveToBookmark(before ? level.beforeBookmark : level.bookmark);
+ };
+
+ var getLevelContent = function (level) {
+ return level.type === 'fragmented' ? level.fragments.join('') : level.content;
+ };
+
+ var isEq = function (level1, level2) {
+ return !!level1 && !!level2 && getLevelContent(level1) === getLevelContent(level2);
+ };
+
+ return {
+ createFragmentedLevel: createFragmentedLevel,
+ createCompleteLevel: createCompleteLevel,
+ createFromEditor: createFromEditor,
+ applyToEditor: applyToEditor,
+ isEq: isEq
+ };
+ }
+);
+/**
+ * UndoManager.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class handles the undo/redo history levels for the editor. Since the built-in undo/redo has major drawbacks a custom one was needed.
+ *
+ * @class tinymce.UndoManager
+ */
+define(
+ 'tinymce.core.UndoManager',
+ [
+ 'tinymce.core.dom.GetBookmark',
+ 'tinymce.core.undo.Levels',
+ 'tinymce.core.util.Tools'
+ ],
+ function (GetBookmark, Levels, Tools) {
+ return function (editor) {
+ var self = this, index = 0, data = [], beforeBookmark, isFirstTypedCharacter, locks = 0;
+
+ var isUnlocked = function () {
+ return locks === 0;
+ };
+
+ var setTyping = function (typing) {
+ if (isUnlocked()) {
+ self.typing = typing;
+ }
+ };
+
+ var setDirty = function (state) {
+ editor.setDirty(state);
+ };
+
+ var addNonTypingUndoLevel = function (e) {
+ setTyping(false);
+ self.add({}, e);
+ };
+
+ var endTyping = function () {
+ if (self.typing) {
+ setTyping(false);
+ self.add();
+ }
+ };
+
+ // Add initial undo level when the editor is initialized
+ editor.on('init', function () {
+ self.add();
+ });
+
+ // Get position before an execCommand is processed
+ editor.on('BeforeExecCommand', function (e) {
+ var cmd = e.command;
+
+ if (cmd !== 'Undo' && cmd !== 'Redo' && cmd !== 'mceRepaint') {
+ endTyping();
+ self.beforeChange();
+ }
+ });
+
+ // Add undo level after an execCommand call was made
+ editor.on('ExecCommand', function (e) {
+ var cmd = e.command;
+
+ if (cmd !== 'Undo' && cmd !== 'Redo' && cmd !== 'mceRepaint') {
+ addNonTypingUndoLevel(e);
+ }
+ });
+
+ editor.on('ObjectResizeStart Cut', function () {
+ self.beforeChange();
+ });
+
+ editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel);
+ editor.on('DragEnd', addNonTypingUndoLevel);
+
+ editor.on('KeyUp', function (e) {
+ var keyCode = e.keyCode;
+
+ // If key is prevented then don't add undo level
+ // This would happen on keyboard shortcuts for example
+ if (e.isDefaultPrevented()) {
+ return;
+ }
+
+ if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode === 45 || e.ctrlKey) {
+ addNonTypingUndoLevel();
+ editor.nodeChanged();
+ }
+
+ if (keyCode === 46 || keyCode === 8) {
+ editor.nodeChanged();
+ }
+
+ // Fire a TypingUndo/Change event on the first character entered
+ if (isFirstTypedCharacter && self.typing && Levels.isEq(Levels.createFromEditor(editor), data[0]) === false) {
+ if (editor.isDirty() === false) {
+ setDirty(true);
+ editor.fire('change', { level: data[0], lastLevel: null });
+ }
+
+ editor.fire('TypingUndo');
+ isFirstTypedCharacter = false;
+ editor.nodeChanged();
+ }
+ });
+
+ editor.on('KeyDown', function (e) {
+ var keyCode = e.keyCode;
+
+ // If key is prevented then don't add undo level
+ // This would happen on keyboard shortcuts for example
+ if (e.isDefaultPrevented()) {
+ return;
+ }
+
+ // Is character position keys left,right,up,down,home,end,pgdown,pgup,enter
+ if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode === 45) {
+ if (self.typing) {
+ addNonTypingUndoLevel(e);
+ }
+
+ return;
+ }
+
+ // If key isn't Ctrl+Alt/AltGr
+ var modKey = (e.ctrlKey && !e.altKey) || e.metaKey;
+ if ((keyCode < 16 || keyCode > 20) && keyCode !== 224 && keyCode !== 91 && !self.typing && !modKey) {
+ self.beforeChange();
+ setTyping(true);
+ self.add({}, e);
+ isFirstTypedCharacter = true;
+ }
+ });
+
+ editor.on('MouseDown', function (e) {
+ if (self.typing) {
+ addNonTypingUndoLevel(e);
+ }
+ });
+
+ // Add keyboard shortcuts for undo/redo keys
+ editor.addShortcut('meta+z', '', 'Undo');
+ editor.addShortcut('meta+y,meta+shift+z', '', 'Redo');
+
+ editor.on('AddUndo Undo Redo ClearUndos', function (e) {
+ if (!e.isDefaultPrevented()) {
+ editor.nodeChanged();
+ }
+ });
+
+ /*eslint consistent-this:0 */
+ self = {
+ // Explode for debugging reasons
+ data: data,
+
+ /**
+ * State if the user is currently typing or not. This will add a typing operation into one undo
+ * level instead of one new level for each keystroke.
+ *
+ * @field {Boolean} typing
+ */
+ typing: false,
+
+ /**
+ * Stores away a bookmark to be used when performing an undo action so that the selection is before
+ * the change has been made.
+ *
+ * @method beforeChange
+ */
+ beforeChange: function () {
+ if (isUnlocked()) {
+ beforeBookmark = GetBookmark.getUndoBookmark(editor.selection);
+ }
+ },
+
+ /**
+ * Adds a new undo level/snapshot to the undo list.
+ *
+ * @method add
+ * @param {Object} level Optional undo level object to add.
+ * @param {DOMEvent} event Optional event responsible for the creation of the undo level.
+ * @return {Object} Undo level that got added or null it a level wasn't needed.
+ */
+ add: function (level, event) {
+ var i, settings = editor.settings, lastLevel, currentLevel;
+
+ currentLevel = Levels.createFromEditor(editor);
+ level = level || {};
+ level = Tools.extend(level, currentLevel);
+
+ if (isUnlocked() === false || editor.removed) {
+ return null;
+ }
+
+ lastLevel = data[index];
+ if (editor.fire('BeforeAddUndo', { level: level, lastLevel: lastLevel, originalEvent: event }).isDefaultPrevented()) {
+ return null;
+ }
+
+ // Add undo level if needed
+ if (lastLevel && Levels.isEq(lastLevel, level)) {
+ return null;
+ }
+
+ // Set before bookmark on previous level
+ if (data[index]) {
+ data[index].beforeBookmark = beforeBookmark;
+ }
+
+ // Time to compress
+ if (settings.custom_undo_redo_levels) {
+ if (data.length > settings.custom_undo_redo_levels) {
+ for (i = 0; i < data.length - 1; i++) {
+ data[i] = data[i + 1];
+ }
+
+ data.length--;
+ index = data.length;
+ }
+ }
+
+ // Get a non intrusive normalized bookmark
+ level.bookmark = GetBookmark.getUndoBookmark(editor.selection);
+
+ // Crop array if needed
+ if (index < data.length - 1) {
+ data.length = index + 1;
+ }
+
+ data.push(level);
+ index = data.length - 1;
+
+ var args = { level: level, lastLevel: lastLevel, originalEvent: event };
+
+ editor.fire('AddUndo', args);
+
+ if (index > 0) {
+ setDirty(true);
+ editor.fire('change', args);
+ }
+
+ return level;
+ },
+
+ /**
+ * Undoes the last action.
+ *
+ * @method undo
+ * @return {Object} Undo level or null if no undo was performed.
+ */
+ undo: function () {
+ var level;
+
+ if (self.typing) {
+ self.add();
+ self.typing = false;
+ setTyping(false);
+ }
+
+ if (index > 0) {
+ level = data[--index];
+ Levels.applyToEditor(editor, level, true);
+ setDirty(true);
+ editor.fire('undo', { level: level });
+ }
+
+ return level;
+ },
+
+ /**
+ * Redoes the last action.
+ *
+ * @method redo
+ * @return {Object} Redo level or null if no redo was performed.
+ */
+ redo: function () {
+ var level;
+
+ if (index < data.length - 1) {
+ level = data[++index];
+ Levels.applyToEditor(editor, level, false);
+ setDirty(true);
+ editor.fire('redo', { level: level });
+ }
+
+ return level;
+ },
+
+ /**
+ * Removes all undo levels.
+ *
+ * @method clear
+ */
+ clear: function () {
+ data = [];
+ index = 0;
+ self.typing = false;
+ self.data = data;
+ editor.fire('ClearUndos');
+ },
+
+ /**
+ * Returns true/false if the undo manager has any undo levels.
+ *
+ * @method hasUndo
+ * @return {Boolean} true/false if the undo manager has any undo levels.
+ */
+ hasUndo: function () {
+ // Has undo levels or typing and content isn't the same as the initial level
+ return index > 0 || (self.typing && data[0] && !Levels.isEq(Levels.createFromEditor(editor), data[0]));
+ },
+
+ /**
+ * Returns true/false if the undo manager has any redo levels.
+ *
+ * @method hasRedo
+ * @return {Boolean} true/false if the undo manager has any redo levels.
+ */
+ hasRedo: function () {
+ return index < data.length - 1 && !self.typing;
+ },
+
+ /**
+ * Executes the specified mutator function as an undo transaction. The selection
+ * before the modification will be stored to the undo stack and if the DOM changes
+ * it will add a new undo level. Any logic within the translation that adds undo levels will
+ * be ignored. So a translation can include calls to execCommand or editor.insertContent.
+ *
+ * @method transact
+ * @param {function} callback Function that gets executed and has dom manipulation logic in it.
+ * @return {Object} Undo level that got added or null it a level wasn't needed.
+ */
+ transact: function (callback) {
+ endTyping();
+ self.beforeChange();
+ self.ignore(callback);
+ return self.add();
+ },
+
+ /**
+ * Executes the specified mutator function as an undo transaction. But without adding an undo level.
+ * Any logic within the translation that adds undo levels will be ignored. So a translation can
+ * include calls to execCommand or editor.insertContent.
+ *
+ * @method ignore
+ * @param {function} callback Function that gets executed and has dom manipulation logic in it.
+ * @return {Object} Undo level that got added or null it a level wasn't needed.
+ */
+ ignore: function (callback) {
+ try {
+ locks++;
+ callback();
+ } finally {
+ locks--;
+ }
+ },
+
+ /**
+ * Adds an extra "hidden" undo level by first applying the first mutation and store that to the undo stack
+ * then roll back that change and do the second mutation on top of the stack. This will produce an extra
+ * undo level that the user doesn't see until they undo.
+ *
+ * @method extra
+ * @param {function} callback1 Function that does mutation but gets stored as a "hidden" extra undo level.
+ * @param {function} callback2 Function that does mutation but gets displayed to the user.
+ */
+ extra: function (callback1, callback2) {
+ var lastLevel, bookmark;
+
+ if (self.transact(callback1)) {
+ bookmark = data[index].bookmark;
+ lastLevel = data[index - 1];
+ Levels.applyToEditor(editor, lastLevel, true);
+
+ if (self.transact(callback2)) {
+ data[index - 1].beforeBookmark = bookmark;
+ }
+ }
+ }
+ };
+
+ return self;
+ };
+ }
+);
+
+/**
+ * Hooks.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * Internal class for overriding formatting.
+ *
+ * @private
+ * @class tinymce.fmt.Hooks
+ */
+define(
+ 'tinymce.core.fmt.Hooks',
+ [
+ "tinymce.core.util.Arr",
+ "tinymce.core.dom.NodeType",
+ "tinymce.core.dom.DomQuery"
+ ],
+ function (Arr, NodeType, $) {
+ var postProcessHooks = {}, filter = Arr.filter, each = Arr.each;
+
+ var addPostProcessHook = function (name, hook) {
+ var hooks = postProcessHooks[name];
+
+ if (!hooks) {
+ postProcessHooks[name] = hooks = [];
+ }
+
+ postProcessHooks[name].push(hook);
+ };
+
+ var postProcess = function (name, editor) {
+ each(postProcessHooks[name], function (hook) {
+ hook(editor);
+ });
+ };
+
+ addPostProcessHook("pre", function (editor) {
+ var rng = editor.selection.getRng(), isPre, blocks;
+
+ var hasPreSibling = function (pre) {
+ return isPre(pre.previousSibling) && Arr.indexOf(blocks, pre.previousSibling) !== -1;
+ };
+
+ var joinPre = function (pre1, pre2) {
+ $(pre2).remove();
+ $(pre1).append('
').append(pre2.childNodes);
+ };
+
+ isPre = NodeType.matchNodeNames('pre');
+
+ if (!rng.collapsed) {
+ blocks = editor.selection.getSelectedBlocks();
+
+ each(filter(filter(blocks, isPre), hasPreSibling), function (pre) {
+ joinPre(pre.previousSibling, pre);
+ });
+ }
+ });
+
+ return {
+ postProcess: postProcess
+ };
+ }
+);
+
+/**
+ * RangeWalk.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.selection.RangeWalk',
+ [
+ 'tinymce.core.util.Tools'
+ ],
+ function (Tools) {
+ var each = Tools.each;
+
+ var getEndChild = function (container, index) {
+ var childNodes = container.childNodes;
+
+ index--;
+
+ if (index > childNodes.length - 1) {
+ index = childNodes.length - 1;
+ } else if (index < 0) {
+ index = 0;
+ }
+
+ return childNodes[index] || container;
+ };
+
+ var walk = function (dom, rng, callback) {
+ var startContainer = rng.startContainer,
+ startOffset = rng.startOffset,
+ endContainer = rng.endContainer,
+ endOffset = rng.endOffset,
+ ancestor, startPoint,
+ endPoint, node, parent, siblings, nodes;
+
+ // Handle table cell selection the table plugin enables
+ // you to fake select table cells and perform formatting actions on them
+ nodes = dom.select('td[data-mce-selected],th[data-mce-selected]');
+ if (nodes.length > 0) {
+ each(nodes, function (node) {
+ callback([node]);
+ });
+
+ return;
+ }
+
+ /**
+ * Excludes start/end text node if they are out side the range
+ *
+ * @private
+ * @param {Array} nodes Nodes to exclude items from.
+ * @return {Array} Array with nodes excluding the start/end container if needed.
+ */
+ var exclude = function (nodes) {
+ var node;
+
+ // First node is excluded
+ node = nodes[0];
+ if (node.nodeType === 3 && node === startContainer && startOffset >= node.nodeValue.length) {
+ nodes.splice(0, 1);
+ }
+
+ // Last node is excluded
+ node = nodes[nodes.length - 1];
+ if (endOffset === 0 && nodes.length > 0 && node === endContainer && node.nodeType === 3) {
+ nodes.splice(nodes.length - 1, 1);
+ }
+
+ return nodes;
+ };
+
+ var collectSiblings = function (node, name, endNode) {
+ var siblings = [];
+
+ for (; node && node != endNode; node = node[name]) {
+ siblings.push(node);
+ }
+
+ return siblings;
+ };
+
+ var findEndPoint = function (node, root) {
+ do {
+ if (node.parentNode === root) {
+ return node;
+ }
+
+ node = node.parentNode;
+ } while (node);
+ };
+
+ var walkBoundary = function (startNode, endNode, next) {
+ var siblingName = next ? 'nextSibling' : 'previousSibling';
+
+ for (node = startNode, parent = node.parentNode; node && node != endNode; node = parent) {
+ parent = node.parentNode;
+ siblings = collectSiblings(node === startNode ? node : node[siblingName], siblingName);
+
+ if (siblings.length) {
+ if (!next) {
+ siblings.reverse();
+ }
+
+ callback(exclude(siblings));
+ }
+ }
+ };
+
+ // If index based start position then resolve it
+ if (startContainer.nodeType === 1 && startContainer.hasChildNodes()) {
+ startContainer = startContainer.childNodes[startOffset];
+ }
+
+ // If index based end position then resolve it
+ if (endContainer.nodeType === 1 && endContainer.hasChildNodes()) {
+ endContainer = getEndChild(endContainer, endOffset);
+ }
+
+ // Same container
+ if (startContainer === endContainer) {
+ return callback(exclude([startContainer]));
+ }
+
+ // Find common ancestor and end points
+ ancestor = dom.findCommonAncestor(startContainer, endContainer);
+
+ // Process left side
+ for (node = startContainer; node; node = node.parentNode) {
+ if (node === endContainer) {
+ return walkBoundary(startContainer, ancestor, true);
+ }
+
+ if (node === ancestor) {
+ break;
+ }
+ }
+
+ // Process right side
+ for (node = endContainer; node; node = node.parentNode) {
+ if (node === startContainer) {
+ return walkBoundary(endContainer, ancestor);
+ }
+
+ if (node === ancestor) {
+ break;
+ }
+ }
+
+ // Find start/end point
+ startPoint = findEndPoint(startContainer, ancestor) || startContainer;
+ endPoint = findEndPoint(endContainer, ancestor) || endContainer;
+
+ // Walk left leaf
+ walkBoundary(startContainer, startPoint, true);
+
+ // Walk the middle from start to end point
+ siblings = collectSiblings(
+ startPoint === startContainer ? startPoint : startPoint.nextSibling,
+ 'nextSibling',
+ endPoint === endContainer ? endPoint.nextSibling : endPoint
+ );
+
+ if (siblings.length) {
+ callback(exclude(siblings));
+ }
+
+ // Walk right leaf
+ walkBoundary(endContainer, endPoint);
+ };
+
+ return {
+ walk: walk
+ };
+ }
+);
+
+/**
+ * RemoveFormat.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.fmt.RemoveFormat',
+ [
+ 'tinymce.core.dom.Bookmarks',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.dom.TreeWalker',
+ 'tinymce.core.fmt.CaretFormat',
+ 'tinymce.core.fmt.ExpandRange',
+ 'tinymce.core.fmt.FormatUtils',
+ 'tinymce.core.fmt.MatchFormat',
+ 'tinymce.core.selection.RangeWalk',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Bookmarks, NodeType, TreeWalker, CaretFormat, ExpandRange, FormatUtils, MatchFormat, RangeWalk, Tools) {
+ var MCE_ATTR_RE = /^(src|href|style)$/;
+ var each = Tools.each;
+ var isEq = FormatUtils.isEq;
+
+ var isTableCell = function (node) {
+ return /^(TH|TD)$/.test(node.nodeName);
+ };
+
+ var getContainer = function (ed, rng, start) {
+ var container, offset, lastIdx;
+
+ container = rng[start ? 'startContainer' : 'endContainer'];
+ offset = rng[start ? 'startOffset' : 'endOffset'];
+
+ if (NodeType.isElement(container)) {
+ lastIdx = container.childNodes.length - 1;
+
+ if (!start && offset) {
+ offset--;
+ }
+
+ container = container.childNodes[offset > lastIdx ? lastIdx : offset];
+ }
+
+ // If start text node is excluded then walk to the next node
+ if (NodeType.isText(container) && start && offset >= container.nodeValue.length) {
+ container = new TreeWalker(container, ed.getBody()).next() || container;
+ }
+
+ // If end text node is excluded then walk to the previous node
+ if (NodeType.isText(container) && !start && offset === 0) {
+ container = new TreeWalker(container, ed.getBody()).prev() || container;
+ }
+
+ return container;
+ };
+
+ var wrap = function (dom, node, name, attrs) {
+ var wrapper = dom.create(name, attrs);
+
+ node.parentNode.insertBefore(wrapper, node);
+ wrapper.appendChild(node);
+
+ return wrapper;
+ };
+
+ /**
+ * Checks if the specified nodes name matches the format inline/block or selector.
+ *
+ * @private
+ * @param {Node} node Node to match against the specified format.
+ * @param {Object} format Format object o match with.
+ * @return {boolean} true/false if the format matches.
+ */
+ var matchName = function (dom, node, format) {
+ // Check for inline match
+ if (isEq(node, format.inline)) {
+ return true;
+ }
+
+ // Check for block match
+ if (isEq(node, format.block)) {
+ return true;
+ }
+
+ // Check for selector match
+ if (format.selector) {
+ return NodeType.isElement(node) && dom.is(node, format.selector);
+ }
+ };
+
+ var isColorFormatAndAnchor = function (node, format) {
+ return format.links && node.tagName === 'A';
+ };
+
+ var find = function (dom, node, next, inc) {
+ node = FormatUtils.getNonWhiteSpaceSibling(node, next, inc);
+ return !node || (node.nodeName === 'BR' || dom.isBlock(node));
+ };
+
+ /**
+ * Removes the node and wrap it's children in paragraphs before doing so or
+ * appends BR elements to the beginning/end of the block element if forcedRootBlocks is disabled.
+ *
+ * If the div in the node below gets removed:
+ * text
+ // This won't happen if root blocks are disabled or the shiftKey is pressed
+ if ((newBlockName && !shiftKey) || (!newBlockName && shiftKey)) {
+ container = wrapSelfAndSiblingsInDefaultBlock(editor, newBlockName, rng, container, offset);
+ }
+
+ // Find parent block and setup empty block paddings
+ parentBlock = dom.getParent(container, dom.isBlock);
+ containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null;
+
+ // Setup block names
+ parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : ''; // IE < 9 & HTML5
+ containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : ''; // IE < 9 & HTML5
+
+ // Enter inside block contained within a LI then split or insert before/after LI
+ if (containerBlockName === 'LI' && !evt.ctrlKey) {
+ parentBlock = containerBlock;
+ containerBlock = containerBlock.parentNode;
+ parentBlockName = containerBlockName;
+ }
+
+ // Handle enter in list item
+ if (/^(LI|DT|DD)$/.test(parentBlockName)) {
+ // Handle enter inside an empty list item
+ if (dom.isEmpty(parentBlock)) {
+ InsertLi.insert(editor, createNewBlock, containerBlock, parentBlock, newBlockName);
+ return;
+ }
+ }
+
+ // If parent block is root then never insert new blocks
+ if (newBlockName && parentBlock === editor.getBody()) {
+ return;
+ }
+
+ // Default block name if it's not configured
+ newBlockName = newBlockName || 'P';
+
+ // Insert new block before/after the parent block depending on caret location
+ if (CaretContainer.isCaretContainerBlock(parentBlock)) {
+ newBlock = CaretContainer.showCaretContainerBlock(parentBlock);
+ if (dom.isEmpty(parentBlock)) {
+ emptyBlock(parentBlock);
+ }
+ NewLineUtils.moveToCaretPosition(editor, newBlock);
+ } else if (isCaretAtStartOrEndOfBlock()) {
+ insertNewBlockAfter();
+ } else if (isCaretAtStartOrEndOfBlock(true)) {
+ // Insert new block before
+ newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock);
+ NewLineUtils.moveToCaretPosition(editor, containerAndSiblingName(parentBlock, 'HR') ? newBlock : parentBlock);
+ } else {
+ // Extract after fragment and insert it after the current block
+ tmpRng = includeZwspInRange(rng).cloneRange();
+ tmpRng.setEndAfter(parentBlock);
+ fragment = tmpRng.extractContents();
+ trimLeadingLineBreaks(fragment);
+ newBlock = fragment.firstChild;
+ dom.insertAfter(fragment, parentBlock);
+ trimInlineElementsOnLeftSideOfBlock(dom, nonEmptyElementsMap, newBlock);
+ addBrToBlockIfNeeded(dom, parentBlock);
+
+ if (dom.isEmpty(parentBlock)) {
+ emptyBlock(parentBlock);
+ }
+
+ newBlock.normalize();
+
+ // New block might become empty if it's
a |
+ if (dom.isEmpty(newBlock)) {
+ dom.remove(newBlock);
+ insertNewBlockAfter();
+ } else {
+ NewLineUtils.moveToCaretPosition(editor, newBlock);
+ }
+ }
+
+ dom.setAttrib(newBlock, 'id', ''); // Remove ID since it needs to be document unique
+
+ // Allow custom handling of new blocks
+ editor.fire('NewBlock', { newBlock: newBlock });
+ };
+
+ return {
+ insert: insert
+ };
+ }
+);
+
+/**
+ * ContextSelectors.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.newline.ContextSelectors',
+ [
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.search.Selectors',
+ 'tinymce.core.api.Settings',
+ 'tinymce.core.newline.NewLineUtils'
+ ],
+ function (Element, Selectors, Settings, NewLineUtils) {
+ var matchesSelector = function (editor, selector) {
+ return NewLineUtils.getParentBlock(editor).filter(function (parentBlock) {
+ return selector.length > 0 && Selectors.is(Element.fromDom(parentBlock), selector);
+ }).isSome();
+ };
+
+ var shouldInsertBr = function (editor) {
+ return matchesSelector(editor, Settings.getBrNewLineSelector(editor));
+ };
+
+ var shouldBlockNewLine = function (editor) {
+ return matchesSelector(editor, Settings.getNoNewLineSelector(editor));
+ };
+
+ return {
+ shouldInsertBr: shouldInsertBr,
+ shouldBlockNewLine: shouldBlockNewLine
+ };
+ }
+);
+
+/**
+ * NewLineAction.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.newline.NewLineAction',
+ [
+ 'ephox.katamari.api.Adt',
+ 'ephox.katamari.api.Arr',
+ 'ephox.katamari.api.Option',
+ 'tinymce.core.api.Settings',
+ 'tinymce.core.newline.ContextSelectors',
+ 'tinymce.core.newline.NewLineUtils',
+ 'tinymce.core.util.LazyEvaluator'
+ ],
+ function (Adt, Arr, Option, Settings, ContextSelectors, NewLineUtils, LazyEvaluator) {
+ var newLineAction = Adt.generate([
+ { br: [ ] },
+ { block: [ ] },
+ { none: [ ] }
+ ]);
+
+ var shouldBlockNewLine = function (editor, shiftKey) {
+ return ContextSelectors.shouldBlockNewLine(editor);
+ };
+
+ var isBrMode = function (requiredState) {
+ return function (editor, shiftKey) {
+ var brMode = Settings.getForcedRootBlock(editor) === '';
+ return brMode === requiredState;
+ };
+ };
+
+ var inListBlock = function (requiredState) {
+ return function (editor, shiftKey) {
+ return NewLineUtils.isListItemParentBlock(editor) === requiredState;
+ };
+ };
+
+ var inPreBlock = function (requiredState) {
+ return function (editor, shiftKey) {
+ var inPre = NewLineUtils.getParentBlockName(editor) === 'PRE';
+ return inPre === requiredState;
+ };
+ };
+
+ var shouldPutBrInPre = function (requiredState) {
+ return function (editor, shiftKey) {
+ return Settings.shouldPutBrInPre(editor) === requiredState;
+ };
+ };
+
+ var inBrContext = function (editor, shiftKey) {
+ return ContextSelectors.shouldInsertBr(editor);
+ };
+
+ var hasShiftKey = function (editor, shiftKey) {
+ return shiftKey;
+ };
+
+ var canInsertIntoEditableRoot = function (editor) {
+ var forcedRootBlock = Settings.getForcedRootBlock(editor);
+ var rootEditable = NewLineUtils.getEditableRoot(editor.dom, editor.selection.getStart());
+
+ return rootEditable && editor.schema.isValidChild(rootEditable.nodeName, forcedRootBlock ? forcedRootBlock : 'P');
+ };
+
+ var match = function (predicates, action) {
+ return function (editor, shiftKey) {
+ var isMatch = Arr.foldl(predicates, function (res, p) {
+ return res && p(editor, shiftKey);
+ }, true);
+
+ return isMatch ? Option.some(action) : Option.none();
+ };
+ };
+
+ var getAction = function (editor, evt) {
+ return LazyEvaluator.evaluateUntil([
+ match([shouldBlockNewLine], newLineAction.none()),
+ match([inPreBlock(true), shouldPutBrInPre(false), hasShiftKey], newLineAction.br()),
+ match([inPreBlock(true), shouldPutBrInPre(false)], newLineAction.block()),
+ match([inPreBlock(true), shouldPutBrInPre(true), hasShiftKey], newLineAction.block()),
+ match([inPreBlock(true), shouldPutBrInPre(true)], newLineAction.br()),
+ match([inListBlock(true), hasShiftKey], newLineAction.br()),
+ match([inListBlock(true)], newLineAction.block()),
+ match([isBrMode(true), hasShiftKey, canInsertIntoEditableRoot], newLineAction.block()),
+ match([isBrMode(true)], newLineAction.br()),
+ match([inBrContext], newLineAction.br()),
+ match([isBrMode(false), hasShiftKey], newLineAction.br()),
+ match([canInsertIntoEditableRoot], newLineAction.block())
+ ], [editor, evt.shiftKey]).getOr(newLineAction.none());
+ };
+
+ return {
+ getAction: getAction
+ };
+ }
+);
+
+/**
+ * InsertNewLine.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.newline.InsertNewLine',
+ [
+ 'ephox.katamari.api.Fun',
+ 'tinymce.core.newline.InsertBlock',
+ 'tinymce.core.newline.InsertBr',
+ 'tinymce.core.newline.NewLineAction'
+ ],
+ function (Fun, InsertBlock, InsertBr, NewLineAction) {
+ var insert = function (editor, evt) {
+ NewLineAction.getAction(editor, evt).fold(
+ function () {
+ InsertBr.insert(editor, evt);
+ },
+ function () {
+ InsertBlock.insert(editor, evt);
+ },
+ Fun.noop
+ );
+ };
+
+ return {
+ insert: insert
+ };
+ }
+);
+
+/**
+ * EnterKey.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.EnterKey',
+ [
+ 'tinymce.core.newline.InsertNewLine',
+ 'tinymce.core.util.VK'
+ ],
+ function (InsertNewLine, VK) {
+ var endTypingLevel = function (undoManager) {
+ if (undoManager.typing) {
+ undoManager.typing = false;
+ undoManager.add();
+ }
+ };
+
+ var handleEnterKeyEvent = function (editor, event) {
+ if (event.isDefaultPrevented()) {
+ return;
+ }
+
+ event.preventDefault();
+
+ endTypingLevel(editor.undoManager);
+ editor.undoManager.transact(function () {
+ if (editor.selection.isCollapsed() === false) {
+ editor.execCommand('Delete');
+ }
+
+ InsertNewLine.insert(editor, event);
+ });
+ };
+
+ var setup = function (editor) {
+ editor.on('keydown', function (event) {
+ if (event.keyCode === VK.ENTER) {
+ handleEnterKeyEvent(editor, event);
+ }
+ });
+ };
+
+ return {
+ setup: setup
+ };
+ }
+);
+
+/**
+ * InsertSpace.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.InsertSpace',
+ [
+ 'ephox.katamari.api.Fun',
+ 'tinymce.core.caret.CaretPosition',
+ 'tinymce.core.dom.NodeType',
+ 'tinymce.core.keyboard.BoundaryLocation',
+ 'tinymce.core.keyboard.InlineUtils'
+ ],
+ function (Fun, CaretPosition, NodeType, BoundaryLocation, InlineUtils) {
+ var isValidInsertPoint = function (location, caretPosition) {
+ return isAtStartOrEnd(location) && NodeType.isText(caretPosition.container());
+ };
+
+ var insertNbspAtPosition = function (editor, caretPosition) {
+ var container = caretPosition.container();
+ var offset = caretPosition.offset();
+
+ container.insertData(offset, '\u00a0');
+ editor.selection.setCursorLocation(container, offset + 1);
+ };
+
+ var insertAtLocation = function (editor, caretPosition, location) {
+ if (isValidInsertPoint(location, caretPosition)) {
+ insertNbspAtPosition(editor, caretPosition);
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ var insertAtCaret = function (editor) {
+ var isInlineTarget = Fun.curry(InlineUtils.isInlineTarget, editor);
+ var caretPosition = CaretPosition.fromRangeStart(editor.selection.getRng());
+ var boundaryLocation = BoundaryLocation.readLocation(isInlineTarget, editor.getBody(), caretPosition);
+ return boundaryLocation.map(Fun.curry(insertAtLocation, editor, caretPosition)).getOr(false);
+ };
+
+ var isAtStartOrEnd = function (location) {
+ return location.fold(
+ Fun.constant(false), // Before
+ Fun.constant(true), // Start
+ Fun.constant(true), // End
+ Fun.constant(false) // After
+ );
+ };
+
+ var insertAtSelection = function (editor) {
+ return editor.selection.isCollapsed() ? insertAtCaret(editor) : false;
+ };
+
+ return {
+ insertAtSelection: insertAtSelection
+ };
+ }
+);
+
+/**
+ * SpaceKey.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.SpaceKey',
+ [
+ 'tinymce.core.keyboard.InsertSpace',
+ 'tinymce.core.keyboard.MatchKeys',
+ 'tinymce.core.util.VK'
+ ],
+ function (InsertSpace, MatchKeys, VK) {
+ var executeKeydownOverride = function (editor, evt) {
+ MatchKeys.execute([
+ { keyCode: VK.SPACEBAR, action: MatchKeys.action(InsertSpace.insertAtSelection, editor) }
+ ], evt).each(function (_) {
+ evt.preventDefault();
+ });
+ };
+
+ var setup = function (editor) {
+ editor.on('keydown', function (evt) {
+ if (evt.isDefaultPrevented() === false) {
+ executeKeydownOverride(editor, evt);
+ }
+ });
+ };
+
+ return {
+ setup: setup
+ };
+ }
+);
+
+/**
+ * KeyboardOverrides.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.keyboard.KeyboardOverrides',
+ [
+ 'tinymce.core.keyboard.ArrowKeys',
+ 'tinymce.core.keyboard.BoundarySelection',
+ 'tinymce.core.keyboard.DeleteBackspaceKeys',
+ 'tinymce.core.keyboard.EnterKey',
+ 'tinymce.core.keyboard.SpaceKey'
+ ],
+ function (ArrowKeys, BoundarySelection, DeleteBackspaceKeys, EnterKey, SpaceKey) {
+ var setup = function (editor) {
+ var caret = BoundarySelection.setupSelectedState(editor);
+
+ ArrowKeys.setup(editor, caret);
+ DeleteBackspaceKeys.setup(editor, caret);
+ EnterKey.setup(editor);
+ SpaceKey.setup(editor);
+ };
+
+ return {
+ setup: setup
+ };
+ }
+);
+/**
+ * Quirks.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ *
+ * @ignore-file
+ */
+
+/**
+ * This file includes fixes for various browser quirks it's made to make it easy to add/remove browser specific fixes.
+ *
+ * @private
+ * @class tinymce.util.Quirks
+ */
+define(
+ 'tinymce.core.util.Quirks',
+ [
+ 'global!document',
+ 'global!window',
+ 'tinymce.core.Env',
+ 'tinymce.core.caret.CaretContainer',
+ 'tinymce.core.selection.CaretRangeFromPoint',
+ 'tinymce.core.util.Delay',
+ 'tinymce.core.util.Tools',
+ 'tinymce.core.util.VK'
+ ],
+ function (document, window, Env, CaretContainer, CaretRangeFromPoint, Delay, Tools, VK) {
+ return function (editor) {
+ var each = Tools.each;
+ var BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection,
+ settings = editor.settings, parser = editor.parser;
+ var isGecko = Env.gecko, isIE = Env.ie, isWebKit = Env.webkit;
+ var mceInternalUrlPrefix = 'data:text/mce-internal,';
+ var mceInternalDataType = isIE ? 'Text' : 'URL';
+
+ /**
+ * Executes a command with a specific state this can be to enable/disable browser editing features.
+ */
+ var setEditorCommandState = function (cmd, state) {
+ try {
+ editor.getDoc().execCommand(cmd, false, state);
+ } catch (ex) {
+ // Ignore
+ }
+ };
+
+ /**
+ * Returns true/false if the event is prevented or not.
+ *
+ * @private
+ * @param {Event} e Event object.
+ * @return {Boolean} true/false if the event is prevented or not.
+ */
+ var isDefaultPrevented = function (e) {
+ return e.isDefaultPrevented();
+ };
+
+ /**
+ * Sets Text/URL data on the event's dataTransfer object to a special data:text/mce-internal url.
+ * This is to workaround the inability to set custom contentType on IE and Safari.
+ * The editor's selected content is encoded into this url so drag and drop between editors will work.
+ *
+ * @private
+ * @param {DragEvent} e Event object
+ */
+ var setMceInternalContent = function (e) {
+ var selectionHtml, internalContent;
+
+ if (e.dataTransfer) {
+ if (editor.selection.isCollapsed() && e.target.tagName == 'IMG') {
+ selection.select(e.target);
+ }
+
+ selectionHtml = editor.selection.getContent();
+
+ // Safari/IE doesn't support custom dataTransfer items so we can only use URL and Text
+ if (selectionHtml.length > 0) {
+ internalContent = mceInternalUrlPrefix + escape(editor.id) + ',' + escape(selectionHtml);
+ e.dataTransfer.setData(mceInternalDataType, internalContent);
+ }
+ }
+ };
+
+ /**
+ * Gets content of special data:text/mce-internal url on the event's dataTransfer object.
+ * This is to workaround the inability to set custom contentType on IE and Safari.
+ * The editor's selected content is encoded into this url so drag and drop between editors will work.
+ *
+ * @private
+ * @param {DragEvent} e Event object
+ * @returns {String} mce-internal content
+ */
+ var getMceInternalContent = function (e) {
+ var internalContent;
+
+ if (e.dataTransfer) {
+ internalContent = e.dataTransfer.getData(mceInternalDataType);
+
+ if (internalContent && internalContent.indexOf(mceInternalUrlPrefix) >= 0) {
+ internalContent = internalContent.substr(mceInternalUrlPrefix.length).split(',');
+
+ return {
+ id: unescape(internalContent[0]),
+ html: unescape(internalContent[1])
+ };
+ }
+ }
+
+ return null;
+ };
+
+ /**
+ * Inserts contents using the paste clipboard command if it's available if it isn't it will fallback
+ * to the core command.
+ *
+ * @private
+ * @param {String} content Content to insert at selection.
+ * @param {Boolean} internal State if the paste is to be considered internal or external.
+ */
+ var insertClipboardContents = function (content, internal) {
+ if (editor.queryCommandSupported('mceInsertClipboardContent')) {
+ editor.execCommand('mceInsertClipboardContent', false, { content: content, internal: internal });
+ } else {
+ editor.execCommand('mceInsertContent', false, content);
+ }
+ };
+
+ /**
+ * Makes sure that the editor body becomes empty when backspace or delete is pressed in empty editors.
+ *
+ * For example:
+ *
|
+ *
+ * Or:
+ *
|
+ *
+ * Or:
+ * []
+ */
+ var emptyEditorWhenDeleting = function () {
+ var serializeRng = function (rng) {
+ var body = dom.create("body");
+ var contents = rng.cloneContents();
+ body.appendChild(contents);
+ return selection.serializer.serialize(body, { format: 'html' });
+ };
+
+ var allContentsSelected = function (rng) {
+ var selection = serializeRng(rng);
+
+ var allRng = dom.createRng();
+ allRng.selectNode(editor.getBody());
+
+ var allSelection = serializeRng(allRng);
+ return selection === allSelection;
+ };
+
+ editor.on('keydown', function (e) {
+ var keyCode = e.keyCode, isCollapsed, body;
+
+ // Empty the editor if it's needed for example backspace at
|
+ if (!isDefaultPrevented(e) && (keyCode == DELETE || keyCode == BACKSPACE)) {
+ isCollapsed = editor.selection.isCollapsed();
+ body = editor.getBody();
+
+ // Selection is collapsed but the editor isn't empty
+ if (isCollapsed && !dom.isEmpty(body)) {
+ return;
+ }
+
+ // Selection isn't collapsed but not all the contents is selected
+ if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {
+ return;
+ }
+
+ // Manually empty the editor
+ e.preventDefault();
+ editor.setContent('');
+
+ if (body.firstChild && dom.isBlock(body.firstChild)) {
+ editor.selection.setCursorLocation(body.firstChild, 0);
+ } else {
+ editor.selection.setCursorLocation(body, 0);
+ }
+
+ editor.nodeChanged();
+ }
+ });
+ };
+
+ /**
+ * WebKit doesn't select all the nodes in the body when you press Ctrl+A.
+ * IE selects more than the contents [
a
] instead of
[a]
see bug #6438
+ * This selects the whole body so that backspace/delete logic will delete everything
+ */
+ var selectAll = function () {
+ editor.shortcuts.add('meta+a', null, 'SelectAll');
+ };
+
+ /**
+ * WebKit has a weird issue where it some times fails to properly convert keypresses to input method keystrokes.
+ * The IME on Mac doesn't initialize when it doesn't fire a proper focus event.
+ *
+ * This seems to happen when the user manages to click the documentElement element then the window doesn't get proper focus until
+ * you enter a character into the editor.
+ *
+ * It also happens when the first focus in made to the body.
+ *
+ * See: https://bugs.webkit.org/show_bug.cgi?id=83566
+ */
+ var inputMethodFocus = function () {
+ if (!editor.settings.content_editable) {
+ // Case 1 IME doesn't initialize if you focus the document
+ // Disabled since it was interferring with the cE=false logic
+ // Also coultn't reproduce the issue on Safari 9
+ /*dom.bind(editor.getDoc(), 'focusin', function() {
+ selection.setRng(selection.getRng());
+ });*/
+
+ // Case 2 IME doesn't initialize if you click the documentElement it also doesn't properly fire the focusin event
+ // Needs to be both down/up due to weird rendering bug on Chrome Windows
+ dom.bind(editor.getDoc(), 'mousedown mouseup', function (e) {
+ var rng;
+
+ if (e.target == editor.getDoc().documentElement) {
+ rng = selection.getRng();
+ editor.getBody().focus();
+
+ if (e.type == 'mousedown') {
+ if (CaretContainer.isCaretContainer(rng.startContainer)) {
+ return;
+ }
+
+ // Edge case for mousedown, drag select and mousedown again within selection on Chrome Windows to render caret
+ selection.placeCaretAt(e.clientX, e.clientY);
+ } else {
+ selection.setRng(rng);
+ }
+ }
+ });
+ }
+ };
+
+ /**
+ * Backspacing in FireFox/IE from a paragraph into a horizontal rule results in a floating text node because the
+ * browser just deletes the paragraph - the browser fails to merge the text node with a horizontal rule so it is
+ * left there. TinyMCE sees a floating text node and wraps it in a paragraph on the key up event (ForceBlocks.js
+ * addRootBlocks), meaning the action does nothing. With this code, FireFox/IE matche the behaviour of other
+ * browsers.
+ *
+ * It also fixes a bug on Firefox where it's impossible to delete HR elements.
+ */
+ var removeHrOnBackspace = function () {
+ editor.on('keydown', function (e) {
+ if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
+ // Check if there is any HR elements this is faster since getRng on IE 7 & 8 is slow
+ if (!editor.getBody().getElementsByTagName('hr').length) {
+ return;
+ }
+
+ if (selection.isCollapsed() && selection.getRng(true).startOffset === 0) {
+ var node = selection.getNode();
+ var previousSibling = node.previousSibling;
+
+ if (node.nodeName == 'HR') {
+ dom.remove(node);
+ e.preventDefault();
+ return;
+ }
+
+ if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === "hr") {
+ dom.remove(previousSibling);
+ e.preventDefault();
+ }
+ }
+ }
+ });
+ };
+
+ /**
+ * Firefox 3.x has an issue where the body element won't get proper focus if you click out
+ * side it's rectangle.
+ */
+ var focusBody = function () {
+ // Fix for a focus bug in FF 3.x where the body element
+ // wouldn't get proper focus if the user clicked on the HTML element
+ if (!window.Range.prototype.getClientRects) { // Detect getClientRects got introduced in FF 4
+ editor.on('mousedown', function (e) {
+ if (!isDefaultPrevented(e) && e.target.nodeName === "HTML") {
+ var body = editor.getBody();
+
+ // Blur the body it's focused but not correctly focused
+ body.blur();
+
+ // Refocus the body after a little while
+ Delay.setEditorTimeout(editor, function () {
+ body.focus();
+ });
+ }
+ });
+ }
+ };
+
+ /**
+ * WebKit has a bug where it isn't possible to select image, hr or anchor elements
+ * by clicking on them so we need to fake that.
+ */
+ var selectControlElements = function () {
+ editor.on('click', function (e) {
+ var target = e.target;
+
+ // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250
+ // WebKit can't even do simple things like selecting an image
+ // Needs to be the setBaseAndExtend or it will fail to select floated images
+ if (/^(IMG|HR)$/.test(target.nodeName) && dom.getContentEditableParent(target) !== "false") {
+ e.preventDefault();
+ editor.selection.select(target);
+ editor.nodeChanged();
+ }
+
+ if (target.nodeName == 'A' && dom.hasClass(target, 'mce-item-anchor')) {
+ e.preventDefault();
+ selection.select(target);
+ }
+ });
+ };
+
+ /**
+ * Fixes a Gecko bug where the style attribute gets added to the wrong element when deleting between two block elements.
+ *
+ * Fixes do backspace/delete on this:
+ *
bla[ck
r]ed
+ *
+ * Would become:
+ *
bla|ed
+ *
+ * Instead of:
+ *
bla|ed
+ */
+ var removeStylesWhenDeletingAcrossBlockElements = function () {
+ var getAttributeApplyFunction = function () {
+ var template = dom.getAttribs(selection.getStart().cloneNode(false));
+
+ return function () {
+ var target = selection.getStart();
+
+ if (target !== editor.getBody()) {
+ dom.setAttrib(target, "style", null);
+
+ each(template, function (attr) {
+ target.setAttributeNode(attr.cloneNode(true));
+ });
+ }
+ };
+ };
+
+ var isSelectionAcrossElements = function () {
+ return !selection.isCollapsed() &&
+ dom.getParent(selection.getStart(), dom.isBlock) != dom.getParent(selection.getEnd(), dom.isBlock);
+ };
+
+ editor.on('keypress', function (e) {
+ var applyAttributes;
+
+ if (!isDefaultPrevented(e) && (e.keyCode == 8 || e.keyCode == 46) && isSelectionAcrossElements()) {
+ applyAttributes = getAttributeApplyFunction();
+ editor.getDoc().execCommand('delete', false, null);
+ applyAttributes();
+ e.preventDefault();
+ return false;
+ }
+ });
+
+ dom.bind(editor.getDoc(), 'cut', function (e) {
+ var applyAttributes;
+
+ if (!isDefaultPrevented(e) && isSelectionAcrossElements()) {
+ applyAttributes = getAttributeApplyFunction();
+
+ Delay.setEditorTimeout(editor, function () {
+ applyAttributes();
+ });
+ }
+ });
+ };
+
+ /**
+ * Backspacing into a table behaves differently depending upon browser type.
+ * Therefore, disable Backspace when cursor immediately follows a table.
+ */
+ var disableBackspaceIntoATable = function () {
+ editor.on('keydown', function (e) {
+ if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
+ if (selection.isCollapsed() && selection.getRng(true).startOffset === 0) {
+ var previousSibling = selection.getNode().previousSibling;
+ if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === "table") {
+ e.preventDefault();
+ return false;
+ }
+ }
+ }
+ });
+ };
+
+ /**
+ * Removes a blockquote when backspace is pressed at the beginning of it.
+ *
+ * For example:
+ *
|x
+ *
+ * Becomes:
+ *
|x
+ */
+ var removeBlockQuoteOnBackSpace = function () {
+ // Add block quote deletion handler
+ editor.on('keydown', function (e) {
+ var rng, container, offset, root, parent;
+
+ if (isDefaultPrevented(e) || e.keyCode != VK.BACKSPACE) {
+ return;
+ }
+
+ rng = selection.getRng();
+ container = rng.startContainer;
+ offset = rng.startOffset;
+ root = dom.getRoot();
+ parent = container;
+
+ if (!rng.collapsed || offset !== 0) {
+ return;
+ }
+
+ while (parent && parent.parentNode && parent.parentNode.firstChild == parent && parent.parentNode != root) {
+ parent = parent.parentNode;
+ }
+
+ // Is the cursor at the beginning of a blockquote?
+ if (parent.tagName === 'BLOCKQUOTE') {
+ // Remove the blockquote
+ editor.formatter.toggle('blockquote', null, parent);
+
+ // Move the caret to the beginning of container
+ rng = dom.createRng();
+ rng.setStart(container, 0);
+ rng.setEnd(container, 0);
+ selection.setRng(rng);
+ }
+ });
+ };
+
+ /**
+ * Sets various Gecko editing options on mouse down and before a execCommand to disable inline table editing that is broken etc.
+ */
+ var setGeckoEditingOptions = function () {
+ var setOpts = function () {
+ refreshContentEditable();
+
+ setEditorCommandState("StyleWithCSS", false);
+ setEditorCommandState("enableInlineTableEditing", false);
+
+ if (!settings.object_resizing) {
+ setEditorCommandState("enableObjectResizing", false);
+ }
+ };
+
+ if (!settings.readonly) {
+ editor.on('BeforeExecCommand MouseDown', setOpts);
+ }
+ };
+
+ /**
+ * Fixes a gecko link bug, when a link is placed at the end of block elements there is
+ * no way to move the caret behind the link. This fix adds a bogus br element after the link.
+ *
+ * For example this:
+ *
+ */
+ var addBrAfterLastLinks = function () {
+ var fixLinks = function () {
+ each(dom.select('a'), function (node) {
+ var parentNode = node.parentNode, root = dom.getRoot();
+
+ if (parentNode.lastChild === node) {
+ while (parentNode && !dom.isBlock(parentNode)) {
+ if (parentNode.parentNode.lastChild !== parentNode || parentNode === root) {
+ return;
+ }
+
+ parentNode = parentNode.parentNode;
+ }
+
+ dom.add(parentNode, 'br', { 'data-mce-bogus': 1 });
+ }
+ });
+ };
+
+ editor.on('SetContent ExecCommand', function (e) {
+ if (e.type == "setcontent" || e.command === 'mceInsertLink') {
+ fixLinks();
+ }
+ });
+ };
+
+ /**
+ * WebKit will produce DIV elements here and there by default. But since TinyMCE uses paragraphs by
+ * default we want to change that behavior.
+ */
+ var setDefaultBlockType = function () {
+ if (settings.forced_root_block) {
+ editor.on('init', function () {
+ setEditorCommandState('DefaultParagraphSeparator', settings.forced_root_block);
+ });
+ }
+ };
+
+ /**
+ * Fixes selection issues where the caret can be placed between two inline elements like a|b
+ * this fix will lean the caret right into the closest inline element.
+ */
+ var normalizeSelection = function () {
+ // Normalize selection for example a|a becomes a|a
+ editor.on('keyup focusin mouseup', function (e) {
+ // no point to exclude Ctrl+A, since normalization will still run after Ctrl will be unpressed
+ // better exclude any key combinations with the modifiers to avoid double normalization
+ // (also addresses TINY-1130)
+ if (!VK.modifierPressed(e)) {
+ selection.normalize();
+ }
+ }, true);
+ };
+
+ /**
+ * Forces Gecko to render a broken image icon if it fails to load an image.
+ */
+ var showBrokenImageIcon = function () {
+ editor.contentStyles.push(
+ 'img:-moz-broken {' +
+ '-moz-force-broken-image-icon:1;' +
+ 'min-width:24px;' +
+ 'min-height:24px' +
+ '}'
+ );
+ };
+
+ /**
+ * iOS has a bug where it's impossible to type if the document has a touchstart event
+ * bound and the user touches the document while having the on screen keyboard visible.
+ *
+ * The touch event moves the focus to the parent document while having the caret inside the iframe
+ * this fix moves the focus back into the iframe document.
+ */
+ var restoreFocusOnKeyDown = function () {
+ if (!editor.inline) {
+ editor.on('keydown', function () {
+ if (document.activeElement == document.body) {
+ editor.getWin().focus();
+ }
+ });
+ }
+ };
+
+ /**
+ * IE 11 has an annoying issue where you can't move focus into the editor
+ * by clicking on the white area HTML element. We used to be able to fix this with
+ * the fixCaretSelectionOfDocumentElementOnIe fix. But since M$ removed the selection
+ * object it's not possible anymore. So we need to hack in a ungly CSS to force the
+ * body to be at least 150px. If the user clicks the HTML element out side this 150px region
+ * we simply move the focus into the first paragraph. Not ideal since you loose the
+ * positioning of the caret but goot enough for most cases.
+ */
+ var bodyHeight = function () {
+ if (!editor.inline) {
+ editor.contentStyles.push('body {min-height: 150px}');
+ editor.on('click', function (e) {
+ var rng;
+
+ if (e.target.nodeName == 'HTML') {
+ // Edge seems to only need focus if we set the range
+ // the caret will become invisible and moved out of the iframe!!
+ if (Env.ie > 11) {
+ editor.getBody().focus();
+ return;
+ }
+
+ // Need to store away non collapsed ranges since the focus call will mess that up see #7382
+ rng = editor.selection.getRng();
+ editor.getBody().focus();
+ editor.selection.setRng(rng);
+ editor.selection.normalize();
+ editor.nodeChanged();
+ }
+ });
+ }
+ };
+
+ /**
+ * Firefox on Mac OS will move the browser back to the previous page if you press CMD+Left arrow.
+ * You might then loose all your work so we need to block that behavior and replace it with our own.
+ */
+ var blockCmdArrowNavigation = function () {
+ if (Env.mac) {
+ editor.on('keydown', function (e) {
+ if (VK.metaKeyPressed(e) && !e.shiftKey && (e.keyCode == 37 || e.keyCode == 39)) {
+ e.preventDefault();
+ editor.selection.getSel().modify('move', e.keyCode == 37 ? 'backward' : 'forward', 'lineboundary');
+ }
+ });
+ }
+ };
+
+ /**
+ * Disables the autolinking in IE 9+ this is then re-enabled by the autolink plugin.
+ */
+ var disableAutoUrlDetect = function () {
+ setEditorCommandState("AutoUrlDetect", false);
+ };
+
+ /**
+ * iOS 7.1 introduced two new bugs:
+ * 1) It's possible to open links within a contentEditable area by clicking on them.
+ * 2) If you hold down the finger it will display the link/image touch callout menu.
+ */
+ var tapLinksAndImages = function () {
+ editor.on('click', function (e) {
+ var elm = e.target;
+
+ do {
+ if (elm.tagName === 'A') {
+ e.preventDefault();
+ return;
+ }
+ } while ((elm = elm.parentNode));
+ });
+
+ editor.contentStyles.push('.mce-content-body {-webkit-touch-callout: none}');
+ };
+
+ /**
+ * iOS Safari and possible other browsers have a bug where it won't fire
+ * a click event when a contentEditable is focused. This function fakes click events
+ * by using touchstart/touchend and measuring the time and distance travelled.
+ */
+ /*
+ function touchClickEvent() {
+ editor.on('touchstart', function(e) {
+ var elm, time, startTouch, changedTouches;
+
+ elm = e.target;
+ time = new Date().getTime();
+ changedTouches = e.changedTouches;
+
+ if (!changedTouches || changedTouches.length > 1) {
+ return;
+ }
+
+ startTouch = changedTouches[0];
+
+ editor.once('touchend', function(e) {
+ var endTouch = e.changedTouches[0], args;
+
+ if (new Date().getTime() - time > 500) {
+ return;
+ }
+
+ if (Math.abs(startTouch.clientX - endTouch.clientX) > 5) {
+ return;
+ }
+
+ if (Math.abs(startTouch.clientY - endTouch.clientY) > 5) {
+ return;
+ }
+
+ args = {
+ target: elm
+ };
+
+ each('pageX pageY clientX clientY screenX screenY'.split(' '), function(key) {
+ args[key] = endTouch[key];
+ });
+
+ args = editor.fire('click', args);
+
+ if (!args.isDefaultPrevented()) {
+ // iOS WebKit can't place the caret properly once
+ // you bind touch events so we need to do this manually
+ // TODO: Expand to the closest word? Touble tap still works.
+ editor.selection.placeCaretAt(endTouch.clientX, endTouch.clientY);
+ editor.nodeChanged();
+ }
+ });
+ });
+ }
+ */
+
+ /**
+ * WebKit has a bug where it will allow forms to be submitted if they are inside a contentEditable element.
+ * For example this:
+ */
+ var blockFormSubmitInsideEditor = function () {
+ editor.on('init', function () {
+ editor.dom.bind(editor.getBody(), 'submit', function (e) {
+ e.preventDefault();
+ });
+ });
+ };
+
+ /**
+ * Sometimes WebKit/Blink generates BR elements with the Apple-interchange-newline class.
+ *
+ * Scenario:
+ * 1) Create a table 2x2.
+ * 2) Select and copy cells A2-B2.
+ * 3) Paste and it will add BR element to table cell.
+ */
+ var removeAppleInterchangeBrs = function () {
+ parser.addNodeFilter('br', function (nodes) {
+ var i = nodes.length;
+
+ while (i--) {
+ if (nodes[i].attr('class') == 'Apple-interchange-newline') {
+ nodes[i].remove();
+ }
+ }
+ });
+ };
+
+ /**
+ * IE cannot set custom contentType's on drag events, and also does not properly drag/drop between
+ * editors. This uses a special data:text/mce-internal URL to pass data when drag/drop between editors.
+ */
+ var ieInternalDragAndDrop = function () {
+ editor.on('dragstart', function (e) {
+ setMceInternalContent(e);
+ });
+
+ editor.on('drop', function (e) {
+ if (!isDefaultPrevented(e)) {
+ var internalContent = getMceInternalContent(e);
+
+ if (internalContent && internalContent.id != editor.id) {
+ e.preventDefault();
+
+ var rng = CaretRangeFromPoint.fromPoint(e.x, e.y, editor.getDoc());
+ selection.setRng(rng);
+ insertClipboardContents(internalContent.html, true);
+ }
+ }
+ });
+ };
+
+ var refreshContentEditable = function () {
+ // No-op since Mozilla seems to have fixed the caret repaint issues
+ };
+
+ var isHidden = function () {
+ var sel;
+
+ if (!isGecko || editor.removed) {
+ return 0;
+ }
+
+ // Weird, wheres that cursor selection?
+ sel = editor.selection.getSel();
+ return (!sel || !sel.rangeCount || sel.rangeCount === 0);
+ };
+
+ // All browsers
+ removeBlockQuoteOnBackSpace();
+ emptyEditorWhenDeleting();
+
+ // Windows phone will return a range like [body, 0] on mousedown so
+ // it will always normalize to the wrong location
+ if (!Env.windowsPhone) {
+ normalizeSelection();
+ }
+
+ // WebKit
+ if (isWebKit) {
+ inputMethodFocus();
+ selectControlElements();
+ setDefaultBlockType();
+ blockFormSubmitInsideEditor();
+ disableBackspaceIntoATable();
+ removeAppleInterchangeBrs();
+
+ //touchClickEvent();
+
+ // iOS
+ if (Env.iOS) {
+ restoreFocusOnKeyDown();
+ bodyHeight();
+ tapLinksAndImages();
+ } else {
+ selectAll();
+ }
+ }
+
+ if (Env.ie >= 11) {
+ bodyHeight();
+ disableBackspaceIntoATable();
+ }
+
+ if (Env.ie) {
+ selectAll();
+ disableAutoUrlDetect();
+ ieInternalDragAndDrop();
+ }
+
+ // Gecko
+ if (isGecko) {
+ removeHrOnBackspace();
+ focusBody();
+ removeStylesWhenDeletingAcrossBlockElements();
+ setGeckoEditingOptions();
+ addBrAfterLastLinks();
+ showBrokenImageIcon();
+ blockCmdArrowNavigation();
+ disableBackspaceIntoATable();
+ }
+
+ return {
+ refreshContentEditable: refreshContentEditable,
+ isHidden: isHidden
+ };
+ };
+ }
+);
+
+/**
+ * InitContentBody.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.init.InitContentBody',
+ [
+ 'ephox.sugar.api.dom.Insert',
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.properties.Attr',
+ 'global!document',
+ 'global!window',
+ 'tinymce.core.EditorUpload',
+ 'tinymce.core.ForceBlocks',
+ 'tinymce.core.NodeChange',
+ 'tinymce.core.SelectionOverrides',
+ 'tinymce.core.UndoManager',
+ 'tinymce.core.api.Formatter',
+ 'tinymce.core.api.dom.Serializer',
+ 'tinymce.core.caret.CaretContainerInput',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.dom.Selection',
+ 'tinymce.core.html.DomParser',
+ 'tinymce.core.html.Node',
+ 'tinymce.core.html.Schema',
+ 'tinymce.core.keyboard.KeyboardOverrides',
+ 'tinymce.core.util.Delay',
+ 'tinymce.core.util.Quirks',
+ 'tinymce.core.util.Tools'
+ ],
+ function (
+ Insert, Element, Attr, document, window, EditorUpload, ForceBlocks, NodeChange, SelectionOverrides, UndoManager, Formatter, Serializer, CaretContainerInput,
+ DOMUtils, Selection, DomParser, Node, Schema, KeyboardOverrides, Delay, Quirks, Tools
+ ) {
+ var DOM = DOMUtils.DOM;
+
+ var appendStyle = function (editor, text) {
+ var head = Element.fromDom(editor.getDoc().head);
+ var tag = Element.fromTag('style');
+ Attr.set(tag, 'type', 'text/css');
+ Insert.append(tag, Element.fromText(text));
+ Insert.append(head, tag);
+ };
+
+ var createParser = function (editor) {
+ var parser = new DomParser(editor.settings, editor.schema);
+
+ // Convert src and href into data-mce-src, data-mce-href and data-mce-style
+ parser.addAttributeFilter('src,href,style,tabindex', function (nodes, name) {
+ var i = nodes.length, node, dom = editor.dom, value, internalName;
+
+ while (i--) {
+ node = nodes[i];
+ value = node.attr(name);
+ internalName = 'data-mce-' + name;
+
+ // Add internal attribute if we need to we don't on a refresh of the document
+ if (!node.attributes.map[internalName]) {
+ // Don't duplicate these since they won't get modified by any browser
+ if (value.indexOf('data:') === 0 || value.indexOf('blob:') === 0) {
+ continue;
+ }
+
+ if (name === "style") {
+ value = dom.serializeStyle(dom.parseStyle(value), node.name);
+
+ if (!value.length) {
+ value = null;
+ }
+
+ node.attr(internalName, value);
+ node.attr(name, value);
+ } else if (name === "tabindex") {
+ node.attr(internalName, value);
+ node.attr(name, null);
+ } else {
+ node.attr(internalName, editor.convertURL(value, name, node.name));
+ }
+ }
+ }
+ });
+
+ // Keep scripts from executing
+ parser.addNodeFilter('script', function (nodes) {
+ var i = nodes.length, node, type;
+
+ while (i--) {
+ node = nodes[i];
+ type = node.attr('type') || 'no/type';
+ if (type.indexOf('mce-') !== 0) {
+ node.attr('type', 'mce-' + type);
+ }
+ }
+ });
+
+ parser.addNodeFilter('#cdata', function (nodes) {
+ var i = nodes.length, node;
+
+ while (i--) {
+ node = nodes[i];
+ node.type = 8;
+ node.name = '#comment';
+ node.value = '[CDATA[' + node.value + ']]';
+ }
+ });
+
+ parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function (nodes) {
+ var i = nodes.length, node, nonEmptyElements = editor.schema.getNonEmptyElements();
+
+ while (i--) {
+ node = nodes[i];
+
+ if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {
+ node.append(new Node('br', 1)).shortEnded = true;
+ }
+ }
+ });
+
+ return parser;
+ };
+
+ var autoFocus = function (editor) {
+ if (editor.settings.auto_focus) {
+ Delay.setEditorTimeout(editor, function () {
+ var focusEditor;
+
+ if (editor.settings.auto_focus === true) {
+ focusEditor = editor;
+ } else {
+ focusEditor = editor.editorManager.get(editor.settings.auto_focus);
+ }
+
+ if (!focusEditor.destroyed) {
+ focusEditor.focus();
+ }
+ }, 100);
+ }
+ };
+
+ var initEditor = function (editor) {
+ editor.bindPendingEventDelegates();
+ editor.initialized = true;
+ editor.fire('init');
+ editor.focus(true);
+ editor.nodeChanged({ initial: true });
+ editor.execCallback('init_instance_callback', editor);
+ autoFocus(editor);
+ };
+
+ var getStyleSheetLoader = function (editor) {
+ return editor.inline ? DOM.styleSheetLoader : editor.dom.styleSheetLoader;
+ };
+
+ var initContentBody = function (editor, skipWrite) {
+ var settings = editor.settings, targetElm = editor.getElement(), doc = editor.getDoc(), body, contentCssText;
+
+ // Restore visibility on target element
+ if (!settings.inline) {
+ editor.getElement().style.visibility = editor.orgVisibility;
+ }
+
+ // Setup iframe body
+ if (!skipWrite && !settings.content_editable) {
+ doc.open();
+ doc.write(editor.iframeHTML);
+ doc.close();
+ }
+
+ if (settings.content_editable) {
+ editor.on('remove', function () {
+ var bodyEl = this.getBody();
+
+ DOM.removeClass(bodyEl, 'mce-content-body');
+ DOM.removeClass(bodyEl, 'mce-edit-focus');
+ DOM.setAttrib(bodyEl, 'contentEditable', null);
+ });
+
+ DOM.addClass(targetElm, 'mce-content-body');
+ editor.contentDocument = doc = settings.content_document || document;
+ editor.contentWindow = settings.content_window || window;
+ editor.bodyElement = targetElm;
+
+ // Prevent leak in IE
+ settings.content_document = settings.content_window = null;
+
+ // TODO: Fix this
+ settings.root_name = targetElm.nodeName.toLowerCase();
+ }
+
+ // It will not steal focus while setting contentEditable
+ body = editor.getBody();
+ body.disabled = true;
+ editor.readonly = settings.readonly;
+
+ if (!editor.readonly) {
+ if (editor.inline && DOM.getStyle(body, 'position', true) === 'static') {
+ body.style.position = 'relative';
+ }
+
+ body.contentEditable = editor.getParam('content_editable_state', true);
+ }
+
+ body.disabled = false;
+
+ editor.editorUpload = new EditorUpload(editor);
+ editor.schema = new Schema(settings);
+ editor.dom = new DOMUtils(doc, {
+ keep_values: true,
+ url_converter: editor.convertURL,
+ url_converter_scope: editor,
+ hex_colors: settings.force_hex_style_colors,
+ class_filter: settings.class_filter,
+ update_styles: true,
+ root_element: editor.inline ? editor.getBody() : null,
+ collect: settings.content_editable,
+ schema: editor.schema,
+ onSetAttrib: function (e) {
+ editor.fire('SetAttrib', e);
+ }
+ });
+
+ editor.parser = createParser(editor);
+ editor.serializer = new Serializer(settings, editor);
+ editor.selection = new Selection(editor.dom, editor.getWin(), editor.serializer, editor);
+ editor.formatter = new Formatter(editor);
+ editor.undoManager = new UndoManager(editor);
+ editor._nodeChangeDispatcher = new NodeChange(editor);
+ editor._selectionOverrides = new SelectionOverrides(editor);
+
+ CaretContainerInput.setup(editor);
+ KeyboardOverrides.setup(editor);
+ ForceBlocks.setup(editor);
+
+ editor.fire('PreInit');
+
+ if (!settings.browser_spellcheck && !settings.gecko_spellcheck) {
+ doc.body.spellcheck = false; // Gecko
+ DOM.setAttrib(body, "spellcheck", "false");
+ }
+
+ editor.quirks = new Quirks(editor);
+ editor.fire('PostRender');
+
+ if (settings.directionality) {
+ body.dir = settings.directionality;
+ }
+
+ if (settings.nowrap) {
+ body.style.whiteSpace = "nowrap";
+ }
+
+ if (settings.protect) {
+ editor.on('BeforeSetContent', function (e) {
+ Tools.each(settings.protect, function (pattern) {
+ e.content = e.content.replace(pattern, function (str) {
+ return '';
+ });
+ });
+ });
+ }
+
+ editor.on('SetContent', function () {
+ editor.addVisual(editor.getBody());
+ });
+
+ // Remove empty contents
+ if (settings.padd_empty_editor) {
+ editor.on('PostProcess', function (e) {
+ e.content = e.content.replace(/^(
]*>( | |\s|\u00a0| |)<\/p>[\r\n]*| [\r\n]*)$/, '');
+ });
+ }
+
+ editor.load({ initial: true, format: 'html' });
+ editor.startContent = editor.getContent({ format: 'raw' });
+
+ editor.on('compositionstart compositionend', function (e) {
+ editor.composing = e.type === 'compositionstart';
+ });
+
+ // Add editor specific CSS styles
+ if (editor.contentStyles.length > 0) {
+ contentCssText = '';
+
+ Tools.each(editor.contentStyles, function (style) {
+ contentCssText += style + "\r\n";
+ });
+
+ editor.dom.addStyle(contentCssText);
+ }
+
+ getStyleSheetLoader(editor).loadAll(
+ editor.contentCSS,
+ function (_) {
+ initEditor(editor);
+ },
+ function (urls) {
+ initEditor(editor);
+ }
+ );
+
+ // Append specified content CSS last
+ if (settings.content_style) {
+ appendStyle(editor, settings.content_style);
+ }
+ };
+
+ return {
+ initContentBody: initContentBody
+ };
+ }
+);
+
+/**
+ * InitIframe.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.init.InitIframe',
+ [
+ 'ephox.sugar.api.node.Element',
+ 'ephox.sugar.api.properties.Attr',
+ 'ephox.sugar.api.properties.Css',
+ 'global!document',
+ 'global!window',
+ 'tinymce.core.Env',
+ 'tinymce.core.api.Settings',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.init.InitContentBody',
+ 'tinymce.core.util.Uuid'
+ ],
+ function (Element, Attr, Css, document, window, Env, Settings, DOMUtils, InitContentBody, Uuid) {
+ var DOM = DOMUtils.DOM;
+
+ var relaxDomain = function (editor, ifr) {
+ // Domain relaxing is required since the user has messed around with document.domain
+ // This only applies to IE 11 other browsers including Edge seems to handle document.domain
+ if (document.domain !== window.location.hostname && Env.ie && Env.ie < 12) {
+ var bodyUuid = Uuid.uuid('mce');
+
+ editor[bodyUuid] = function () {
+ InitContentBody.initContentBody(editor);
+ };
+
+ /*eslint no-script-url:0 */
+ var domainRelaxUrl = 'javascript:(function(){' +
+ 'document.open();document.domain="' + document.domain + '";' +
+ 'var ed = window.parent.tinymce.get("' + editor.id + '");document.write(ed.iframeHTML);' +
+ 'document.close();ed.' + bodyUuid + '(true);})()';
+
+ DOM.setAttrib(ifr, 'src', domainRelaxUrl);
+ return true;
+ }
+
+ return false;
+ };
+
+ var normalizeHeight = function (height) {
+ var normalizedHeight = typeof height === 'number' ? height + 'px' : height;
+ return normalizedHeight ? normalizedHeight : '';
+ };
+
+ var createIframeElement = function (id, title, height, customAttrs) {
+ var iframe = Element.fromTag('iframe');
+
+ Attr.setAll(iframe, customAttrs);
+
+ Attr.setAll(iframe, {
+ id: id + '_ifr',
+ frameBorder: '0',
+ allowTransparency: 'true',
+ title: title
+ });
+
+ Css.setAll(iframe, {
+ width: '100%',
+ height: normalizeHeight(height),
+ display: 'block' // Important for Gecko to render the iframe correctly
+ });
+
+ return iframe;
+ };
+
+ var getIframeHtml = function (editor) {
+ var bodyId, bodyClass, iframeHTML;
+
+ iframeHTML = Settings.getDocType(editor) + '
';
+
+ // We only need to override paths if we have to
+ // IE has a bug where it remove site absolute urls to relative ones if this is specified
+ if (Settings.getDocumentBaseUrl(editor) !== editor.documentBaseUrl) {
+ iframeHTML += '';
+ }
+
+ iframeHTML += '';
+
+ bodyId = Settings.getBodyId(editor);
+ bodyClass = Settings.getBodyClass(editor);
+
+ if (Settings.getContentSecurityPolicy(editor)) {
+ iframeHTML += '';
+ }
+
+ iframeHTML += ' ';
+
+ return iframeHTML;
+ };
+
+ var createIframe = function (editor, o) {
+ var title = editor.editorManager.translate(
+ "Rich Text Area. Press ALT-F9 for menu. " +
+ "Press ALT-F10 for toolbar. Press ALT-0 for help"
+ );
+
+ var ifr = createIframeElement(editor.id, title, o.height, Settings.getIframeAttrs(editor)).dom();
+
+ ifr.onload = function () {
+ ifr.onload = null;
+ editor.fire("load");
+ };
+
+ var isDomainRelaxed = relaxDomain(editor, ifr);
+
+ editor.contentAreaContainer = o.iframeContainer;
+ editor.iframeElement = ifr;
+ editor.iframeHTML = getIframeHtml(editor);
+
+ DOM.add(o.iframeContainer, ifr);
+
+ return isDomainRelaxed;
+ };
+
+ var init = function (editor, boxInfo) {
+ var isDomainRelaxed = createIframe(editor, boxInfo);
+
+ if (boxInfo.editorContainer) {
+ DOM.get(boxInfo.editorContainer).style.display = editor.orgDisplay;
+ editor.hidden = DOM.isHidden(boxInfo.editorContainer);
+ }
+
+ editor.getElement().style.display = 'none';
+ DOM.setAttrib(editor.id, 'aria-hidden', true);
+
+ if (!isDomainRelaxed) {
+ InitContentBody.initContentBody(editor);
+ }
+ };
+
+ return {
+ init: init
+ };
+ }
+);
+
+/**
+ * Init.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.init.Init',
+ [
+ 'ephox.katamari.api.Type',
+ 'global!document',
+ 'global!window',
+ 'tinymce.core.PluginManager',
+ 'tinymce.core.ThemeManager',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.init.InitContentBody',
+ 'tinymce.core.init.InitIframe',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Type, document, window, PluginManager, ThemeManager, DOMUtils, InitContentBody, InitIframe, Tools) {
+ var DOM = DOMUtils.DOM;
+
+ var initPlugin = function (editor, initializedPlugins, plugin) {
+ var Plugin = PluginManager.get(plugin), pluginUrl, pluginInstance;
+
+ pluginUrl = PluginManager.urls[plugin] || editor.documentBaseUrl.replace(/\/$/, '');
+ plugin = Tools.trim(plugin);
+ if (Plugin && Tools.inArray(initializedPlugins, plugin) === -1) {
+ Tools.each(PluginManager.dependencies(plugin), function (dep) {
+ initPlugin(editor, initializedPlugins, dep);
+ });
+
+ if (editor.plugins[plugin]) {
+ return;
+ }
+
+ pluginInstance = new Plugin(editor, pluginUrl, editor.$);
+
+ editor.plugins[plugin] = pluginInstance;
+
+ if (pluginInstance.init) {
+ pluginInstance.init(editor, pluginUrl);
+ initializedPlugins.push(plugin);
+ }
+ }
+ };
+
+ var trimLegacyPrefix = function (name) {
+ // Themes and plugins can be prefixed with - to prevent them from being lazy loaded
+ return name.replace(/^\-/, '');
+ };
+
+ var initPlugins = function (editor) {
+ var initializedPlugins = [];
+
+ Tools.each(editor.settings.plugins.split(/[ ,]/), function (name) {
+ initPlugin(editor, initializedPlugins, trimLegacyPrefix(name));
+ });
+ };
+
+ var initTheme = function (editor) {
+ var Theme, theme = editor.settings.theme;
+
+ if (Type.isString(theme)) {
+ editor.settings.theme = trimLegacyPrefix(theme);
+
+ Theme = ThemeManager.get(theme);
+ editor.theme = new Theme(editor, ThemeManager.urls[theme]);
+
+ if (editor.theme.init) {
+ editor.theme.init(editor, ThemeManager.urls[theme] || editor.documentBaseUrl.replace(/\/$/, ''), editor.$);
+ }
+ } else {
+ // Theme set to false or null doesn't produce a theme api
+ editor.theme = {};
+ }
+ };
+
+ var renderFromLoadedTheme = function (editor) {
+ var w, h, minHeight, re, info, settings = editor.settings, elm = editor.getElement();
+
+ w = settings.width || DOM.getStyle(elm, 'width') || '100%';
+ h = settings.height || DOM.getStyle(elm, 'height') || elm.offsetHeight;
+ minHeight = settings.min_height || 100;
+ re = /^[0-9\.]+(|px)$/i;
+
+ if (re.test('' + w)) {
+ w = Math.max(parseInt(w, 10), 100);
+ }
+
+ if (re.test('' + h)) {
+ h = Math.max(parseInt(h, 10), minHeight);
+ }
+
+ // Render UI
+ info = editor.theme.renderUI({
+ targetNode: elm,
+ width: w,
+ height: h,
+ deltaWidth: settings.delta_width,
+ deltaHeight: settings.delta_height
+ });
+
+ // Resize editor
+ if (!settings.content_editable) {
+ h = (info.iframeHeight || h) + (typeof h === 'number' ? (info.deltaHeight || 0) : '');
+ if (h < minHeight) {
+ h = minHeight;
+ }
+ }
+
+ info.height = h;
+
+ return info;
+ };
+
+ var renderFromThemeFunc = function (editor) {
+ var info, elm = editor.getElement();
+
+ info = editor.settings.theme(editor, elm);
+
+ if (info.editorContainer.nodeType) {
+ info.editorContainer.id = info.editorContainer.id || editor.id + "_parent";
+ }
+
+ if (info.iframeContainer && info.iframeContainer.nodeType) {
+ info.iframeContainer.id = info.iframeContainer.id || editor.id + "_iframecontainer";
+ }
+
+ info.height = info.iframeHeight ? info.iframeHeight : elm.offsetHeight;
+
+ return info;
+ };
+
+ var createThemeFalseResult = function (element) {
+ return {
+ editorContainer: element,
+ iframeContainer: element
+ };
+ };
+
+ var renderThemeFalseIframe = function (targetElement) {
+ var iframeContainer = DOM.create('div');
+
+ DOM.insertAfter(iframeContainer, targetElement);
+
+ return createThemeFalseResult(iframeContainer);
+ };
+
+ var renderThemeFalse = function (editor) {
+ var targetElement = editor.getElement();
+ return editor.inline ? createThemeFalseResult(null) : renderThemeFalseIframe(targetElement);
+ };
+
+ var renderThemeUi = function (editor) {
+ var settings = editor.settings, elm = editor.getElement();
+
+ editor.orgDisplay = elm.style.display;
+
+ if (Type.isString(settings.theme)) {
+ return renderFromLoadedTheme(editor);
+ } else if (Type.isFunction(settings.theme)) {
+ return renderFromThemeFunc(editor);
+ } else {
+ return renderThemeFalse(editor);
+ }
+ };
+
+ var init = function (editor) {
+ var settings = editor.settings, elm = editor.getElement(), boxInfo;
+
+ editor.rtl = settings.rtl_ui || editor.editorManager.i18n.rtl;
+ editor.editorManager.i18n.setCode(settings.language);
+ settings.aria_label = settings.aria_label || DOM.getAttrib(elm, 'aria-label', editor.getLang('aria.rich_text_area'));
+
+ editor.fire('ScriptsLoaded');
+
+ initTheme(editor);
+ initPlugins(editor);
+ boxInfo = renderThemeUi(editor);
+ editor.editorContainer = boxInfo.editorContainer ? boxInfo.editorContainer : null;
+
+ // Load specified content CSS last
+ if (settings.content_css) {
+ Tools.each(Tools.explode(settings.content_css), function (u) {
+ editor.contentCSS.push(editor.documentBaseURI.toAbsolute(u));
+ });
+ }
+
+ // Content editable mode ends here
+ if (settings.content_editable) {
+ return InitContentBody.initContentBody(editor);
+ } else {
+ return InitIframe.init(editor, boxInfo);
+ }
+ };
+
+ return {
+ init: init
+ };
+ }
+);
+
+/**
+ * Render.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+define(
+ 'tinymce.core.init.Render',
+ [
+ 'ephox.katamari.api.Type',
+ 'global!window',
+ 'tinymce.core.api.NotificationManager',
+ 'tinymce.core.api.WindowManager',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.dom.EventUtils',
+ 'tinymce.core.dom.ScriptLoader',
+ 'tinymce.core.Env',
+ 'tinymce.core.ErrorReporter',
+ 'tinymce.core.init.Init',
+ 'tinymce.core.PluginManager',
+ 'tinymce.core.ThemeManager',
+ 'tinymce.core.util.Tools'
+ ],
+ function (Type, window, NotificationManager, WindowManager, DOMUtils, EventUtils, ScriptLoader, Env, ErrorReporter, Init, PluginManager, ThemeManager, Tools) {
+ var DOM = DOMUtils.DOM;
+
+ var hasSkipLoadPrefix = function (name) {
+ return name.charAt(0) === '-';
+ };
+
+ var loadLanguage = function (scriptLoader, editor) {
+ var settings = editor.settings;
+
+ if (settings.language && settings.language !== 'en' && !settings.language_url) {
+ settings.language_url = editor.editorManager.baseURL + '/langs/' + settings.language + '.js';
+ }
+
+ if (settings.language_url && !editor.editorManager.i18n.data[settings.language]) {
+ scriptLoader.add(settings.language_url);
+ }
+ };
+
+ var loadTheme = function (scriptLoader, editor, suffix, callback) {
+ var settings = editor.settings, theme = settings.theme;
+
+ if (Type.isString(theme)) {
+ if (!hasSkipLoadPrefix(theme) && !ThemeManager.urls.hasOwnProperty(theme)) {
+ var themeUrl = settings.theme_url;
+
+ if (themeUrl) {
+ ThemeManager.load(theme, editor.documentBaseURI.toAbsolute(themeUrl));
+ } else {
+ ThemeManager.load(theme, 'themes/' + theme + '/theme' + suffix + '.js');
+ }
+ }
+
+ scriptLoader.loadQueue(function () {
+ ThemeManager.waitFor(theme, callback);
+ });
+ } else {
+ callback();
+ }
+ };
+
+ var loadPlugins = function (settings, suffix) {
+ if (Tools.isArray(settings.plugins)) {
+ settings.plugins = settings.plugins.join(' ');
+ }
+
+ Tools.each(settings.external_plugins, function (url, name) {
+ PluginManager.load(name, url);
+ settings.plugins += ' ' + name;
+ });
+
+ Tools.each(settings.plugins.split(/[ ,]/), function (plugin) {
+ plugin = Tools.trim(plugin);
+
+ if (plugin && !PluginManager.urls[plugin]) {
+ if (hasSkipLoadPrefix(plugin)) {
+ plugin = plugin.substr(1, plugin.length);
+
+ var dependencies = PluginManager.dependencies(plugin);
+
+ Tools.each(dependencies, function (dep) {
+ var defaultSettings = {
+ prefix: 'plugins/',
+ resource: dep,
+ suffix: '/plugin' + suffix + '.js'
+ };
+
+ dep = PluginManager.createUrl(defaultSettings, dep);
+ PluginManager.load(dep.resource, dep);
+ });
+ } else {
+ PluginManager.load(plugin, {
+ prefix: 'plugins/',
+ resource: plugin,
+ suffix: '/plugin' + suffix + '.js'
+ });
+ }
+ }
+ });
+ };
+
+ var loadScripts = function (editor, suffix) {
+ var scriptLoader = ScriptLoader.ScriptLoader;
+
+ loadTheme(scriptLoader, editor, suffix, function () {
+ loadLanguage(scriptLoader, editor);
+ loadPlugins(editor.settings, suffix);
+
+ scriptLoader.loadQueue(function () {
+ if (!editor.removed) {
+ Init.init(editor);
+ }
+ }, editor, function (urls) {
+ ErrorReporter.pluginLoadError(editor, urls[0]);
+
+ if (!editor.removed) {
+ Init.init(editor);
+ }
+ });
+ });
+ };
+
+ var render = function (editor) {
+ var settings = editor.settings, id = editor.id;
+
+ var readyHandler = function () {
+ DOM.unbind(window, 'ready', readyHandler);
+ editor.render();
+ };
+
+ // Page is not loaded yet, wait for it
+ if (!EventUtils.Event.domLoaded) {
+ DOM.bind(window, 'ready', readyHandler);
+ return;
+ }
+
+ // Element not found, then skip initialization
+ if (!editor.getElement()) {
+ return;
+ }
+
+ // No editable support old iOS versions etc
+ if (!Env.contentEditable) {
+ return;
+ }
+
+ // Hide target element early to prevent content flashing
+ if (!settings.inline) {
+ editor.orgVisibility = editor.getElement().style.visibility;
+ editor.getElement().style.visibility = 'hidden';
+ } else {
+ editor.inline = true;
+ }
+
+ var form = editor.getElement().form || DOM.getParent(id, 'form');
+ if (form) {
+ editor.formElement = form;
+
+ // Add hidden input for non input elements inside form elements
+ if (settings.hidden_input && !/TEXTAREA|INPUT/i.test(editor.getElement().nodeName)) {
+ DOM.insertAfter(DOM.create('input', { type: 'hidden', name: id }), id);
+ editor.hasHiddenInput = true;
+ }
+
+ // Pass submit/reset from form to editor instance
+ editor.formEventDelegate = function (e) {
+ editor.fire(e.type, e);
+ };
+
+ DOM.bind(form, 'submit reset', editor.formEventDelegate);
+
+ // Reset contents in editor when the form is reset
+ editor.on('reset', function () {
+ editor.setContent(editor.startContent, { format: 'raw' });
+ });
+
+ // Check page uses id="submit" or name="submit" for it's submit button
+ if (settings.submit_patch && !form.submit.nodeType && !form.submit.length && !form._mceOldSubmit) {
+ form._mceOldSubmit = form.submit;
+ form.submit = function () {
+ editor.editorManager.triggerSave();
+ editor.setDirty(false);
+
+ return form._mceOldSubmit(form);
+ };
+ }
+ }
+
+ editor.windowManager = new WindowManager(editor);
+ editor.notificationManager = new NotificationManager(editor);
+
+ if (settings.encoding === 'xml') {
+ editor.on('GetContent', function (e) {
+ if (e.save) {
+ e.content = DOM.encode(e.content);
+ }
+ });
+ }
+
+ if (settings.add_form_submit_trigger) {
+ editor.on('submit', function () {
+ if (editor.initialized) {
+ editor.save();
+ }
+ });
+ }
+
+ if (settings.add_unload_trigger) {
+ editor._beforeUnload = function () {
+ if (editor.initialized && !editor.destroyed && !editor.isHidden()) {
+ editor.save({ format: 'raw', no_events: true, set_dirty: false });
+ }
+ };
+
+ editor.editorManager.on('BeforeUnload', editor._beforeUnload);
+ }
+
+ editor.editorManager.add(editor);
+ loadScripts(editor, editor.suffix);
+ };
+
+ return {
+ render: render
+ };
+ }
+);
+
+/**
+ * Sidebar.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This module handle sidebar instances for the editor.
+ *
+ * @class tinymce.ui.Sidebar
+ * @private
+ */
+define(
+ 'tinymce.core.ui.Sidebar',
+ [
+ ],
+ function (
+ ) {
+ var add = function (editor, name, settings) {
+ var sidebars = editor.sidebars ? editor.sidebars : [];
+ sidebars.push({ name: name, settings: settings });
+ editor.sidebars = sidebars;
+ };
+
+ return {
+ add: add
+ };
+ }
+);
+
+/**
+ * URI.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/**
+ * This class handles parsing, modification and serialization of URI/URL strings.
+ * @class tinymce.util.URI
+ */
+define(
+ 'tinymce.core.util.URI',
+ [
+ 'global!document',
+ 'tinymce.core.util.Tools'
+ ],
+ function (document, Tools) {
+ var each = Tools.each, trim = Tools.trim;
+ var queryParts = "source protocol authority userInfo user password host port relative path directory file query anchor".split(' ');
+ var DEFAULT_PORTS = {
+ 'ftp': 21,
+ 'http': 80,
+ 'https': 443,
+ 'mailto': 25
+ };
+
+ /**
+ * Constructs a new URI instance.
+ *
+ * @constructor
+ * @method URI
+ * @param {String} url URI string to parse.
+ * @param {Object} settings Optional settings object.
+ */
+ var URI = function (url, settings) {
+ var self = this, baseUri, baseUrl;
+
+ url = trim(url);
+ settings = self.settings = settings || {};
+ baseUri = settings.base_uri;
+
+ // Strange app protocol that isn't http/https or local anchor
+ // For example: mailto,skype,tel etc.
+ if (/^([\w\-]+):([^\/]{2})/i.test(url) || /^\s*#/.test(url)) {
+ self.source = url;
+ return;
+ }
+
+ var isProtocolRelative = url.indexOf('//') === 0;
+
+ // Absolute path with no host, fake host and protocol
+ if (url.indexOf('/') === 0 && !isProtocolRelative) {
+ url = (baseUri ? baseUri.protocol || 'http' : 'http') + '://mce_host' + url;
+ }
+
+ // Relative path http:// or protocol relative //path
+ if (!/^[\w\-]*:?\/\//.test(url)) {
+ baseUrl = settings.base_uri ? settings.base_uri.path : new URI(document.location.href).directory;
+ if (settings.base_uri.protocol === "") {
+ url = '//mce_host' + self.toAbsPath(baseUrl, url);
+ } else {
+ url = /([^#?]*)([#?]?.*)/.exec(url);
+ url = ((baseUri && baseUri.protocol) || 'http') + '://mce_host' + self.toAbsPath(baseUrl, url[1]) + url[2];
+ }
+ }
+
+ // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri)
+ url = url.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something
+
+ /*jshint maxlen: 255 */
+ /*eslint max-len: 0 */
+ url = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(url);
+
+ each(queryParts, function (v, i) {
+ var part = url[i];
+
+ // Zope 3 workaround, they use @@something
+ if (part) {
+ part = part.replace(/\(mce_at\)/g, '@@');
+ }
+
+ self[v] = part;
+ });
+
+ if (baseUri) {
+ if (!self.protocol) {
+ self.protocol = baseUri.protocol;
+ }
+
+ if (!self.userInfo) {
+ self.userInfo = baseUri.userInfo;
+ }
+
+ if (!self.port && self.host === 'mce_host') {
+ self.port = baseUri.port;
+ }
+
+ if (!self.host || self.host === 'mce_host') {
+ self.host = baseUri.host;
+ }
+
+ self.source = '';
+ }
+
+ if (isProtocolRelative) {
+ self.protocol = '';
+ }
+
+ //t.path = t.path || '/';
+ };
+
+ URI.prototype = {
+ /**
+ * Sets the internal path part of the URI.
+ *
+ * @method setPath
+ * @param {string} path Path string to set.
+ */
+ setPath: function (path) {
+ var self = this;
+
+ path = /^(.*?)\/?(\w+)?$/.exec(path);
+
+ // Update path parts
+ self.path = path[0];
+ self.directory = path[1];
+ self.file = path[2];
+
+ // Rebuild source
+ self.source = '';
+ self.getURI();
+ },
+
+ /**
+ * Converts the specified URI into a relative URI based on the current URI instance location.
+ *
+ * @method toRelative
+ * @param {String} uri URI to convert into a relative path/URI.
+ * @return {String} Relative URI from the point specified in the current URI instance.
+ * @example
+ * // Converts an absolute URL to an relative URL url will be somedir/somefile.htm
+ * var url = new tinymce.util.URI('http://www.site.com/dir/').toRelative('http://www.site.com/dir/somedir/somefile.htm');
+ */
+ toRelative: function (uri) {
+ var self = this, output;
+
+ if (uri === "./") {
+ return uri;
+ }
+
+ uri = new URI(uri, { base_uri: self });
+
+ // Not on same domain/port or protocol
+ if ((uri.host != 'mce_host' && self.host != uri.host && uri.host) || self.port != uri.port ||
+ (self.protocol != uri.protocol && uri.protocol !== "")) {
+ return uri.getURI();
+ }
+
+ var tu = self.getURI(), uu = uri.getURI();
+
+ // Allow usage of the base_uri when relative_urls = true
+ if (tu == uu || (tu.charAt(tu.length - 1) == "/" && tu.substr(0, tu.length - 1) == uu)) {
+ return tu;
+ }
+
+ output = self.toRelPath(self.path, uri.path);
+
+ // Add query
+ if (uri.query) {
+ output += '?' + uri.query;
+ }
+
+ // Add anchor
+ if (uri.anchor) {
+ output += '#' + uri.anchor;
+ }
+
+ return output;
+ },
+
+ /**
+ * Converts the specified URI into a absolute URI based on the current URI instance location.
+ *
+ * @method toAbsolute
+ * @param {String} uri URI to convert into a relative path/URI.
+ * @param {Boolean} noHost No host and protocol prefix.
+ * @return {String} Absolute URI from the point specified in the current URI instance.
+ * @example
+ * // Converts an relative URL to an absolute URL url will be http://www.site.com/dir/somedir/somefile.htm
+ * var url = new tinymce.util.URI('http://www.site.com/dir/').toAbsolute('somedir/somefile.htm');
+ */
+ toAbsolute: function (uri, noHost) {
+ uri = new URI(uri, { base_uri: this });
+
+ return uri.getURI(noHost && this.isSameOrigin(uri));
+ },
+
+ /**
+ * Determine whether the given URI has the same origin as this URI. Based on RFC-6454.
+ * Supports default ports for protocols listed in DEFAULT_PORTS. Unsupported protocols will fail safe: they
+ * won't match, if the port specifications differ.
+ *
+ * @method isSameOrigin
+ * @param {tinymce.util.URI} uri Uri instance to compare.
+ * @returns {Boolean} True if the origins are the same.
+ */
+ isSameOrigin: function (uri) {
+ if (this.host == uri.host && this.protocol == uri.protocol) {
+ if (this.port == uri.port) {
+ return true;
+ }
+
+ var defaultPort = DEFAULT_PORTS[this.protocol];
+ if (defaultPort && ((this.port || defaultPort) == (uri.port || defaultPort))) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ /**
+ * Converts a absolute path into a relative path.
+ *
+ * @method toRelPath
+ * @param {String} base Base point to convert the path from.
+ * @param {String} path Absolute path to convert into a relative path.
+ */
+ toRelPath: function (base, path) {
+ var items, breakPoint = 0, out = '', i, l;
+
+ // Split the paths
+ base = base.substring(0, base.lastIndexOf('/'));
+ base = base.split('/');
+ items = path.split('/');
+
+ if (base.length >= items.length) {
+ for (i = 0, l = base.length; i < l; i++) {
+ if (i >= items.length || base[i] != items[i]) {
+ breakPoint = i + 1;
+ break;
+ }
+ }
+ }
+
+ if (base.length < items.length) {
+ for (i = 0, l = items.length; i < l; i++) {
+ if (i >= base.length || base[i] != items[i]) {
+ breakPoint = i + 1;
+ break;
+ }
+ }
+ }
+
+ if (breakPoint === 1) {
+ return path;
+ }
+
+ for (i = 0, l = base.length - (breakPoint - 1); i < l; i++) {
+ out += "../";
+ }
+
+ for (i = breakPoint - 1, l = items.length; i < l; i++) {
+ if (i != breakPoint - 1) {
+ out += "/" + items[i];
+ } else {
+ out += items[i];
+ }
+ }
+
+ return out;
+ },
+
+ /**
+ * Converts a relative path into a absolute path.
+ *
+ * @method toAbsPath
+ * @param {String} base Base point to convert the path from.
+ * @param {String} path Relative path to convert into an absolute path.
+ */
+ toAbsPath: function (base, path) {
+ var i, nb = 0, o = [], tr, outPath;
+
+ // Split paths
+ tr = /\/$/.test(path) ? '/' : '';
+ base = base.split('/');
+ path = path.split('/');
+
+ // Remove empty chunks
+ each(base, function (k) {
+ if (k) {
+ o.push(k);
+ }
+ });
+
+ base = o;
+
+ // Merge relURLParts chunks
+ for (i = path.length - 1, o = []; i >= 0; i--) {
+ // Ignore empty or .
+ if (path[i].length === 0 || path[i] === ".") {
+ continue;
+ }
+
+ // Is parent
+ if (path[i] === '..') {
+ nb++;
+ continue;
+ }
+
+ // Move up
+ if (nb > 0) {
+ nb--;
+ continue;
+ }
+
+ o.push(path[i]);
+ }
+
+ i = base.length - nb;
+
+ // If /a/b/c or /
+ if (i <= 0) {
+ outPath = o.reverse().join('/');
+ } else {
+ outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/');
+ }
+
+ // Add front / if it's needed
+ if (outPath.indexOf('/') !== 0) {
+ outPath = '/' + outPath;
+ }
+
+ // Add traling / if it's needed
+ if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) {
+ outPath += tr;
+ }
+
+ return outPath;
+ },
+
+ /**
+ * Returns the full URI of the internal structure.
+ *
+ * @method getURI
+ * @param {Boolean} noProtoHost Optional no host and protocol part. Defaults to false.
+ */
+ getURI: function (noProtoHost) {
+ var s, self = this;
+
+ // Rebuild source
+ if (!self.source || noProtoHost) {
+ s = '';
+
+ if (!noProtoHost) {
+ if (self.protocol) {
+ s += self.protocol + '://';
+ } else {
+ s += '//';
+ }
+
+ if (self.userInfo) {
+ s += self.userInfo + '@';
+ }
+
+ if (self.host) {
+ s += self.host;
+ }
+
+ if (self.port) {
+ s += ':' + self.port;
+ }
+ }
+
+ if (self.path) {
+ s += self.path;
+ }
+
+ if (self.query) {
+ s += '?' + self.query;
+ }
+
+ if (self.anchor) {
+ s += '#' + self.anchor;
+ }
+
+ self.source = s;
+ }
+
+ return self.source;
+ }
+ };
+
+ URI.parseDataUri = function (uri) {
+ var type, matches;
+
+ uri = decodeURIComponent(uri).split(',');
+
+ matches = /data:([^;]+)/.exec(uri[0]);
+ if (matches) {
+ type = matches[1];
+ }
+
+ return {
+ type: type,
+ data: uri[1]
+ };
+ };
+
+ URI.getDocumentBaseUrl = function (loc) {
+ var baseUrl;
+
+ // Pass applewebdata:// and other non web protocols though
+ if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {
+ baseUrl = loc.href;
+ } else {
+ baseUrl = loc.protocol + '//' + loc.host + loc.pathname;
+ }
+
+ if (/^[^:]+:\/\/\/?[^\/]+\//.test(baseUrl)) {
+ baseUrl = baseUrl.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
+
+ if (!/[\/\\]$/.test(baseUrl)) {
+ baseUrl += '/';
+ }
+ }
+
+ return baseUrl;
+ };
+
+ return URI;
+ }
+);
+
+/**
+ * Editor.js
+ *
+ * Released under LGPL License.
+ * Copyright (c) 1999-2017 Ephox Corp. All rights reserved
+ *
+ * License: http://www.tinymce.com/license
+ * Contributing: http://www.tinymce.com/contributing
+ */
+
+/*jshint scripturl:true */
+
+/**
+ * Include the base event class documentation.
+ *
+ * @include ../../../../../tools/docs/tinymce.Event.js
+ */
+
+/**
+ * This class contains the core logic for a TinyMCE editor.
+ *
+ * @class tinymce.Editor
+ * @mixes tinymce.util.Observable
+ * @example
+ * // Add a class to all paragraphs in the editor.
+ * tinymce.activeEditor.dom.addClass(tinymce.activeEditor.dom.select('p'), 'someclass');
+ *
+ * // Gets the current editors selection as text
+ * tinymce.activeEditor.selection.getContent({format: 'text'});
+ *
+ * // Creates a new editor instance
+ * var ed = new tinymce.Editor('textareaid', {
+ * some_setting: 1
+ * }, tinymce.EditorManager);
+ *
+ * ed.render();
+ */
+define(
+ 'tinymce.core.Editor',
+ [
+ 'tinymce.core.AddOnManager',
+ 'tinymce.core.EditorCommands',
+ 'tinymce.core.EditorObservable',
+ 'tinymce.core.EditorSettings',
+ 'tinymce.core.Env',
+ 'tinymce.core.Mode',
+ 'tinymce.core.Shortcuts',
+ 'tinymce.core.dom.DOMUtils',
+ 'tinymce.core.dom.DomQuery',
+ 'tinymce.core.dom.TrimHtml',
+ 'tinymce.core.focus.EditorFocus',
+ 'tinymce.core.html.Serializer',
+ 'tinymce.core.init.Render',
+ 'tinymce.core.ui.Sidebar',
+ 'tinymce.core.util.Tools',
+ 'tinymce.core.util.URI',
+ 'tinymce.core.util.Uuid'
+ ],
+ function (
+ AddOnManager, EditorCommands, EditorObservable, EditorSettings, Env, Mode, Shortcuts, DOMUtils, DomQuery, TrimHtml, EditorFocus, Serializer, Render, Sidebar,
+ Tools, URI, Uuid
+ ) {
+ // Shorten these names
+ var DOM = DOMUtils.DOM;
+ var extend = Tools.extend, each = Tools.each;
+ var trim = Tools.trim, resolve = Tools.resolve;
+ var ie = Env.ie;
+
+ /**
+ * Include Editor API docs.
+ *
+ * @include ../../../../../tools/docs/tinymce.Editor.js
+ */
+
+ /**
+ * Constructs a editor instance by id.
+ *
+ * @constructor
+ * @method Editor
+ * @param {String} id Unique id for the editor.
+ * @param {Object} settings Settings for the editor.
+ * @param {tinymce.EditorManager} editorManager EditorManager instance.
+ */
+ var Editor = function (id, settings, editorManager) {
+ var self = this, documentBaseUrl, baseUri;
+
+ documentBaseUrl = self.documentBaseUrl = editorManager.documentBaseURL;
+ baseUri = editorManager.baseURI;
+
+ /**
+ * Name/value collection with editor settings.
+ *
+ * @property settings
+ * @type Object
+ * @example
+ * // Get the value of the theme setting
+ * tinymce.activeEditor.windowManager.alert("You are using the " + tinymce.activeEditor.settings.theme + " theme");
+ */
+ settings = EditorSettings.getEditorSettings(self, id, documentBaseUrl, editorManager.defaultSettings, settings);
+ self.settings = settings;
+
+ AddOnManager.language = settings.language || 'en';
+ AddOnManager.languageLoad = settings.language_load;
+ AddOnManager.baseURL = editorManager.baseURL;
+
+ /**
+ * Editor instance id, normally the same as the div/textarea that was replaced.
+ *
+ * @property id
+ * @type String
+ */
+ self.id = id;
+
+ /**
+ * State to force the editor to return false on a isDirty call.
+ *
+ * @property isNotDirty
+ * @type Boolean
+ * @deprecated Use editor.setDirty instead.
+ */
+ self.setDirty(false);
+
+ /**
+ * Name/Value object containing plugin instances.
+ *
+ * @property plugins
+ * @type Object
+ * @example
+ * // Execute a method inside a plugin directly
+ * tinymce.activeEditor.plugins.someplugin.someMethod();
+ */
+ self.plugins = {};
+
+ /**
+ * URI object to document configured for the TinyMCE instance.
+ *
+ * @property documentBaseURI
+ * @type tinymce.util.URI
+ * @example
+ * // Get relative URL from the location of document_base_url
+ * tinymce.activeEditor.documentBaseURI.toRelative('/somedir/somefile.htm');
+ *
+ * // Get absolute URL from the location of document_base_url
+ * tinymce.activeEditor.documentBaseURI.toAbsolute('somefile.htm');
+ */
+ self.documentBaseURI = new URI(settings.document_base_url, {
+ base_uri: baseUri
+ });
+
+ /**
+ * URI object to current document that holds the TinyMCE editor instance.
+ *
+ * @property baseURI
+ * @type tinymce.util.URI
+ * @example
+ * // Get relative URL from the location of the API
+ * tinymce.activeEditor.baseURI.toRelative('/somedir/somefile.htm');
+ *
+ * // Get absolute URL from the location of the API
+ * tinymce.activeEditor.baseURI.toAbsolute('somefile.htm');
+ */
+ self.baseURI = baseUri;
+
+ /**
+ * Array with CSS files to load into the iframe.
+ *
+ * @property contentCSS
+ * @type Array
+ */
+ self.contentCSS = [];
+
+ /**
+ * Array of CSS styles to add to head of document when the editor loads.
+ *
+ * @property contentStyles
+ * @type Array
+ */
+ self.contentStyles = [];
+
+ self.shortcuts = new Shortcuts(self);
+ self.loadedCSS = {};
+ self.editorCommands = new EditorCommands(self);
+ self.suffix = editorManager.suffix;
+ self.editorManager = editorManager;
+ self.inline = settings.inline;
+ self.buttons = {};
+ self.menuItems = {};
+
+ if (settings.cache_suffix) {
+ Env.cacheSuffix = settings.cache_suffix.replace(/^[\?\&]+/, '');
+ }
+
+ if (settings.override_viewport === false) {
+ Env.overrideViewPort = false;
+ }
+
+ // Call setup
+ editorManager.fire('SetupEditor', self);
+ self.execCallback('setup', self);
+
+ /**
+ * Dom query instance with default scope to the editor document and default element is the body of the editor.
+ *
+ * @property $
+ * @type tinymce.dom.DomQuery
+ * @example
+ * tinymce.activeEditor.$('p').css('color', 'red');
+ * tinymce.activeEditor.$().append('
new
');
+ */
+ self.$ = DomQuery.overrideDefaults(function () {
+ return {
+ context: self.inline ? self.getBody() : self.getDoc(),
+ element: self.getBody()
+ };
+ });
+ };
+
+ Editor.prototype = {
+ /**
+ * Renders the editor/adds it to the page.
+ *
+ * @method render
+ */
+ render: function () {
+ Render.render(this);
+ },
+
+ /**
+ * Focuses/activates the editor. This will set this editor as the activeEditor in the tinymce collection
+ * it will also place DOM focus inside the editor.
+ *
+ * @method focus
+ * @param {Boolean} skipFocus Skip DOM focus. Just set is as the active editor.
+ */
+ focus: function (skipFocus) {
+ EditorFocus.focus(this, skipFocus);
+ },
+
+ /**
+ * Executes a legacy callback. This method is useful to call old 2.x option callbacks.
+ * There new event model is a better way to add callback so this method might be removed in the future.
+ *
+ * @method execCallback
+ * @param {String} name Name of the callback to execute.
+ * @return {Object} Return value passed from callback function.
+ */
+ execCallback: function (name) {
+ var self = this, callback = self.settings[name], scope;
+
+ if (!callback) {
+ return;
+ }
+
+ // Look through lookup
+ if (self.callbackLookup && (scope = self.callbackLookup[name])) {
+ callback = scope.func;
+ scope = scope.scope;
+ }
+
+ if (typeof callback === 'string') {
+ scope = callback.replace(/\.\w+$/, '');
+ scope = scope ? resolve(scope) : 0;
+ callback = resolve(callback);
+ self.callbackLookup = self.callbackLookup || {};
+ self.callbackLookup[name] = { func: callback, scope: scope };
+ }
+
+ return callback.apply(scope || self, Array.prototype.slice.call(arguments, 1));
+ },
+
+ /**
+ * Translates the specified string by replacing variables with language pack items it will also check if there is
+ * a key matching the input.
+ *
+ * @method translate
+ * @param {String} text String to translate by the language pack data.
+ * @return {String} Translated string.
+ */
+ translate: function (text) {
+ if (text && Tools.is(text, 'string')) {
+ var lang = this.settings.language || 'en', i18n = this.editorManager.i18n;
+
+ text = i18n.data[lang + '.' + text] || text.replace(/\{\#([^\}]+)\}/g, function (a, b) {
+ return i18n.data[lang + '.' + b] || '{#' + b + '}';
+ });
+ }
+
+ return this.editorManager.translate(text);
+ },
+
+ /**
+ * Returns a language pack item by name/key.
+ *
+ * @method getLang
+ * @param {String} name Name/key to get from the language pack.
+ * @param {String} defaultVal Optional default value to retrieve.
+ */
+ getLang: function (name, defaultVal) {
+ return (
+ this.editorManager.i18n.data[(this.settings.language || 'en') + '.' + name] ||
+ (defaultVal !== undefined ? defaultVal : '{#' + name + '}')
+ );
+ },
+
+ /**
+ * Returns a configuration parameter by name.
+ *
+ * @method getParam
+ * @param {String} name Configruation parameter to retrieve.
+ * @param {String} defaultVal Optional default value to return.
+ * @param {String} type Optional type parameter.
+ * @return {String} Configuration parameter value or default value.
+ * @example
+ * // Returns a specific config value from the currently active editor
+ * var someval = tinymce.activeEditor.getParam('myvalue');
+ *
+ * // Returns a specific config value from a specific editor instance by id
+ * var someval2 = tinymce.get('my_editor').getParam('myvalue');
+ */
+ getParam: function (name, defaultVal, type) {
+ var value = name in this.settings ? this.settings[name] : defaultVal, output;
+
+ if (type === 'hash') {
+ output = {};
+
+ if (typeof value === 'string') {
+ each(value.indexOf('=') > 0 ? value.split(/[;,](?![^=;,]*(?:[;,]|$))/) : value.split(','), function (value) {
+ value = value.split('=');
+
+ if (value.length > 1) {
+ output[trim(value[0])] = trim(value[1]);
+ } else {
+ output[trim(value[0])] = trim(value);
+ }
+ });
+ } else {
+ output = value;
+ }
+
+ return output;
+ }
+
+ return value;
+ },
+
+ /**
+ * Dispatches out a onNodeChange event to all observers. This method should be called when you
+ * need to update the UI states or element path etc.
+ *
+ * @method nodeChanged
+ * @param {Object} args Optional args to pass to NodeChange event handlers.
+ */
+ nodeChanged: function (args) {
+ this._nodeChangeDispatcher.nodeChanged(args);
+ },
+
+ /**
+ * Adds a button that later gets created by the theme in the editors toolbars.
+ *
+ * @method addButton
+ * @param {String} name Button name to add.
+ * @param {Object} settings Settings object with title, cmd etc.
+ * @example
+ * // Adds a custom button to the editor that inserts contents when clicked
+ * tinymce.init({
+ * ...
+ *
+ * toolbar: 'example'
+ *
+ * setup: function(ed) {
+ * ed.addButton('example', {
+ * title: 'My title',
+ * image: '../js/tinymce/plugins/example/img/example.gif',
+ * onclick: function() {
+ * ed.insertContent('Hello world!!');
+ * }
+ * });
+ * }
+ * });
+ */
+ addButton: function (name, settings) {
+ var self = this;
+
+ if (settings.cmd) {
+ settings.onclick = function () {
+ self.execCommand(settings.cmd);
+ };
+ }
+
+ if (settings.stateSelector && typeof settings.active === 'undefined') {
+ settings.active = false;
+ }
+
+ if (!settings.text && !settings.icon) {
+ settings.icon = name;
+ }
+
+ self.buttons = self.buttons;
+ settings.tooltip = settings.tooltip || settings.title;
+ self.buttons[name] = settings;
+ },
+
+ /**
+ * Adds a sidebar for the editor instance.
+ *
+ * @method addSidebar
+ * @param {String} name Sidebar name to add.
+ * @param {Object} settings Settings object with icon, onshow etc.
+ * @example
+ * // Adds a custom sidebar that when clicked logs the panel element
+ * tinymce.init({
+ * ...
+ * setup: function(ed) {
+ * ed.addSidebar('example', {
+ * tooltip: 'My sidebar',
+ * icon: 'my-side-bar',
+ * onshow: function(api) {
+ * console.log(api.element());
+ * }
+ * });
+ * }
+ * });
+ */
+ addSidebar: function (name, settings) {
+ return Sidebar.add(this, name, settings);
+ },
+
+ /**
+ * Adds a menu item to be used in the menus of the theme. There might be multiple instances
+ * of this menu item for example it might be used in the main menus of the theme but also in
+ * the context menu so make sure that it's self contained and supports multiple instances.
+ *
+ * @method addMenuItem
+ * @param {String} name Menu item name to add.
+ * @param {Object} settings Settings object with title, cmd etc.
+ * @example
+ * // Adds a custom menu item to the editor that inserts contents when clicked
+ * // The context option allows you to add the menu item to an existing default menu
+ * tinymce.init({
+ * ...
+ *
+ * setup: function(ed) {
+ * ed.addMenuItem('example', {
+ * text: 'My menu item',
+ * context: 'tools',
+ * onclick: function() {
+ * ed.insertContent('Hello world!!');
+ * }
+ * });
+ * }
+ * });
+ */
+ addMenuItem: function (name, settings) {
+ var self = this;
+
+ if (settings.cmd) {
+ settings.onclick = function () {
+ self.execCommand(settings.cmd);
+ };
+ }
+
+ self.menuItems = self.menuItems;
+ self.menuItems[name] = settings;
+ },
+
+ /**
+ * Adds a contextual toolbar to be rendered when the selector matches.
+ *
+ * @method addContextToolbar
+ * @param {function/string} predicate Predicate that needs to return true if provided strings get converted into CSS predicates.
+ * @param {String/Array} items String or array with items to add to the context toolbar.
+ */
+ addContextToolbar: function (predicate, items) {
+ var self = this, selector;
+
+ self.contextToolbars = self.contextToolbars || [];
+
+ // Convert selector to predicate
+ if (typeof predicate == "string") {
+ selector = predicate;
+ predicate = function (elm) {
+ return self.dom.is(elm, selector);
+ };
+ }
+
+ self.contextToolbars.push({
+ id: Uuid.uuid('mcet'),
+ predicate: predicate,
+ items: items
+ });
+ },
+
+ /**
+ * Adds a custom command to the editor, you can also override existing commands with this method.
+ * The command that you add can be executed with execCommand.
+ *
+ * @method addCommand
+ * @param {String} name Command name to add/override.
+ * @param {addCommandCallback} callback Function to execute when the command occurs.
+ * @param {Object} scope Optional scope to execute the function in.
+ * @example
+ * // Adds a custom command that later can be executed using execCommand
+ * tinymce.init({
+ * ...
+ *
+ * setup: function(ed) {
+ * // Register example command
+ * ed.addCommand('mycommand', function(ui, v) {
+ * ed.windowManager.alert('Hello world!! Selection: ' + ed.selection.getContent({format: 'text'}));
+ * });
+ * }
+ * });
+ */
+ addCommand: function (name, callback, scope) {
+ /**
+ * Callback function that gets called when a command is executed.
+ *
+ * @callback addCommandCallback
+ * @param {Boolean} ui Display UI state true/false.
+ * @param {Object} value Optional value for command.
+ * @return {Boolean} True/false state if the command was handled or not.
+ */
+ this.editorCommands.addCommand(name, callback, scope);
+ },
+
+ /**
+ * Adds a custom query state command to the editor, you can also override existing commands with this method.
+ * The command that you add can be executed with queryCommandState function.
+ *
+ * @method addQueryStateHandler
+ * @param {String} name Command name to add/override.
+ * @param {addQueryStateHandlerCallback} callback Function to execute when the command state retrieval occurs.
+ * @param {Object} scope Optional scope to execute the function in.
+ */
+ addQueryStateHandler: function (name, callback, scope) {
+ /**
+ * Callback function that gets called when a queryCommandState is executed.
+ *
+ * @callback addQueryStateHandlerCallback
+ * @return {Boolean} True/false state if the command is enabled or not like is it bold.
+ */
+ this.editorCommands.addQueryStateHandler(name, callback, scope);
+ },
+
+ /**
+ * Adds a custom query value command to the editor, you can also override existing commands with this method.
+ * The command that you add can be executed with queryCommandValue function.
+ *
+ * @method addQueryValueHandler
+ * @param {String} name Command name to add/override.
+ * @param {addQueryValueHandlerCallback} callback Function to execute when the command value retrieval occurs.
+ * @param {Object} scope Optional scope to execute the function in.
+ */
+ addQueryValueHandler: function (name, callback, scope) {
+ /**
+ * Callback function that gets called when a queryCommandValue is executed.
+ *
+ * @callback addQueryValueHandlerCallback
+ * @return {Object} Value of the command or undefined.
+ */
+ this.editorCommands.addQueryValueHandler(name, callback, scope);
+ },
+
+ /**
+ * Adds a keyboard shortcut for some command or function.
+ *
+ * @method addShortcut
+ * @param {String} pattern Shortcut pattern. Like for example: ctrl+alt+o.
+ * @param {String} desc Text description for the command.
+ * @param {String/Function} cmdFunc Command name string or function to execute when the key is pressed.
+ * @param {Object} sc Optional scope to execute the function in.
+ * @return {Boolean} true/false state if the shortcut was added or not.
+ */
+ addShortcut: function (pattern, desc, cmdFunc, scope) {
+ this.shortcuts.add(pattern, desc, cmdFunc, scope);
+ },
+
+ /**
+ * Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or
+ * they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org.
+ * This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these
+ * return true it will handle the command as a internal browser command.
+ *
+ * @method execCommand
+ * @param {String} cmd Command name to execute, for example mceLink or Bold.
+ * @param {Boolean} ui True/false state if a UI (dialog) should be presented or not.
+ * @param {mixed} value Optional command value, this can be anything.
+ * @param {Object} args Optional arguments object.
+ */
+ execCommand: function (cmd, ui, value, args) {
+ return this.editorCommands.execCommand(cmd, ui, value, args);
+ },
+
+ /**
+ * Returns a command specific state, for example if bold is enabled or not.
+ *
+ * @method queryCommandState
+ * @param {string} cmd Command to query state from.
+ * @return {Boolean} Command specific state, for example if bold is enabled or not.
+ */
+ queryCommandState: function (cmd) {
+ return this.editorCommands.queryCommandState(cmd);
+ },
+
+ /**
+ * Returns a command specific value, for example the current font size.
+ *
+ * @method queryCommandValue
+ * @param {string} cmd Command to query value from.
+ * @return {Object} Command specific value, for example the current font size.
+ */
+ queryCommandValue: function (cmd) {
+ return this.editorCommands.queryCommandValue(cmd);
+ },
+
+ /**
+ * Returns true/false if the command is supported or not.
+ *
+ * @method queryCommandSupported
+ * @param {String} cmd Command that we check support for.
+ * @return {Boolean} true/false if the command is supported or not.
+ */
+ queryCommandSupported: function (cmd) {
+ return this.editorCommands.queryCommandSupported(cmd);
+ },
+
+ /**
+ * Shows the editor and hides any textarea/div that the editor is supposed to replace.
+ *
+ * @method show
+ */
+ show: function () {
+ var self = this;
+
+ if (self.hidden) {
+ self.hidden = false;
+
+ if (self.inline) {
+ self.getBody().contentEditable = true;
+ } else {
+ DOM.show(self.getContainer());
+ DOM.hide(self.id);
+ }
+
+ self.load();
+ self.fire('show');
+ }
+ },
+
+ /**
+ * Hides the editor and shows any textarea/div that the editor is supposed to replace.
+ *
+ * @method hide
+ */
+ hide: function () {
+ var self = this, doc = self.getDoc();
+
+ if (!self.hidden) {
+ // Fixed bug where IE has a blinking cursor left from the editor
+ if (ie && doc && !self.inline) {
+ doc.execCommand('SelectAll');
+ }
+
+ // We must save before we hide so Safari doesn't crash
+ self.save();
+
+ if (self.inline) {
+ self.getBody().contentEditable = false;
+
+ // Make sure the editor gets blurred
+ if (self == self.editorManager.focusedEditor) {
+ self.editorManager.focusedEditor = null;
+ }
+ } else {
+ DOM.hide(self.getContainer());
+ DOM.setStyle(self.id, 'display', self.orgDisplay);
+ }
+
+ self.hidden = true;
+ self.fire('hide');
+ }
+ },
+
+ /**
+ * Returns true/false if the editor is hidden or not.
+ *
+ * @method isHidden
+ * @return {Boolean} True/false if the editor is hidden or not.
+ */
+ isHidden: function () {
+ return !!this.hidden;
+ },
+
+ /**
+ * Sets the progress state, this will display a throbber/progess for the editor.
+ * This is ideal for asynchronous operations like an AJAX save call.
+ *
+ * @method setProgressState
+ * @param {Boolean} state Boolean state if the progress should be shown or hidden.
+ * @param {Number} time Optional time to wait before the progress gets shown.
+ * @return {Boolean} Same as the input state.
+ * @example
+ * // Show progress for the active editor
+ * tinymce.activeEditor.setProgressState(true);
+ *
+ * // Hide progress for the active editor
+ * tinymce.activeEditor.setProgressState(false);
+ *
+ * // Show progress after 3 seconds
+ * tinymce.activeEditor.setProgressState(true, 3000);
+ */
+ setProgressState: function (state, time) {
+ this.fire('ProgressState', { state: state, time: time });
+ },
+
+ /**
+ * Loads contents from the textarea or div element that got converted into an editor instance.
+ * This method will move the contents from that textarea or div into the editor by using setContent
+ * so all events etc that method has will get dispatched as well.
+ *
+ * @method load
+ * @param {Object} args Optional content object, this gets passed around through the whole load process.
+ * @return {String} HTML string that got set into the editor.
+ */
+ load: function (args) {
+ var self = this, elm = self.getElement(), html;
+
+ if (self.removed) {
+ return '';
+ }
+
+ if (elm) {
+ args = args || {};
+ args.load = true;
+
+ html = self.setContent(elm.value !== undefined ? elm.value : elm.innerHTML, args);
+ args.element = elm;
+
+ if (!args.no_events) {
+ self.fire('LoadContent', args);
+ }
+
+ args.element = elm = null;
+
+ return html;
+ }
+ },
+
+ /**
+ * Saves the contents from a editor out to the textarea or div element that got converted into an editor instance.
+ * This method will move the HTML contents from the editor into that textarea or div by getContent
+ * so all events etc that method has will get dispatched as well.
+ *
+ * @method save
+ * @param {Object} args Optional content object, this gets passed around through the whole save process.
+ * @return {String} HTML string that got set into the textarea/div.
+ */
+ save: function (args) {
+ var self = this, elm = self.getElement(), html, form;
+
+ if (!elm || !self.initialized || self.removed) {
+ return;
+ }
+
+ args = args || {};
+ args.save = true;
+
+ args.element = elm;
+ html = args.content = self.getContent(args);
+
+ if (!args.no_events) {
+ self.fire('SaveContent', args);
+ }
+
+ // Always run this internal event
+ if (args.format == 'raw') {
+ self.fire('RawSaveContent', args);
+ }
+
+ html = args.content;
+
+ if (!/TEXTAREA|INPUT/i.test(elm.nodeName)) {
+ // Update DIV element when not in inline mode
+ if (!self.inline) {
+ elm.innerHTML = html;
+ }
+
+ // Update hidden form element
+ if ((form = DOM.getParent(self.id, 'form'))) {
+ each(form.elements, function (elm) {
+ if (elm.name == self.id) {
+ elm.value = html;
+ return false;
+ }
+ });
+ }
+ } else {
+ elm.value = html;
+ }
+
+ args.element = elm = null;
+
+ if (args.set_dirty !== false) {
+ self.setDirty(false);
+ }
+
+ return html;
+ },
+
+ /**
+ * Sets the specified content to the editor instance, this will cleanup the content before it gets set using
+ * the different cleanup rules options.
+ *
+ * @method setContent
+ * @param {String} content Content to set to editor, normally HTML contents but can be other formats as well.
+ * @param {Object} args Optional content object, this gets passed around through the whole set process.
+ * @return {String} HTML string that got set into the editor.
+ * @example
+ * // Sets the HTML contents of the activeEditor editor
+ * tinymce.activeEditor.setContent('some html');
+ *
+ * // Sets the raw contents of the activeEditor editor
+ * tinymce.activeEditor.setContent('some html', {format: 'raw'});
+ *
+ * // Sets the content of a specific editor (my_editor in this example)
+ * tinymce.get('my_editor').setContent(data);
+ *
+ * // Sets the bbcode contents of the activeEditor editor if the bbcode plugin was added
+ * tinymce.activeEditor.setContent('[b]some[/b] html', {format: 'bbcode'});
+ */
+ setContent: function (content, args) {
+ var self = this, body = self.getBody(), forcedRootBlockName, padd;
+
+ // Setup args object
+ args = args || {};
+ args.format = args.format || 'html';
+ args.set = true;
+ args.content = content;
+
+ // Do preprocessing
+ if (!args.no_events) {
+ self.fire('BeforeSetContent', args);
+ }
+
+ content = args.content;
+
+ // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content
+ // It will also be impossible to place the caret in the editor unless there is a BR element present
+ if (content.length === 0 || /^\s+$/.test(content)) {
+ padd = ie && ie < 11 ? '' : ' ';
+
+ // Todo: There is a lot more root elements that need special padding
+ // so separate this and add all of them at some point.
+ if (body.nodeName == 'TABLE') {
+ content = '