From da33b526cb22e0558b1965c7d55eab34c80062db Mon Sep 17 00:00:00 2001
From: manastalukdar <manastalukdar@users.noreply.github.com>
Date: Thu, 19 Aug 2021 13:19:16 +0000
Subject: [PATCH] GitHub CI Updates [ci skip]
 11b326440f51d9d1c1c67837dda4fb98be43e627

---
 .nojekyll                                     |     0
 css/styles.css                                |     0
 index.html                                    |   106 +
 js/app.js                                     |   700 +
 js/app.min.js                                 |     1 +
 .../css/bootstrap-multiselect.css             |     1 +
 ...ootstrap-multiselect-collapsible-groups.js |    92 +
 .../js/bootstrap-multiselect.js               |  1416 ++
 .../css/footable.core.bootstrap.min.css       |     1 +
 .../css/footable.core.standalone.min.css      |     1 +
 .../css/footable.editing.min.css              |     1 +
 .../css/footable.filtering.min.css            |     1 +
 .../css/footable.paging.min.css               |     1 +
 .../css/footable.sorting.min.css              |     1 +
 .../js/footable.core.min.js                   |     9 +
 .../js/footable.editing.min.js                |     8 +
 .../js/footable.export.min.js                 |     8 +
 .../js/footable.filtering.min.js              |     8 +
 .../js/footable.paging.min.js                 |     8 +
 .../js/footable.sorting.min.js                |     8 +
 .../js/footable.state.min.js                  |     8 +
 .../css/footable.standalone.min.css           |     1 +
 .../js/footable.min.js                        |    10 +
 js/third-party/momentjs/moment.js             |  4535 +++++
 .../selectize/selectize.default.css           |   394 +
 js/third-party/selectize/selectize.js         |  3829 ++++
 problems_list.json                            | 14546 ++++++++++++++++
 problems_list.md                              |   689 +
 28 files changed, 26383 insertions(+)
 create mode 100644 .nojekyll
 create mode 100644 css/styles.css
 create mode 100644 index.html
 create mode 100644 js/app.js
 create mode 100644 js/app.min.js
 create mode 100644 js/third-party/bootstrap-multiselect/css/bootstrap-multiselect.css
 create mode 100644 js/third-party/bootstrap-multiselect/js/bootstrap-multiselect-collapsible-groups.js
 create mode 100644 js/third-party/bootstrap-multiselect/js/bootstrap-multiselect.js
 create mode 100644 js/third-party/footable/footable-components.latest/css/footable.core.bootstrap.min.css
 create mode 100644 js/third-party/footable/footable-components.latest/css/footable.core.standalone.min.css
 create mode 100644 js/third-party/footable/footable-components.latest/css/footable.editing.min.css
 create mode 100644 js/third-party/footable/footable-components.latest/css/footable.filtering.min.css
 create mode 100644 js/third-party/footable/footable-components.latest/css/footable.paging.min.css
 create mode 100644 js/third-party/footable/footable-components.latest/css/footable.sorting.min.css
 create mode 100644 js/third-party/footable/footable-components.latest/js/footable.core.min.js
 create mode 100644 js/third-party/footable/footable-components.latest/js/footable.editing.min.js
 create mode 100644 js/third-party/footable/footable-components.latest/js/footable.export.min.js
 create mode 100644 js/third-party/footable/footable-components.latest/js/footable.filtering.min.js
 create mode 100644 js/third-party/footable/footable-components.latest/js/footable.paging.min.js
 create mode 100644 js/third-party/footable/footable-components.latest/js/footable.sorting.min.js
 create mode 100644 js/third-party/footable/footable-components.latest/js/footable.state.min.js
 create mode 100644 js/third-party/footable/footable-standalone.latest/css/footable.standalone.min.css
 create mode 100644 js/third-party/footable/footable-standalone.latest/js/footable.min.js
 create mode 100644 js/third-party/momentjs/moment.js
 create mode 100644 js/third-party/selectize/selectize.default.css
 create mode 100644 js/third-party/selectize/selectize.js
 create mode 100644 problems_list.json
 create mode 100644 problems_list.md

diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/css/styles.css b/css/styles.css
new file mode 100644
index 0000000..e69de29
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..f6bd60e
--- /dev/null
+++ b/index.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <title>Learning Computer Science</title>
+        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
+        <!--<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">-->
+        <link rel="stylesheet" href="css/styles.css">
+        <link rel="stylesheet" href="js/third-party/footable/footable-standalone.latest/css/footable.standalone.min.css">
+        <link rel="stylesheet" href="js/third-party/footable/footable-components.latest/css/footable.core.standalone.min.css">
+        <link rel="stylesheet" href="js/third-party/footable/footable-components.latest/css/footable.paging.min.css">
+        <link rel="stylesheet" href="js/third-party/footable/footable-components.latest/css/footable.filtering.min.css">
+        <link rel="stylesheet" href="js/third-party/footable/footable-components.latest/css/footable.sorting.min.css">
+        <link rel="stylesheet" href="js/third-party/bootstrap-multiselect/css/bootstrap-multiselect.css">  
+        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.4/css/selectize.default.min.css">
+    </head>
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
+    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
+    <script src='js/app.min.js'></script>
+    <!-- <script src="https://unpkg.com/lunr/lunr.js"></script> -->
+    <!-- <script src="js/third-party/underscore/underscore-min.js" type="text/javascript"></script> -->
+    <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.4/lodash.min.js" type="text/javascript"></script>
+    <script src="https://use.fontawesome.com/aee99fcf4a.js"></script>
+    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
+    <script src="js/third-party/momentjs/moment.js" type="text/javascript"></script> 
+    <script src="js/third-party/footable/footable-standalone.latest/js/footable.min.js" type="text/javascript"></script>
+    <script src="js/third-party/footable/footable-components.latest/js/footable.paging.min.js" type="text/javascript"></script>
+    <script src="js/third-party/footable/footable-components.latest/js/footable.filtering.min.js" type="text/javascript"></script>
+    <script src="js/third-party/footable/footable-components.latest/js/footable.sorting.min.js" type="text/javascript"></script>
+    <script src="js/third-party/footable/footable-components.latest/js/footable.state.min.js" type="text/javascript"></script>
+    <script src="js/third-party/bootstrap-multiselect/js/bootstrap-multiselect.js" type="text/javascript"></script>
+    <body>
+        <div class="container">
+            <br>
+            <br>
+            <div class="row">
+                <div class="col">
+                    <input type="text" id="input-origin" multiple="multiple"/>
+                </div>
+                <div class="col">
+                    <input type="text" id="input-and-or-origin-companies"/>
+                </div>
+                <div class="col">
+                    <input type="text" id="input-companies" multiple="multiple"/>
+                </div>
+                <div class="col">
+                    <input type="text" id="input-and-or-companies-categories" value="and"/>
+                </div>
+                <div class="col">
+                    <input type="text" id="input-categories" multiple="multiple"/>
+                </div>
+            </div>
+            <br>
+            <div class="row">
+                <div class="col">
+                    <input type="text" id="input-and-or-categories-tags" value="and"/>
+                </div>
+                <div class="col">
+                    <input type="text" id="input-tags" multiple="multiple"/>
+                </div>
+                <div class="col">
+                    <input type="text" id="input-and-or-tags-languages" value="and"/>
+                </div>
+                <div class="col">
+                    <input type="text" id="input-languages" multiple="multiple"/>
+                </div>                  
+            </div>
+            <br>
+            <div>
+                <button class="btn btn-primary" type="button" data-toggle="collapse" data-target="#filter-query" aria-expanded="false" aria-controls="filter-query">
+                        Show/Hide filter query
+                </button>
+            </div>            
+            <br>
+            <div class="row collapse" id="filter-query">
+                <div class="card card-body inline">
+                    <div id="filter-query-origin">(any origin)</div>
+                    <div id="filter-query-and-or-origin-companies">and</div>
+                    <div id="filter-query-companies">(any company)</div>
+                    <div id="filter-query-and-or-companies-categories">and</div>
+                    <div id="filter-query-categories">(any category)</div>
+                    <div id="filter-query-and-or-categories-tags">and</div>
+                    <div id="filter-query-tags">(any tag)</div>
+                    <div id="filter-query-and-or-tags-languages">and</div>
+                    <div id="filter-query-languages">(any language)</div>
+                </div>            
+            </div>            
+            <br>
+            <div class="row">
+                <div class="col-sm">
+                    <button type="button" class="btn btn-primary btn-sm" onclick="applyFilters()">Apply Filters</button>
+                </div>
+                <div class="col-sm">
+                    <button type="button" class="btn btn-primary btn-sm" onclick="clearFilters()">Clear Filters</button>
+                </div>
+                <div class="col-sm">
+                    <div id="retrieved_count"></div>
+                </div>
+            </div>
+            <br>
+            <div class="row" id="showData">  
+                <table class="table" id="problems_list_table" data-paging="true" data-sorting="true" data-state="true"></table> 
+            </div>
+        </div>
+    </body>
+</html>
\ No newline at end of file
diff --git a/js/app.js b/js/app.js
new file mode 100644
index 0000000..e99e0c6
--- /dev/null
+++ b/js/app.js
@@ -0,0 +1,700 @@
+/*jslint es6 */
+/*global jQuery */
+/*global $ _ fetch this*/
+/*jslint browser: true, devel: true */
+/*jslint bitwise: true */
+
+var global_adapted_json_data = [];
+var global_filtered_json_data = [];
+
+var global_problem_id_string = "Id";
+var global_problem_name_string = "Name";
+var global_problem_link_string = "Link";
+var global_problem_origin_string = "Origin";
+var global_problem_companies_string = "Companies";
+var global_problem_categories_string = "Categories";
+var global_problem_tags_string = "Tags";
+var global_problem_languages_string = "Languages";
+
+var global_filter_query_origin_default = "any origin";
+var global_filter_query_companies_default = "any origin";
+var global_filter_query_categories_default = "any origin";
+var global_filter_query_tags_default = "any origin";
+var global_filter_query_languages_default = "any origin";
+var global_filter_query_and_or_default = "AND";
+
+
+var global_origin = [];
+var global_companies = [];
+var global_categories = [];
+var global_tags = [];
+var global_languages = [];
+var global_filters_applied = false;
+
+var getJson = new Promise(function (resolve, reject) {
+    "use strict";
+    //fetch('https://raw.githubusercontent.com/computer-science-engineering/computer-science-engineering.github.io/master/problems_list.json', {mode: 'cors'})// uncomment for debugging
+    fetch('problems_list.json', {mode: 'no-cors'})
+        .then((res) => res.json())
+        .then((json_data) => resolve(json_data));
+});
+
+function createFooTable(columns, row_data) {
+    "use strict";
+    return new Promise(function (resolve, reject) {
+        $('.table').footable({
+            columns: columns,
+            rows: row_data
+        });
+        resolve("Success!");
+    });
+}
+
+function updateRetrievedCount(count) {
+    "use strict";
+    $('#retrieved_count').html("Retrieved Count: " + count);
+}
+
+function stringifyNestedJsonArrays(json_data) {
+    "use strict";
+    var temp_json_data = JSON.parse(JSON.stringify(json_data));
+    return new Promise(function (resolve, reject) {
+        temp_json_data.forEach(function (element) {
+            var temp;
+            if (element.hasOwnProperty(global_problem_companies_string) && element[global_problem_companies_string] !== "") {
+                temp = element.Companies.join(", ");
+                element.Companies = temp;
+            }
+
+            if (element.hasOwnProperty(global_problem_categories_string) && element[global_problem_categories_string] !== "") {
+                temp = element.Categories.join(", ");
+                element.Categories = temp;
+            }
+
+            if (element.hasOwnProperty(global_problem_tags_string) && element[global_problem_tags_string] !== "") {
+                temp = element.Tags.join(", ");
+                element.Tags = temp;
+            }
+
+            if (element.hasOwnProperty(global_problem_languages_string) && element[global_problem_languages_string] !== "") {
+                temp = element.Languages.join(", ");
+                element.Languages = temp;
+            }
+        });
+        resolve(temp_json_data);
+    });
+}
+
+//https://stackoverflow.com/a/35318609/420827
+function createTable(json_data) {
+    "use strict";
+    return new Promise(function (resolve, reject) {
+        var columnJson = $.map(Object.getOwnPropertyNames(json_data[0]), function (column) {
+            if (column === global_problem_id_string) {
+                return {"name": column, "title": column, "breakpoints": "xs", "type": "number", "style": {"width": 80, "maxWidth": 80}};
+            } else if (column === global_problem_name_string || column === global_problem_companies_string || column === global_problem_tags_string) {
+                return {"name": column, "title": column};
+            } else {
+                return {"name": column, "title": column, "breakpoints": "xs"};
+            }
+        });
+
+        var count;
+        if (json_data.length === 1 && json_data[0].Name === "") {
+            count = 0;
+        } else {
+            count = json_data.length;
+        }
+
+        stringifyNestedJsonArrays(json_data)
+            .then((nested_arrays_removed_json) => createFooTable(columnJson, nested_arrays_removed_json))
+            .then(updateRetrievedCount(count))
+            .then(resolve("Success!"));
+    });
+}
+
+// [
+//     {"name":"id","title":"ID","breakpoints":"xs sm","type":"number","style":{"width":80,"maxWidth":80}},
+//     {"name":"firstName","title":"First Name"},
+//     {"name":"lastName","title":"Last Name"},
+//     {"name":"something","title":"Never seen but always around","visible":false,"filterable":false},
+//     {"name":"jobTitle","title":"Job Title","breakpoints":"xs sm","style":{"maxWidth":200,"overflow":"hidden","textOverflow":"ellipsis","wordBreak":"keep-all","whiteSpace":"nowrap"}},
+//     {"name":"started","title":"Started On","type":"date","breakpoints":"xs sm md","formatString":"MMM YYYY"},
+//     {"name":"dob","title":"Date of Birth","type":"date","breakpoints":"xs sm md","formatString":"DD MMM YYYY"},
+//     {"name":"status","title":"Status"}
+// ]
+
+
+function adaptJsonData(json_data) {
+    "use strict";
+    return new Promise(function (resolve, reject) {
+        Array.prototype.forEach.call(json_data, element => {
+            if (element.hasOwnProperty(global_problem_name_string) && element.hasOwnProperty(global_problem_link_string)) {
+                var problem_name = element.Name;
+                var link = element.Link;
+                element.Name = "<a href=\"" + link + "\" target=\"_blank\">" + problem_name + "</a>";
+                delete element.Link;
+            }
+
+            if (element.hasOwnProperty(global_problem_origin_string)) {
+                var item = element.Origin;
+                if (global_origin.indexOf(item) === -1) {
+                    global_origin.push(item);
+                }
+            }
+
+            var values;
+            if (element.hasOwnProperty(global_problem_companies_string)) {
+                values = element.Companies;
+                values.forEach(function (item) {
+                    if (global_companies.indexOf(item) === -1) {
+                        global_companies.push(item);
+                    }
+                });
+            }
+
+            if (element.hasOwnProperty(global_problem_categories_string)) {
+                values = element.Categories;
+                values.forEach(function (item) {
+                    if (global_categories.indexOf(item) === -1) {
+                        global_categories.push(item);
+                    }
+                });
+            }
+
+            if (element.hasOwnProperty(global_problem_tags_string)) {
+                values = element.Tags;
+                values.forEach(function (item) {
+                    if (global_tags.indexOf(item) === -1) {
+                        global_tags.push(item);
+                    }
+                });
+            }
+
+            if (element.hasOwnProperty(global_problem_languages_string)) {
+                values = element.Languages;
+                Array.prototype.forEach.call(values, item => {
+                    if (global_languages.indexOf(item) === -1) {
+                        global_languages.push(item);
+                    }
+                });
+            }
+        });
+        global_adapted_json_data = json_data;
+        resolve(json_data);
+    });
+}
+
+function populateFiltersDropdown() {
+    "use strict";
+    return new Promise(function (resolve, reject) {
+        var items = global_origin.map(function (x) {
+            return {label: x, title: x, value: x};
+        });
+        items = _.orderBy(items, ['label'], ['asc']);
+        $('#input-origin').multiselect({
+            includeSelectAllOption: true,
+            enableFiltering: true,
+            enableCaseInsensitiveFiltering: true,
+            numberDisplayed: 0,
+            nonSelectedText: 'Origin',
+            maxHeight: 300,
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-origin option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-origin').html(global_filter_query_origin_default);
+                } else {
+                    var arrayAsString = selected.join(" OR ");
+                    var text = "(" + arrayAsString + ")";
+                    $('#filter-query-origin').html(text);
+                }
+            }
+        });
+        $('#input-origin').multiselect('dataprovider', items);
+
+        items = global_companies.map(function (x) {
+            return {label: x, title: x, value: x};
+        });
+        items = _.orderBy(items, ['label'], ['asc']);
+        $('#input-companies').multiselect({
+            includeSelectAllOption: true,
+            enableFiltering: true,
+            enableCaseInsensitiveFiltering: true,
+            numberDisplayed: 0,
+            nonSelectedText: 'Companies',
+            maxHeight: 300,
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-companies option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-companies').html(global_filter_query_companies_default);
+                } else {
+                    var arrayAsString = selected.join(" OR ");
+                    var text = "(" + arrayAsString + ")";
+                    $('#filter-query-companies').html(text);
+                }
+            }
+        });
+        $('#input-companies').multiselect('dataprovider', items);
+
+        items = global_categories.map(function (x) {
+            return {label: x, title: x, value: x};
+        });
+        items = _.orderBy(items, ['label'], ['asc']);
+        $('#input-categories').multiselect({
+            includeSelectAllOption: true,
+            enableFiltering: true,
+            enableCaseInsensitiveFiltering: true,
+            numberDisplayed: 0,
+            nonSelectedText: 'Categories',
+            maxHeight: 300,
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-categories option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-categories').html(global_filter_query_categories_default);
+                } else {
+                    var arrayAsString = selected.join(" OR ");
+                    var text = "(" + arrayAsString + ")";
+                    $('#filter-query-categories').html(text);
+                }
+            }
+        });
+        $('#input-categories').multiselect('dataprovider', items);
+
+        items = global_tags.map(function (x) {
+            return {label: x, title: x, value: x};
+        });
+        items = _.orderBy(items, ['label'], ['asc']);
+        $('#input-tags').multiselect({
+            includeSelectAllOption: true,
+            enableFiltering: true,
+            enableCaseInsensitiveFiltering: true,
+            numberDisplayed: 0,
+            nonSelectedText: 'Tags',
+            maxHeight: 300,
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-tags option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-tags').html(global_filter_query_tags_default);
+                } else {
+                    var arrayAsString = selected.join(" OR ");
+                    var text = "(" + arrayAsString + ")";
+                    $('#filter-query-tags').html(text);
+                }
+            }
+        });
+        $('#input-tags').multiselect('dataprovider', items);
+
+        items = global_languages.map(function (x) {
+            return {label: x, title: x, value: x};
+        });
+        items = _.orderBy(items, ['label'], ['asc']);
+        $('#input-languages').multiselect({
+            includeSelectAllOption: true,
+            enableFiltering: true,
+            enableCaseInsensitiveFiltering: true,
+            numberDisplayed: 0,
+            nonSelectedText: 'Languages',
+            maxHeight: 300,
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-languages option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-languages').html(global_filter_query_languages_default);
+                } else {
+                    var arrayAsString = selected.join(" OR ");
+                    var text = "(" + arrayAsString + ")";
+                    $('#filter-query-languages').html(text);
+                }
+            }
+        });
+        $('#input-languages').multiselect('dataprovider', items);
+
+        var items_temp = ["and", "or"];
+        items = items_temp.map(function (x) {
+            return {label: x, title: x, value: x};
+        });
+        items = _.orderBy(items, ['label'], ['asc']);
+        $('#input-and-or-origin-companies').multiselect({
+            nonSelectedText: 'and/or',
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-and-or-origin-companies option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-and-or-origin-companies').html(global_filter_query_and_or_default);
+                } else {
+                    var arrayAsString = selected.join("");
+                    $('#filter-query-and-or-origin-companies').html(arrayAsString);
+                }
+            }
+        });
+        $('#input-and-or-origin-companies').multiselect('dataprovider', items);
+        $('#input-and-or-origin-companies').multiselect('select', ['and']);
+
+        $('#input-and-or-companies-categories').multiselect({
+            nonSelectedText: 'and/or',
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-and-or-companies-categories option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-and-or-companies-categories').html(global_filter_query_and_or_default);
+                } else {
+                    var arrayAsString = selected.join("");
+                    $('#filter-query-and-or-companies-categories').html(arrayAsString);
+                }
+            }
+        });
+        $('#input-and-or-companies-categories').multiselect('dataprovider', items);
+        $('#input-and-or-companies-categories').multiselect('select', ['and']);
+
+        $('#input-and-or-categories-tags').multiselect({
+            nonSelectedText: 'and/or',
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-and-or-categories-tags option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-and-or-categories-tags').html(global_filter_query_and_or_default);
+                } else {
+                    var arrayAsString = selected.join("");
+                    $('#filter-query-and-or-companies-categories').html(arrayAsString);
+                }
+            }
+        });
+        $('#input-and-or-categories-tags').multiselect('dataprovider', items);
+        $('#input-and-or-categories-tags').multiselect('select', ['and']);
+
+        $('#input-and-or-tags-languages').multiselect({
+            nonSelectedText: 'and/or',
+            templates: {
+                li: '<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',
+                ul: ' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                filter: '<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'
+            },
+            onChange: function () {
+                var brands = $('#input-and-or-tags-languages option:selected');
+                var selected = [];
+                $(brands).each(function () {
+                    selected.push($(this).val());
+                });
+                if (selected.length === 0) {
+                    $('#filter-query-and-or-tags-languages').html(global_filter_query_and_or_default);
+                } else {
+                    var arrayAsString = selected.join("");
+                    $('#filter-query-and-or-tags-languages').html(arrayAsString);
+                }
+            }
+        });
+        $('#input-and-or-tags-languages').multiselect('dataprovider', items);
+        $('#input-and-or-tags-languages').multiselect('select', ['and']);
+
+        resolve("Success!");
+    });
+}
+
+function isItemInArray(arr, item) {
+    "use strict";
+    if (arr.length === 0) {
+        return true;
+    }
+    return (arr.indexOf(item) !== -1);
+}
+
+function isFilterSatisfied(filters, items) {
+    "use strict";
+    if (filters.length === 0 && items.length === 0) {
+        return true;
+    }
+    if (filters.length === 0 && items.length !== 0) {
+        return true;
+    }
+    if (filters.length !== 0 && items.length === 0) {
+        return false;
+    }
+    if (filters.length !== 0 && items.length !== 0) {
+        var result = _.intersection(items, filters).length > 0;
+        return result;
+    }
+}
+
+function getFilteredJson() {
+    "use strict";
+    return new Promise(function (resolve, reject) {
+        global_filtered_json_data = [];
+        var filter_origins = [];
+        var temp = $('#input-origin option:selected').map(function (a, item) {
+            return item.value;
+        });
+        _.forEach(temp, function (item) {
+            filter_origins.push(item);
+        });
+        var filter_companies = [];
+        temp = $('#input-companies option:selected').map(function (a, item) {
+            return item.value;
+        });
+        _.forEach(temp, function (item) {
+            filter_companies.push(item);
+        });
+        var filter_categories = [];
+        temp = $('#input-categories option:selected').map(function (a, item) {
+            return item.value;
+        });
+        _.forEach(temp, function (item) {
+            filter_categories.push(item);
+        });
+        var filter_tags = [];
+        temp = $('#input-tags option:selected').map(function (a, item) {
+            return item.value;
+        });
+        _.forEach(temp, function (item) {
+            filter_tags.push(item);
+        });
+        var filter_languages = [];
+        temp = $('#input-languages option:selected').map(function (a, item) {
+            return item.value;
+        });
+        _.forEach(temp, function (item) {
+            filter_languages.push(item);
+        });
+
+        if (filter_origins.length === 1 && filter_origins[0] === "") {
+            filter_origins = [];
+        }
+        if (filter_companies.length === 1 && filter_companies[0] === "") {
+            filter_companies = [];
+        }
+        if (filter_categories.length === 1 && filter_categories[0] === "") {
+            filter_categories = [];
+        }
+        if (filter_tags.length === 1 && filter_tags[0] === "") {
+            filter_tags = [];
+        }
+        if (filter_languages.length === 1 && filter_languages[0] === "") {
+            filter_languages = [];
+        }
+
+        temp = $('#input-and-or-origin-companies option:selected').map(function (a, item) {
+            return item.value;
+        });
+        var and_or_origin_companies = _.join(temp, "");
+        temp = $('#input-and-or-companies-categories option:selected').map(function (a, item) {
+            return item.value;
+        });
+        var and_or_companies_categories = _.join(temp, "");
+        temp = $('#input-and-or-categories-tags option:selected').map(function (a, item) {
+            return item.value;
+        });
+        var and_or_categories_tags = _.join(temp, "");
+        temp = $('#input-and-or-tags-languages option:selected').map(function (a, item) {
+            return item.value;
+        });
+        var and_or_tags_languages = _.join(temp, "");
+
+        var temp_origins = _.filter(global_adapted_json_data, function (item) {
+            return isItemInArray(filter_origins, item.Origin);
+        });
+
+        var temp_companies = _.filter(global_adapted_json_data, function (item) {
+            return isFilterSatisfied(filter_companies, item.Companies);
+        });
+
+        var temp_categories = _.filter(global_adapted_json_data, function (item) {
+            return isFilterSatisfied(filter_categories, item.Categories);
+        });
+
+        var temp_tags = _.filter(global_adapted_json_data, function (item) {
+            return isFilterSatisfied(filter_tags, item.Tags);
+        });
+
+        var temp_languages = _.filter(global_adapted_json_data, function (item) {
+            return isFilterSatisfied(filter_languages, item.Languages);
+        });
+
+        var filtered_data = [];
+        if (and_or_origin_companies === "and") {
+            filtered_data = _.intersectionBy(temp_origins, temp_companies, "Id");
+        } else if (and_or_origin_companies === "or") {
+            filtered_data = _.unionBy(temp_origins, temp_companies, "Id");
+        }
+
+        if (and_or_companies_categories === "and") {
+            filtered_data = _.intersectionBy(filtered_data, temp_categories, "Id");
+        } else if (and_or_companies_categories === "or") {
+            filtered_data = _.unionBy(filtered_data, temp_categories, "Id");
+        }
+
+        if (and_or_categories_tags === "and") {
+            filtered_data = _.intersectionBy(filtered_data, temp_tags, "Id");
+        } else if (and_or_categories_tags === "or") {
+            filtered_data = _.unionBy(filtered_data, temp_tags, "Id");
+        }
+
+        if (and_or_tags_languages === "and") {
+            filtered_data = _.intersectionBy(filtered_data, temp_languages, "Id");
+        } else if (and_or_tags_languages === "or") {
+            filtered_data = _.unionBy(filtered_data, temp_languages, "Id");
+        }
+
+        if (filtered_data.length === 0) {
+            var filtered_data_object = {};
+            filtered_data_object[global_problem_id_string] = "";
+            filtered_data_object[global_problem_name_string] = "";
+            filtered_data_object[global_problem_origin_string] = "";
+            filtered_data_object[global_problem_link_string] = "";
+            filtered_data_object[global_problem_companies_string] = "";
+            filtered_data_object[global_problem_categories_string] = "";
+            filtered_data_object[global_problem_tags_string] = "";
+            filtered_data_object[global_problem_languages_string] = "";
+            filtered_data.push(filtered_data_object);
+        }
+        global_filtered_json_data = filtered_data;
+        resolve(global_filtered_json_data);
+    });
+}
+
+function applyFilters() {
+    "use strict";
+    getFilteredJson()
+        .then((filtered_json_data) => createTable(filtered_json_data))
+        .then(function () {
+            global_filters_applied = true;
+        });
+}
+
+function clearFilters() {
+    "use strict";
+    if (global_filters_applied) {
+        createTable(global_adapted_json_data)
+            .then(function () {
+                $('#input-origin').multiselect('deselectAll', false);
+                $('#input-origin').multiselect('updateButtonText');
+                $('#input-companies').multiselect('deselectAll', false);
+                $('#input-companies').multiselect('updateButtonText');
+                $('#input-categories').multiselect('deselectAll', false);
+                $('#input-categories').multiselect('updateButtonText');
+                $('#input-tags').multiselect('deselectAll', false);
+                $('#input-tags').multiselect('updateButtonText');
+                $('#input-languages').multiselect('deselectAll', false);
+                $('#input-languages').multiselect('updateButtonText');
+                $('#input-and-or-origin-companies').multiselect('deselectAll', false);
+                $('#input-and-or-origin-companies').multiselect('updateButtonText');
+                $('#input-and-or-companies-categories').multiselect('deselectAll', false);
+                $('#input-and-or-companies-categories').multiselect('updateButtonText');
+                $('#input-and-or-categories-tags').multiselect('deselectAll', false);
+                $('#input-and-or-categories-tags').multiselect('updateButtonText');
+                $('#input-and-or-tags-languages').multiselect('deselectAll', false);
+                $('#input-and-or-tags-languages').multiselect('updateButtonText');
+            })
+            .then(function () {
+                global_filtered_json_data = [];
+                global_filters_applied = false;
+                $('#filter-query-origin').html(global_filter_query_origin_default);
+            });
+    }
+}
+//https://github.com/lodash/lodash/issues/1743#issuecomment-298957228
+function arrayContainsArray(superset, subset) {
+    "use strict";
+    return subset.every(function (value) {
+        return (superset.indexOf(value) >= 0);
+    });
+}
+
+jQuery(function () {
+    "use strict";
+    getJson
+        .then((json_data) => adaptJsonData(json_data))
+        .then((changed_json_data) => createTable(changed_json_data))
+        .then(function () {
+            populateFiltersDropdown();
+        });
+});
+
+function sleep(ms) {
+    "use strict";
+    return new Promise((resolve) => setTimeout(resolve, ms));
+}
diff --git a/js/app.min.js b/js/app.min.js
new file mode 100644
index 0000000..b556d96
--- /dev/null
+++ b/js/app.min.js
@@ -0,0 +1 @@
+var global_adapted_json_data=[],global_filtered_json_data=[],global_problem_id_string="Id",global_problem_name_string="Name",global_problem_link_string="Link",global_problem_origin_string="Origin",global_problem_companies_string="Companies",global_problem_categories_string="Categories",global_problem_tags_string="Tags",global_problem_languages_string="Languages",global_filter_query_origin_default="any origin",global_filter_query_companies_default="any origin",global_filter_query_categories_default="any origin",global_filter_query_tags_default="any origin",global_filter_query_languages_default="any origin",global_filter_query_and_or_default="AND",global_origin=[],global_companies=[],global_categories=[],global_tags=[],global_languages=[],global_filters_applied=!1,getJson=new Promise((function(resolve,reject){"use strict";fetch("problems_list.json",{mode:"no-cors"}).then(res=>res.json()).then(json_data=>resolve(json_data))}));function createFooTable(columns,row_data){"use strict";return new Promise((function(resolve,reject){$(".table").footable({columns:columns,rows:row_data}),resolve("Success!")}))}function updateRetrievedCount(count){"use strict";$("#retrieved_count").html("Retrieved Count: "+count)}function stringifyNestedJsonArrays(json_data){"use strict";var temp_json_data=JSON.parse(JSON.stringify(json_data));return new Promise((function(resolve,reject){temp_json_data.forEach((function(element){var temp;element.hasOwnProperty(global_problem_companies_string)&&""!==element[global_problem_companies_string]&&(temp=element.Companies.join(", "),element.Companies=temp),element.hasOwnProperty(global_problem_categories_string)&&""!==element[global_problem_categories_string]&&(temp=element.Categories.join(", "),element.Categories=temp),element.hasOwnProperty(global_problem_tags_string)&&""!==element[global_problem_tags_string]&&(temp=element.Tags.join(", "),element.Tags=temp),element.hasOwnProperty(global_problem_languages_string)&&""!==element[global_problem_languages_string]&&(temp=element.Languages.join(", "),element.Languages=temp)})),resolve(temp_json_data)}))}function createTable(json_data){"use strict";return new Promise((function(resolve,reject){var columnJson=$.map(Object.getOwnPropertyNames(json_data[0]),(function(column){return column===global_problem_id_string?{name:column,title:column,breakpoints:"xs",type:"number",style:{width:80,maxWidth:80}}:column===global_problem_name_string||column===global_problem_companies_string||column===global_problem_tags_string?{name:column,title:column}:{name:column,title:column,breakpoints:"xs"}})),count;count=1===json_data.length&&""===json_data[0].Name?0:json_data.length,stringifyNestedJsonArrays(json_data).then(nested_arrays_removed_json=>createFooTable(columnJson,nested_arrays_removed_json)).then(updateRetrievedCount(count)).then(resolve("Success!"))}))}function adaptJsonData(json_data){"use strict";return new Promise((function(resolve,reject){Array.prototype.forEach.call(json_data,element=>{if(element.hasOwnProperty(global_problem_name_string)&&element.hasOwnProperty(global_problem_link_string)){var problem_name=element.Name,link=element.Link;element.Name='<a href="'+link+'" target="_blank">'+problem_name+"</a>",delete element.Link}if(element.hasOwnProperty(global_problem_origin_string)){var item=element.Origin;-1===global_origin.indexOf(item)&&global_origin.push(item)}var values;element.hasOwnProperty(global_problem_companies_string)&&(values=element.Companies).forEach((function(item){-1===global_companies.indexOf(item)&&global_companies.push(item)})),element.hasOwnProperty(global_problem_categories_string)&&(values=element.Categories).forEach((function(item){-1===global_categories.indexOf(item)&&global_categories.push(item)})),element.hasOwnProperty(global_problem_tags_string)&&(values=element.Tags).forEach((function(item){-1===global_tags.indexOf(item)&&global_tags.push(item)})),element.hasOwnProperty(global_problem_languages_string)&&(values=element.Languages,Array.prototype.forEach.call(values,item=>{-1===global_languages.indexOf(item)&&global_languages.push(item)}))}),global_adapted_json_data=json_data,resolve(json_data)}))}function populateFiltersDropdown(){"use strict";return new Promise((function(resolve,reject){var items=global_origin.map((function(x){return{label:x,title:x,value:x}})),items_temp;items=_.orderBy(items,["label"],["asc"]),$("#input-origin").multiselect({includeSelectAllOption:!0,enableFiltering:!0,enableCaseInsensitiveFiltering:!0,numberDisplayed:0,nonSelectedText:"Origin",maxHeight:300,templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-origin option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-origin").html(global_filter_query_origin_default);else{var arrayAsString,text="("+selected.join(" OR ")+")";$("#filter-query-origin").html(text)}}}),$("#input-origin").multiselect("dataprovider",items),items=global_companies.map((function(x){return{label:x,title:x,value:x}})),items=_.orderBy(items,["label"],["asc"]),$("#input-companies").multiselect({includeSelectAllOption:!0,enableFiltering:!0,enableCaseInsensitiveFiltering:!0,numberDisplayed:0,nonSelectedText:"Companies",maxHeight:300,templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-companies option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-companies").html(global_filter_query_companies_default);else{var arrayAsString,text="("+selected.join(" OR ")+")";$("#filter-query-companies").html(text)}}}),$("#input-companies").multiselect("dataprovider",items),items=global_categories.map((function(x){return{label:x,title:x,value:x}})),items=_.orderBy(items,["label"],["asc"]),$("#input-categories").multiselect({includeSelectAllOption:!0,enableFiltering:!0,enableCaseInsensitiveFiltering:!0,numberDisplayed:0,nonSelectedText:"Categories",maxHeight:300,templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-categories option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-categories").html(global_filter_query_categories_default);else{var arrayAsString,text="("+selected.join(" OR ")+")";$("#filter-query-categories").html(text)}}}),$("#input-categories").multiselect("dataprovider",items),items=global_tags.map((function(x){return{label:x,title:x,value:x}})),items=_.orderBy(items,["label"],["asc"]),$("#input-tags").multiselect({includeSelectAllOption:!0,enableFiltering:!0,enableCaseInsensitiveFiltering:!0,numberDisplayed:0,nonSelectedText:"Tags",maxHeight:300,templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-tags option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-tags").html(global_filter_query_tags_default);else{var arrayAsString,text="("+selected.join(" OR ")+")";$("#filter-query-tags").html(text)}}}),$("#input-tags").multiselect("dataprovider",items),items=global_languages.map((function(x){return{label:x,title:x,value:x}})),items=_.orderBy(items,["label"],["asc"]),$("#input-languages").multiselect({includeSelectAllOption:!0,enableFiltering:!0,enableCaseInsensitiveFiltering:!0,numberDisplayed:0,nonSelectedText:"Languages",maxHeight:300,templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-languages option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-languages").html(global_filter_query_languages_default);else{var arrayAsString,text="("+selected.join(" OR ")+")";$("#filter-query-languages").html(text)}}}),$("#input-languages").multiselect("dataprovider",items),items=["and","or"].map((function(x){return{label:x,title:x,value:x}})),items=_.orderBy(items,["label"],["asc"]),$("#input-and-or-origin-companies").multiselect({nonSelectedText:"and/or",templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-and-or-origin-companies option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-and-or-origin-companies").html(global_filter_query_and_or_default);else{var arrayAsString=selected.join("");$("#filter-query-and-or-origin-companies").html(arrayAsString)}}}),$("#input-and-or-origin-companies").multiselect("dataprovider",items),$("#input-and-or-origin-companies").multiselect("select",["and"]),$("#input-and-or-companies-categories").multiselect({nonSelectedText:"and/or",templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-and-or-companies-categories option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-and-or-companies-categories").html(global_filter_query_and_or_default);else{var arrayAsString=selected.join("");$("#filter-query-and-or-companies-categories").html(arrayAsString)}}}),$("#input-and-or-companies-categories").multiselect("dataprovider",items),$("#input-and-or-companies-categories").multiselect("select",["and"]),$("#input-and-or-categories-tags").multiselect({nonSelectedText:"and/or",templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-and-or-categories-tags option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-and-or-categories-tags").html(global_filter_query_and_or_default);else{var arrayAsString=selected.join("");$("#filter-query-and-or-companies-categories").html(arrayAsString)}}}),$("#input-and-or-categories-tags").multiselect("dataprovider",items),$("#input-and-or-categories-tags").multiselect("select",["and"]),$("#input-and-or-tags-languages").multiselect({nonSelectedText:"and/or",templates:{li:'<li><a class="dropdown-item"><label class="m-0 pl-2 pr-0"></label></a></li>',ul:' <ul class="multiselect-container dropdown-menu p-1 m-0"></ul>',button:'<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown" data-flip="false"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',filter:'<li class="multiselect-item filter"><div class="input-group m-0"><input class="form-control multiselect-search" type="text"></div></li>',filterClearBtn:'<span class="input-group-btn"><button type="button" class="btn btn-secondary multiselect-clear-filter">&times;</button></span>'},onChange:function(){var brands=$("#input-and-or-tags-languages option:selected"),selected=[];if($(brands).each((function(){selected.push($(this).val())})),0===selected.length)$("#filter-query-and-or-tags-languages").html(global_filter_query_and_or_default);else{var arrayAsString=selected.join("");$("#filter-query-and-or-tags-languages").html(arrayAsString)}}}),$("#input-and-or-tags-languages").multiselect("dataprovider",items),$("#input-and-or-tags-languages").multiselect("select",["and"]),resolve("Success!")}))}function isItemInArray(arr,item){"use strict";return 0===arr.length||-1!==arr.indexOf(item)}function isFilterSatisfied(filters,items){"use strict";return 0===filters.length&&0===items.length||(0===filters.length&&0!==items.length||(0===filters.length||0!==items.length)&&(0!==filters.length&&0!==items.length?_.intersection(items,filters).length>0:void 0));var result}function getFilteredJson(){"use strict";return new Promise((function(resolve,reject){global_filtered_json_data=[];var filter_origins=[],temp=$("#input-origin option:selected").map((function(a,item){return item.value}));_.forEach(temp,(function(item){filter_origins.push(item)}));var filter_companies=[];temp=$("#input-companies option:selected").map((function(a,item){return item.value})),_.forEach(temp,(function(item){filter_companies.push(item)}));var filter_categories=[];temp=$("#input-categories option:selected").map((function(a,item){return item.value})),_.forEach(temp,(function(item){filter_categories.push(item)}));var filter_tags=[];temp=$("#input-tags option:selected").map((function(a,item){return item.value})),_.forEach(temp,(function(item){filter_tags.push(item)}));var filter_languages=[];temp=$("#input-languages option:selected").map((function(a,item){return item.value})),_.forEach(temp,(function(item){filter_languages.push(item)})),1===filter_origins.length&&""===filter_origins[0]&&(filter_origins=[]),1===filter_companies.length&&""===filter_companies[0]&&(filter_companies=[]),1===filter_categories.length&&""===filter_categories[0]&&(filter_categories=[]),1===filter_tags.length&&""===filter_tags[0]&&(filter_tags=[]),1===filter_languages.length&&""===filter_languages[0]&&(filter_languages=[]),temp=$("#input-and-or-origin-companies option:selected").map((function(a,item){return item.value}));var and_or_origin_companies=_.join(temp,"");temp=$("#input-and-or-companies-categories option:selected").map((function(a,item){return item.value}));var and_or_companies_categories=_.join(temp,"");temp=$("#input-and-or-categories-tags option:selected").map((function(a,item){return item.value}));var and_or_categories_tags=_.join(temp,"");temp=$("#input-and-or-tags-languages option:selected").map((function(a,item){return item.value}));var and_or_tags_languages=_.join(temp,""),temp_origins=_.filter(global_adapted_json_data,(function(item){return isItemInArray(filter_origins,item.Origin)})),temp_companies=_.filter(global_adapted_json_data,(function(item){return isFilterSatisfied(filter_companies,item.Companies)})),temp_categories=_.filter(global_adapted_json_data,(function(item){return isFilterSatisfied(filter_categories,item.Categories)})),temp_tags=_.filter(global_adapted_json_data,(function(item){return isFilterSatisfied(filter_tags,item.Tags)})),temp_languages=_.filter(global_adapted_json_data,(function(item){return isFilterSatisfied(filter_languages,item.Languages)})),filtered_data=[];if("and"===and_or_origin_companies?filtered_data=_.intersectionBy(temp_origins,temp_companies,"Id"):"or"===and_or_origin_companies&&(filtered_data=_.unionBy(temp_origins,temp_companies,"Id")),"and"===and_or_companies_categories?filtered_data=_.intersectionBy(filtered_data,temp_categories,"Id"):"or"===and_or_companies_categories&&(filtered_data=_.unionBy(filtered_data,temp_categories,"Id")),"and"===and_or_categories_tags?filtered_data=_.intersectionBy(filtered_data,temp_tags,"Id"):"or"===and_or_categories_tags&&(filtered_data=_.unionBy(filtered_data,temp_tags,"Id")),"and"===and_or_tags_languages?filtered_data=_.intersectionBy(filtered_data,temp_languages,"Id"):"or"===and_or_tags_languages&&(filtered_data=_.unionBy(filtered_data,temp_languages,"Id")),0===filtered_data.length){var filtered_data_object={};filtered_data_object[global_problem_id_string]="",filtered_data_object[global_problem_name_string]="",filtered_data_object[global_problem_origin_string]="",filtered_data_object[global_problem_link_string]="",filtered_data_object[global_problem_companies_string]="",filtered_data_object[global_problem_categories_string]="",filtered_data_object[global_problem_tags_string]="",filtered_data_object[global_problem_languages_string]="",filtered_data.push(filtered_data_object)}resolve(global_filtered_json_data=filtered_data)}))}function applyFilters(){"use strict";getFilteredJson().then(filtered_json_data=>createTable(filtered_json_data)).then((function(){global_filters_applied=!0}))}function clearFilters(){"use strict";global_filters_applied&&createTable(global_adapted_json_data).then((function(){$("#input-origin").multiselect("deselectAll",!1),$("#input-origin").multiselect("updateButtonText"),$("#input-companies").multiselect("deselectAll",!1),$("#input-companies").multiselect("updateButtonText"),$("#input-categories").multiselect("deselectAll",!1),$("#input-categories").multiselect("updateButtonText"),$("#input-tags").multiselect("deselectAll",!1),$("#input-tags").multiselect("updateButtonText"),$("#input-languages").multiselect("deselectAll",!1),$("#input-languages").multiselect("updateButtonText"),$("#input-and-or-origin-companies").multiselect("deselectAll",!1),$("#input-and-or-origin-companies").multiselect("updateButtonText"),$("#input-and-or-companies-categories").multiselect("deselectAll",!1),$("#input-and-or-companies-categories").multiselect("updateButtonText"),$("#input-and-or-categories-tags").multiselect("deselectAll",!1),$("#input-and-or-categories-tags").multiselect("updateButtonText"),$("#input-and-or-tags-languages").multiselect("deselectAll",!1),$("#input-and-or-tags-languages").multiselect("updateButtonText")})).then((function(){global_filtered_json_data=[],global_filters_applied=!1,$("#filter-query-origin").html(global_filter_query_origin_default)}))}function arrayContainsArray(superset,subset){"use strict";return subset.every((function(value){return superset.indexOf(value)>=0}))}function sleep(ms){"use strict";return new Promise(resolve=>setTimeout(resolve,ms))}jQuery((function(){"use strict";getJson.then(json_data=>adaptJsonData(json_data)).then(changed_json_data=>createTable(changed_json_data)).then((function(){populateFiltersDropdown()}))}));
\ No newline at end of file
diff --git a/js/third-party/bootstrap-multiselect/css/bootstrap-multiselect.css b/js/third-party/bootstrap-multiselect/css/bootstrap-multiselect.css
new file mode 100644
index 0000000..13de57b
--- /dev/null
+++ b/js/third-party/bootstrap-multiselect/css/bootstrap-multiselect.css
@@ -0,0 +1 @@
+.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px 3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0}
\ No newline at end of file
diff --git a/js/third-party/bootstrap-multiselect/js/bootstrap-multiselect-collapsible-groups.js b/js/third-party/bootstrap-multiselect/js/bootstrap-multiselect-collapsible-groups.js
new file mode 100644
index 0000000..195e4f1
--- /dev/null
+++ b/js/third-party/bootstrap-multiselect/js/bootstrap-multiselect-collapsible-groups.js
@@ -0,0 +1,92 @@
+! function(e) {
+	"use strict";
+	jQuery.fn.multiselect.Constructor.prototype.selectAll = (function() {
+		var cached_function	= jQuery.fn.multiselect.Constructor.prototype.selectAll;
+
+		return function() {
+			var args			= Array.prototype.slice.call( arguments );
+				args[0]			= (this.options.enableCollapsibleOptGroups && this.options.multiple) ? false : args[0];
+			cached_function.apply(this, args);
+		};
+	}());
+
+	jQuery.fn.multiselect.Constructor.prototype.deselectAll = (function() {
+		var cached_function	= jQuery.fn.multiselect.Constructor.prototype.deselectAll;
+
+		return function() {
+			var args			= Array.prototype.slice.call( arguments );
+				args[0]			= (this.options.enableCollapsibleOptGroups && this.options.multiple) ? false : args[0];
+			cached_function.apply(this, args);
+		};
+	}());
+
+	jQuery.fn.multiselect.Constructor.prototype.createOptgroup = (function() {
+		var cached_function	= jQuery.fn.multiselect.Constructor.prototype.createOptgroup;
+
+		return function() {
+			var args	= Array.prototype.slice.call( arguments );
+			var t		= args[0];
+			if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+				var n = e(t).attr("label");
+				var v = e(t).attr("value");
+				var r = e('<li class="multiselect-item multiselect-group"><a href="javascript:void(0);"><input type="checkbox" value="' + v + '"/><b> ' + n + '<b class="caret"></b></b></a></li>');
+
+				if (this.options.enableClickableOptGroups) {
+					r.addClass("multiselect-group-clickable")
+				}
+				this.$ul.append(r);
+				if (e(t).is(":disabled")) {
+					r.addClass("disabled")
+				}
+				e("option", t).each(e.proxy(function(e, t) {
+					this.createOptionValue(t)
+				}, this))
+			} else {
+				cached_function.apply(this, arguments);
+			}
+		};
+	}());
+	
+	jQuery.fn.multiselect.Constructor.prototype.buildDropdownOptions = (function() {
+		var cached_function = jQuery.fn.multiselect.Constructor.prototype.buildDropdownOptions;
+
+		return function() {
+			cached_function.apply(this, arguments);
+
+			if (this.options.enableCollapsibleOptGroups && this.options.multiple) {
+				
+				e("li.multiselect-group input", this.$ul).off();
+				e("li.multiselect-group", this.$ul).siblings().not("li.multiselect-group, li.multiselect-all", this.$ul).each( function () {
+					$(this).toggleClass('hidden', true);
+				});
+				e("li.multiselect-group", this.$ul).on("click", e.proxy(function(t) {
+					t.stopPropagation();
+				}, this));
+				e("li.multiselect-group > a > b", this.$ul).on("click", e.proxy(function(t) {
+					t.stopPropagation();
+					var n = e(t.target).closest('li');
+					var r = n.nextUntil("li.multiselect-group");
+					var i = true;
+					r.each(function() {
+						i = i && e(this).hasClass('hidden');
+					});
+					r.toggleClass('hidden', !i);
+				}, this));
+				e("li.multiselect-group > a > input", this.$ul).on("change", e.proxy(function(t) {
+					t.stopPropagation();
+					var n = e(t.target).closest('li');
+					var r = n.nextUntil("li.multiselect-group");
+					var i = true;
+					var s = r.find("input");
+					s.each(function() {
+						i = i && e(this).prop("checked")
+					});
+					s.prop("checked", !i).trigger("change")
+				}, this));
+				e("li.multiselect-all", this.$ul).css('background', '#f3f3f3').css('border-bottom', '1px solid #eaeaea');
+				e("li.multiselect-group > a, li.multiselect-all > a > label.checkbox", this.$ul).css('padding', '3px 20px 3px 35px');
+				e("li.multiselect-group > a > input", this.$ul).css('margin', '4px 0px 5px -20px');
+			}
+		};
+	}());
+}(window.jQuery)
diff --git a/js/third-party/bootstrap-multiselect/js/bootstrap-multiselect.js b/js/third-party/bootstrap-multiselect/js/bootstrap-multiselect.js
new file mode 100644
index 0000000..5fb4c18
--- /dev/null
+++ b/js/third-party/bootstrap-multiselect/js/bootstrap-multiselect.js
@@ -0,0 +1,1416 @@
+/**
+ * Bootstrap Multiselect (https://github.com/davidstutz/bootstrap-multiselect)
+ * 
+ * Apache License, Version 2.0:
+ * Copyright (c) 2012 - 2015 David Stutz
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a
+ * copy of the License at http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ * 
+ * BSD 3-Clause License:
+ * Copyright (c) 2012 - 2015 David Stutz
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *    - Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *    - Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *    - Neither the name of David Stutz nor the names of its contributors may be
+ *      used to endorse or promote products derived from this software without
+ *      specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+!function ($) {
+    "use strict";// jshint ;_;
+
+    if (typeof ko !== 'undefined' && ko.bindingHandlers && !ko.bindingHandlers.multiselect) {
+        ko.bindingHandlers.multiselect = {
+            after: ['options', 'value', 'selectedOptions'],
+
+            init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
+                var $element = $(element);
+                var config = ko.toJS(valueAccessor());
+
+                $element.multiselect(config);
+
+                if (allBindings.has('options')) {
+                    var options = allBindings.get('options');
+                    if (ko.isObservable(options)) {
+                        ko.computed({
+                            read: function() {
+                                options();
+                                setTimeout(function() {
+                                    var ms = $element.data('multiselect');
+                                    if (ms)
+                                        ms.updateOriginalOptions();//Not sure how beneficial this is.
+                                    $element.multiselect('rebuild');
+                                }, 1);
+                            },
+                            disposeWhenNodeIsRemoved: element
+                        });
+                    }
+                }
+
+                //value and selectedOptions are two-way, so these will be triggered even by our own actions.
+                //It needs some way to tell if they are triggered because of us or because of outside change.
+                //It doesn't loop but it's a waste of processing.
+                if (allBindings.has('value')) {
+                    var value = allBindings.get('value');
+                    if (ko.isObservable(value)) {
+                        ko.computed({
+                            read: function() {
+                                value();
+                                setTimeout(function() {
+                                    $element.multiselect('refresh');
+                                }, 1);
+                            },
+                            disposeWhenNodeIsRemoved: element
+                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+                    }
+                }
+
+                //Switched from arrayChange subscription to general subscription using 'refresh'.
+                //Not sure performance is any better using 'select' and 'deselect'.
+                if (allBindings.has('selectedOptions')) {
+                    var selectedOptions = allBindings.get('selectedOptions');
+                    if (ko.isObservable(selectedOptions)) {
+                        ko.computed({
+                            read: function() {
+                                selectedOptions();
+                                setTimeout(function() {
+                                    $element.multiselect('refresh');
+                                }, 1);
+                            },
+                            disposeWhenNodeIsRemoved: element
+                        }).extend({ rateLimit: 100, notifyWhenChangesStop: true });
+                    }
+                }
+
+                ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
+                    $element.multiselect('destroy');
+                });
+            },
+
+            update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
+                var $element = $(element);
+                var config = ko.toJS(valueAccessor());
+
+                $element.multiselect('setOptions', config);
+                $element.multiselect('rebuild');
+            }
+        };
+    }
+
+    function forEach(array, callback) {
+        for (var index = 0; index < array.length; ++index) {
+            callback(array[index], index);
+        }
+    }
+
+    /**
+     * Constructor to create a new multiselect using the given select.
+     *
+     * @param {jQuery} select
+     * @param {Object} options
+     * @returns {Multiselect}
+     */
+    function Multiselect(select, options) {
+
+        this.$select = $(select);
+        
+        // Placeholder via data attributes
+        if (this.$select.attr("data-placeholder")) {
+            options.nonSelectedText = this.$select.data("placeholder");
+        }
+        
+        this.options = this.mergeOptions($.extend({}, options, this.$select.data()));
+
+        // Initialization.
+        // We have to clone to create a new reference.
+        this.originalOptions = this.$select.clone()[0].options;
+        this.query = '';
+        this.searchTimeout = null;
+        this.lastToggledInput = null
+
+        this.options.multiple = this.$select.attr('multiple') === "multiple";
+        this.options.onChange = $.proxy(this.options.onChange, this);
+        this.options.onDropdownShow = $.proxy(this.options.onDropdownShow, this);
+        this.options.onDropdownHide = $.proxy(this.options.onDropdownHide, this);
+        this.options.onDropdownShown = $.proxy(this.options.onDropdownShown, this);
+        this.options.onDropdownHidden = $.proxy(this.options.onDropdownHidden, this);
+        
+        // Build select all if enabled.
+        this.buildContainer();
+        this.buildButton();
+        this.buildDropdown();
+        this.buildSelectAll();
+        this.buildDropdownOptions();
+        this.buildFilter();
+
+        this.updateButtonText();
+        this.updateSelectAll();
+
+        if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {
+            this.disable();
+        }
+        
+        this.$select.hide().after(this.$container);
+    };
+
+    Multiselect.prototype = {
+
+        defaults: {
+            /**
+             * Default text function will either print 'None selected' in case no
+             * option is selected or a list of the selected options up to a length
+             * of 3 selected options.
+             * 
+             * @param {jQuery} options
+             * @param {jQuery} select
+             * @returns {String}
+             */
+            buttonText: function(options, select) {
+                if (options.length === 0) {
+                    return this.nonSelectedText;
+                }
+                else if (this.allSelectedText 
+                            && options.length === $('option', $(select)).length 
+                            && $('option', $(select)).length !== 1 
+                            && this.multiple) {
+
+                    if (this.selectAllNumber) {
+                        return this.allSelectedText + ' (' + options.length + ')';
+                    }
+                    else {
+                        return this.allSelectedText;
+                    }
+                }
+                else if (options.length > this.numberDisplayed) {
+                    return options.length + ' ' + this.nSelectedText;
+                }
+                else {
+                    var selected = '';
+                    var delimiter = this.delimiterText;
+                    
+                    options.each(function() {
+                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+                        selected += label + delimiter;
+                    });
+                    
+                    return selected.substr(0, selected.length - 2);
+                }
+            },
+            /**
+             * Updates the title of the button similar to the buttonText function.
+             * 
+             * @param {jQuery} options
+             * @param {jQuery} select
+             * @returns {@exp;selected@call;substr}
+             */
+            buttonTitle: function(options, select) {
+                if (options.length === 0) {
+                    return this.nonSelectedText;
+                }
+                else {
+                    var selected = '';
+                    var delimiter = this.delimiterText;
+                    
+                    options.each(function () {
+                        var label = ($(this).attr('label') !== undefined) ? $(this).attr('label') : $(this).text();
+                        selected += label + delimiter;
+                    });
+                    return selected.substr(0, selected.length - 2);
+                }
+            },
+            /**
+             * Create a label.
+             *
+             * @param {jQuery} element
+             * @returns {String}
+             */
+            optionLabel: function(element){
+                return $(element).attr('label') || $(element).text();
+            },
+            /**
+             * Triggered on change of the multiselect.
+             * 
+             * Not triggered when selecting/deselecting options manually.
+             * 
+             * @param {jQuery} option
+             * @param {Boolean} checked
+             */
+            onChange : function(option, checked) {
+
+            },
+            /**
+             * Triggered when the dropdown is shown.
+             *
+             * @param {jQuery} event
+             */
+            onDropdownShow: function(event) {
+
+            },
+            /**
+             * Triggered when the dropdown is hidden.
+             *
+             * @param {jQuery} event
+             */
+            onDropdownHide: function(event) {
+
+            },
+            /**
+             * Triggered after the dropdown is shown.
+             * 
+             * @param {jQuery} event
+             */
+            onDropdownShown: function(event) {
+                
+            },
+            /**
+             * Triggered after the dropdown is hidden.
+             * 
+             * @param {jQuery} event
+             */
+            onDropdownHidden: function(event) {
+                
+            },
+            /**
+             * Triggered on select all.
+             */
+            onSelectAll: function() {
+                
+            },
+            enableHTML: false,
+            buttonClass: 'btn btn-default',
+            inheritClass: false,
+            buttonWidth: 'auto',
+            buttonContainer: '<div class="btn-group" />',
+            dropRight: false,
+            selectedClass: 'active',
+            // Maximum height of the dropdown menu.
+            // If maximum height is exceeded a scrollbar will be displayed.
+            maxHeight: false,
+            checkboxName: false,
+            includeSelectAllOption: false,
+            includeSelectAllIfMoreThan: 0,
+            selectAllText: ' Select all',
+            selectAllValue: 'multiselect-all',
+            selectAllName: false,
+            selectAllNumber: true,
+            enableFiltering: false,
+            enableCaseInsensitiveFiltering: false,
+            enableClickableOptGroups: false,
+            filterPlaceholder: 'Search',
+            // possible options: 'text', 'value', 'both'
+            filterBehavior: 'text',
+            includeFilterClearBtn: true,
+            preventInputChangeEvent: false,
+            nonSelectedText: 'None selected',
+            nSelectedText: 'selected',
+            allSelectedText: 'All selected',
+            numberDisplayed: 3,
+            disableIfEmpty: false,
+            delimiterText: ', ',
+            templates: {
+                button: '<button type="button" class="multiselect dropdown-toggle" data-toggle="dropdown"><span class="multiselect-selected-text"></span> <b class="caret"></b></button>',
+                ul: '<ul class="multiselect-container dropdown-menu"></ul>',
+                filter: '<li class="multiselect-item filter"><div class="input-group"><span class="input-group-addon"><i class="glyphicon glyphicon-search"></i></span><input class="form-control multiselect-search" type="text"></div></li>',
+                filterClearBtn: '<span class="input-group-btn"><button class="btn btn-default multiselect-clear-filter" type="button"><i class="glyphicon glyphicon-remove-circle"></i></button></span>',
+                li: '<li><a tabindex="0"><label></label></a></li>',
+                divider: '<li class="multiselect-item divider"></li>',
+                liGroup: '<li class="multiselect-item multiselect-group"><label></label></li>'
+            }
+        },
+
+        constructor: Multiselect,
+
+        /**
+         * Builds the container of the multiselect.
+         */
+        buildContainer: function() {
+            this.$container = $(this.options.buttonContainer);
+            this.$container.on('show.bs.dropdown', this.options.onDropdownShow);
+            this.$container.on('hide.bs.dropdown', this.options.onDropdownHide);
+            this.$container.on('shown.bs.dropdown', this.options.onDropdownShown);
+            this.$container.on('hidden.bs.dropdown', this.options.onDropdownHidden);
+        },
+
+        /**
+         * Builds the button of the multiselect.
+         */
+        buildButton: function() {
+            this.$button = $(this.options.templates.button).addClass(this.options.buttonClass);
+            if (this.$select.attr('class') && this.options.inheritClass) {
+                this.$button.addClass(this.$select.attr('class'));
+            }
+            // Adopt active state.
+            if (this.$select.prop('disabled')) {
+                this.disable();
+            }
+            else {
+                this.enable();
+            }
+
+            // Manually add button width if set.
+            if (this.options.buttonWidth && this.options.buttonWidth !== 'auto') {
+                this.$button.css({
+                    'width' : this.options.buttonWidth,
+                    'overflow' : 'hidden',
+                    'text-overflow' : 'ellipsis'
+                });
+                this.$container.css({
+                    'width': this.options.buttonWidth
+                });
+            }
+
+            // Keep the tab index from the select.
+            var tabindex = this.$select.attr('tabindex');
+            if (tabindex) {
+                this.$button.attr('tabindex', tabindex);
+            }
+
+            this.$container.prepend(this.$button);
+        },
+
+        /**
+         * Builds the ul representing the dropdown menu.
+         */
+        buildDropdown: function() {
+
+            // Build ul.
+            this.$ul = $(this.options.templates.ul);
+
+            if (this.options.dropRight) {
+                this.$ul.addClass('pull-right');
+            }
+
+            // Set max height of dropdown menu to activate auto scrollbar.
+            if (this.options.maxHeight) {
+                // TODO: Add a class for this option to move the css declarations.
+                this.$ul.css({
+                    'max-height': this.options.maxHeight + 'px',
+                    'overflow-y': 'auto',
+                    'overflow-x': 'hidden'
+                });
+            }
+
+            this.$container.append(this.$ul);
+        },
+
+        /**
+         * Build the dropdown options and binds all nessecary events.
+         * 
+         * Uses createDivider and createOptionValue to create the necessary options.
+         */
+        buildDropdownOptions: function() {
+
+            this.$select.children().each($.proxy(function(index, element) {
+
+                var $element = $(element);
+                // Support optgroups and options without a group simultaneously.
+                var tag = $element.prop('tagName')
+                    .toLowerCase();
+            
+                if ($element.prop('value') === this.options.selectAllValue) {
+                    return;
+                }
+
+                if (tag === 'optgroup') {
+                    this.createOptgroup(element);
+                }
+                else if (tag === 'option') {
+
+                    if ($element.data('role') === 'divider') {
+                        this.createDivider();
+                    }
+                    else {
+                        this.createOptionValue(element);
+                    }
+
+                }
+
+                // Other illegal tags will be ignored.
+            }, this));
+
+            // Bind the change event on the dropdown elements.
+            $('li input', this.$ul).on('change', $.proxy(function(event) {
+                var $target = $(event.target);
+
+                var checked = $target.prop('checked') || false;
+                var isSelectAllOption = $target.val() === this.options.selectAllValue;
+
+                // Apply or unapply the configured selected class.
+                if (this.options.selectedClass) {
+                    if (checked) {
+                        $target.closest('li')
+                            .addClass(this.options.selectedClass);
+                    }
+                    else {
+                        $target.closest('li')
+                            .removeClass(this.options.selectedClass);
+                    }
+                }
+
+                // Get the corresponding option.
+                var value = $target.val();
+                var $option = this.getOptionByValue(value);
+
+                var $optionsNotThis = $('option', this.$select).not($option);
+                var $checkboxesNotThis = $('input', this.$container).not($target);
+
+                if (isSelectAllOption) {
+                    if (checked) {
+                        this.selectAll();
+                    }
+                    else {
+                        this.deselectAll();
+                    }
+                }
+
+                if(!isSelectAllOption){
+                    if (checked) {
+                        $option.prop('selected', true);
+
+                        if (this.options.multiple) {
+                            // Simply select additional option.
+                            $option.prop('selected', true);
+                        }
+                        else {
+                            // Unselect all other options and corresponding checkboxes.
+                            if (this.options.selectedClass) {
+                                $($checkboxesNotThis).closest('li').removeClass(this.options.selectedClass);
+                            }
+
+                            $($checkboxesNotThis).prop('checked', false);
+                            $optionsNotThis.prop('selected', false);
+
+                            // It's a single selection, so close.
+                            this.$button.click();
+                        }
+
+                        if (this.options.selectedClass === "active") {
+                            $optionsNotThis.closest("a").css("outline", "");
+                        }
+                    }
+                    else {
+                        // Unselect option.
+                        $option.prop('selected', false);
+                    }
+                }
+
+                this.$select.change();
+
+                this.updateButtonText();
+                this.updateSelectAll();
+
+                this.options.onChange($option, checked);
+
+                if(this.options.preventInputChangeEvent) {
+                    return false;
+                }
+            }, this));
+
+            $('li a', this.$ul).on('mousedown', function(e) {
+                if (e.shiftKey) {
+                    // Prevent selecting text by Shift+click
+                    return false;
+                }
+            });
+        
+            $('li a', this.$ul).on('touchstart click', $.proxy(function(event) {
+                event.stopPropagation();
+
+                var $target = $(event.target);
+                
+                if (event.shiftKey && this.options.multiple) {
+                    if($target.is("label")){ // Handles checkbox selection manually (see https://github.com/davidstutz/bootstrap-multiselect/issues/431)
+                        event.preventDefault();
+                        $target = $target.find("input");
+                        $target.prop("checked", !$target.prop("checked"));
+                    }
+                    var checked = $target.prop('checked') || false;
+
+                    if (this.lastToggledInput !== null && this.lastToggledInput !== $target) { // Make sure we actually have a range
+                        var from = $target.closest("li").index();
+                        var to = this.lastToggledInput.closest("li").index();
+                        
+                        if (from > to) { // Swap the indices
+                            var tmp = to;
+                            to = from;
+                            from = tmp;
+                        }
+                        
+                        // Make sure we grab all elements since slice excludes the last index
+                        ++to;
+                        
+                        // Change the checkboxes and underlying options
+                        var range = this.$ul.find("li").slice(from, to).find("input");
+                        
+                        range.prop('checked', checked);
+                        
+                        if (this.options.selectedClass) {
+                            range.closest('li')
+                                .toggleClass(this.options.selectedClass, checked);
+                        }
+                        
+                        for (var i = 0, j = range.length; i < j; i++) {
+                            var $checkbox = $(range[i]);
+
+                            var $option = this.getOptionByValue($checkbox.val());
+
+                            $option.prop('selected', checked);
+                        }                   
+                    }
+                    
+                    // Trigger the select "change" event
+                    $target.trigger("change");
+                }
+                
+                // Remembers last clicked option
+                if($target.is("input") && !$target.closest("li").is(".multiselect-item")){
+                    this.lastToggledInput = $target;
+                }
+
+                $target.blur();
+            }, this));
+
+            // Keyboard support.
+            this.$container.off('keydown.multiselect').on('keydown.multiselect', $.proxy(function(event) {
+                if ($('input[type="text"]', this.$container).is(':focus')) {
+                    return;
+                }
+
+                if (event.keyCode === 9 && this.$container.hasClass('open')) {
+                    this.$button.click();
+                }
+                else {
+                    var $items = $(this.$container).find("li:not(.divider):not(.disabled) a").filter(":visible");
+
+                    if (!$items.length) {
+                        return;
+                    }
+
+                    var index = $items.index($items.filter(':focus'));
+
+                    // Navigation up.
+                    if (event.keyCode === 38 && index > 0) {
+                        index--;
+                    }
+                    // Navigate down.
+                    else if (event.keyCode === 40 && index < $items.length - 1) {
+                        index++;
+                    }
+                    else if (!~index) {
+                        index = 0;
+                    }
+
+                    var $current = $items.eq(index);
+                    $current.focus();
+
+                    if (event.keyCode === 32 || event.keyCode === 13) {
+                        var $checkbox = $current.find('input');
+
+                        $checkbox.prop("checked", !$checkbox.prop("checked"));
+                        $checkbox.change();
+                    }
+
+                    event.stopPropagation();
+                    event.preventDefault();
+                }
+            }, this));
+
+            if(this.options.enableClickableOptGroups && this.options.multiple) {
+                $('li.multiselect-group', this.$ul).on('click', $.proxy(function(event) {
+                    event.stopPropagation();
+
+                    var group = $(event.target).parent();
+
+                    // Search all option in optgroup
+                    var $options = group.nextUntil('li.multiselect-group');
+                    var $visibleOptions = $options.filter(":visible:not(.disabled)");
+
+                    // check or uncheck items
+                    var allChecked = true;
+                    var optionInputs = $visibleOptions.find('input');
+                    optionInputs.each(function() {
+                        allChecked = allChecked && $(this).prop('checked');
+                    });
+
+                    optionInputs.prop('checked', !allChecked).trigger('change');
+               }, this));
+            }
+        },
+
+        /**
+         * Create an option using the given select option.
+         *
+         * @param {jQuery} element
+         */
+        createOptionValue: function(element) {
+            var $element = $(element);
+            if ($element.is(':selected')) {
+                $element.prop('selected', true);
+            }
+
+            // Support the label attribute on options.
+            var label = this.options.optionLabel(element);
+            var value = $element.val();
+            var inputType = this.options.multiple ? "checkbox" : "radio";
+
+            var $li = $(this.options.templates.li);
+            var $label = $('label', $li);
+            $label.addClass(inputType);
+
+            if (this.options.enableHTML) {
+                $label.html(" " + label);
+            }
+            else {
+                $label.text(" " + label);
+            }
+        
+            var $checkbox = $('<input/>').attr('type', inputType);
+
+            if (this.options.checkboxName) {
+                $checkbox.attr('name', this.options.checkboxName);
+            }
+            $label.prepend($checkbox);
+
+            var selected = $element.prop('selected') || false;
+            $checkbox.val(value);
+
+            if (value === this.options.selectAllValue) {
+                $li.addClass("multiselect-item multiselect-all");
+                $checkbox.parent().parent()
+                    .addClass('multiselect-all');
+            }
+
+            $label.attr('title', $element.attr('title'));
+
+            this.$ul.append($li);
+
+            if ($element.is(':disabled')) {
+                $checkbox.attr('disabled', 'disabled')
+                    .prop('disabled', true)
+                    .closest('a')
+                    .attr("tabindex", "-1")
+                    .closest('li')
+                    .addClass('disabled');
+            }
+
+            $checkbox.prop('checked', selected);
+
+            if (selected && this.options.selectedClass) {
+                $checkbox.closest('li')
+                    .addClass(this.options.selectedClass);
+            }
+        },
+
+        /**
+         * Creates a divider using the given select option.
+         *
+         * @param {jQuery} element
+         */
+        createDivider: function(element) {
+            var $divider = $(this.options.templates.divider);
+            this.$ul.append($divider);
+        },
+
+        /**
+         * Creates an optgroup.
+         *
+         * @param {jQuery} group
+         */
+        createOptgroup: function(group) {
+            var groupName = $(group).prop('label');
+
+            // Add a header for the group.
+            var $li = $(this.options.templates.liGroup);
+            
+            if (this.options.enableHTML) {
+                $('label', $li).html(groupName);
+            }
+            else {
+                $('label', $li).text(groupName);
+            }
+            
+            if (this.options.enableClickableOptGroups) {
+                $li.addClass('multiselect-group-clickable');
+            }
+
+            this.$ul.append($li);
+
+            if ($(group).is(':disabled')) {
+                $li.addClass('disabled');
+            }
+
+            // Add the options of the group.
+            $('option', group).each($.proxy(function(index, element) {
+                this.createOptionValue(element);
+            }, this));
+        },
+
+        /**
+         * Build the selct all.
+         * 
+         * Checks if a select all has already been created.
+         */
+        buildSelectAll: function() {
+            if (typeof this.options.selectAllValue === 'number') {
+                this.options.selectAllValue = this.options.selectAllValue.toString();
+            }
+            
+            var alreadyHasSelectAll = this.hasSelectAll();
+
+            if (!alreadyHasSelectAll && this.options.includeSelectAllOption && this.options.multiple
+                    && $('option', this.$select).length > this.options.includeSelectAllIfMoreThan) {
+
+                // Check whether to add a divider after the select all.
+                if (this.options.includeSelectAllDivider) {
+                    this.$ul.prepend($(this.options.templates.divider));
+                }
+
+                var $li = $(this.options.templates.li);
+                $('label', $li).addClass("checkbox");
+                
+                if (this.options.enableHTML) {
+                    $('label', $li).html(" " + this.options.selectAllText);
+                }
+                else {
+                    $('label', $li).text(" " + this.options.selectAllText);
+                }
+                
+                if (this.options.selectAllName) {
+                    $('label', $li).prepend('<input type="checkbox" name="' + this.options.selectAllName + '" />');
+                }
+                else {
+                    $('label', $li).prepend('<input type="checkbox" />');
+                }
+                
+                var $checkbox = $('input', $li);
+                $checkbox.val(this.options.selectAllValue);
+
+                $li.addClass("multiselect-item multiselect-all");
+                $checkbox.parent().parent()
+                    .addClass('multiselect-all');
+
+                this.$ul.prepend($li);
+
+                $checkbox.prop('checked', false);
+            }
+        },
+
+        /**
+         * Builds the filter.
+         */
+        buildFilter: function() {
+
+            // Build filter if filtering OR case insensitive filtering is enabled and the number of options exceeds (or equals) enableFilterLength.
+            if (this.options.enableFiltering || this.options.enableCaseInsensitiveFiltering) {
+                var enableFilterLength = Math.max(this.options.enableFiltering, this.options.enableCaseInsensitiveFiltering);
+
+                if (this.$select.find('option').length >= enableFilterLength) {
+
+                    this.$filter = $(this.options.templates.filter);
+                    $('input', this.$filter).attr('placeholder', this.options.filterPlaceholder);
+                    
+                    // Adds optional filter clear button
+                    if(this.options.includeFilterClearBtn){
+                        var clearBtn = $(this.options.templates.filterClearBtn);
+                        clearBtn.on('click', $.proxy(function(event){
+                            clearTimeout(this.searchTimeout);
+                            this.$filter.find('.multiselect-search').val('');
+                            $('li', this.$ul).show().removeClass("filter-hidden");
+                            this.updateSelectAll();
+                        }, this));
+                        this.$filter.find('.input-group').append(clearBtn);
+                    }
+                    
+                    this.$ul.prepend(this.$filter);
+
+                    this.$filter.val(this.query).on('click', function(event) {
+                        event.stopPropagation();
+                    }).on('input keydown', $.proxy(function(event) {
+                        // Cancel enter key default behaviour
+                        if (event.which === 13) {
+                          event.preventDefault();
+                        }
+                        
+                        // This is useful to catch "keydown" events after the browser has updated the control.
+                        clearTimeout(this.searchTimeout);
+
+                        this.searchTimeout = this.asyncFunction($.proxy(function() {
+
+                            if (this.query !== event.target.value) {
+                                this.query = event.target.value;
+
+                                var currentGroup, currentGroupVisible;
+                                $.each($('li', this.$ul), $.proxy(function(index, element) {
+                                    var value = $('input', element).length > 0 ? $('input', element).val() : "";
+                                    var text = $('label', element).text();
+
+                                    var filterCandidate = '';
+                                    if ((this.options.filterBehavior === 'text')) {
+                                        filterCandidate = text;
+                                    }
+                                    else if ((this.options.filterBehavior === 'value')) {
+                                        filterCandidate = value;
+                                    }
+                                    else if (this.options.filterBehavior === 'both') {
+                                        filterCandidate = text + '\n' + value;
+                                    }
+
+                                    if (value !== this.options.selectAllValue && text) {
+                                        // By default lets assume that element is not
+                                        // interesting for this search.
+                                        var showElement = false;
+
+                                        if (this.options.enableCaseInsensitiveFiltering && filterCandidate.toLowerCase().indexOf(this.query.toLowerCase()) > -1) {
+                                            showElement = true;
+                                        }
+                                        else if (filterCandidate.indexOf(this.query) > -1) {
+                                            showElement = true;
+                                        }
+
+                                        // Toggle current element (group or group item) according to showElement boolean.
+                                        $(element).toggle(showElement).toggleClass('filter-hidden', !showElement);
+                                        
+                                        // Differentiate groups and group items.
+                                        if ($(element).hasClass('multiselect-group')) {
+                                            // Remember group status.
+                                            currentGroup = element;
+                                            currentGroupVisible = showElement;
+                                        }
+                                        else {
+                                            // Show group name when at least one of its items is visible.
+                                            if (showElement) {
+                                                $(currentGroup).show().removeClass('filter-hidden');
+                                            }
+                                            
+                                            // Show all group items when group name satisfies filter.
+                                            if (!showElement && currentGroupVisible) {
+                                                $(element).show().removeClass('filter-hidden');
+                                            }
+                                        }
+                                    }
+                                }, this));
+                            }
+
+                            this.updateSelectAll();
+                        }, this), 300, this);
+                    }, this));
+                }
+            }
+        },
+
+        /**
+         * Unbinds the whole plugin.
+         */
+        destroy: function() {
+            this.$container.remove();
+            this.$select.show();
+            this.$select.data('multiselect', null);
+        },
+
+        /**
+         * Refreshs the multiselect based on the selected options of the select.
+         */
+        refresh: function() {
+            $('option', this.$select).each($.proxy(function(index, element) {
+                var $input = $('li input', this.$ul).filter(function() {
+                    return $(this).val() === $(element).val();
+                });
+
+                if ($(element).is(':selected')) {
+                    $input.prop('checked', true);
+
+                    if (this.options.selectedClass) {
+                        $input.closest('li')
+                            .addClass(this.options.selectedClass);
+                    }
+                }
+                else {
+                    $input.prop('checked', false);
+
+                    if (this.options.selectedClass) {
+                        $input.closest('li')
+                            .removeClass(this.options.selectedClass);
+                    }
+                }
+
+                if ($(element).is(":disabled")) {
+                    $input.attr('disabled', 'disabled')
+                        .prop('disabled', true)
+                        .closest('li')
+                        .addClass('disabled');
+                }
+                else {
+                    $input.prop('disabled', false)
+                        .closest('li')
+                        .removeClass('disabled');
+                }
+            }, this));
+
+            this.updateButtonText();
+            this.updateSelectAll();
+        },
+
+        /**
+         * Select all options of the given values.
+         * 
+         * If triggerOnChange is set to true, the on change event is triggered if
+         * and only if one value is passed.
+         * 
+         * @param {Array} selectValues
+         * @param {Boolean} triggerOnChange
+         */
+        select: function(selectValues, triggerOnChange) {
+            if(!$.isArray(selectValues)) {
+                selectValues = [selectValues];
+            }
+
+            for (var i = 0; i < selectValues.length; i++) {
+                var value = selectValues[i];
+
+                if (value === null || value === undefined) {
+                    continue;
+                }
+
+                var $option = this.getOptionByValue(value);
+                var $checkbox = this.getInputByValue(value);
+
+                if($option === undefined || $checkbox === undefined) {
+                    continue;
+                }
+                
+                if (!this.options.multiple) {
+                    this.deselectAll(false);
+                }
+                
+                if (this.options.selectedClass) {
+                    $checkbox.closest('li')
+                        .addClass(this.options.selectedClass);
+                }
+
+                $checkbox.prop('checked', true);
+                $option.prop('selected', true);
+                
+                if (triggerOnChange) {
+                    this.options.onChange($option, true);
+                }
+            }
+
+            this.updateButtonText();
+            this.updateSelectAll();
+        },
+
+        /**
+         * Clears all selected items.
+         */
+        clearSelection: function () {
+            this.deselectAll(false);
+            this.updateButtonText();
+            this.updateSelectAll();
+        },
+
+        /**
+         * Deselects all options of the given values.
+         * 
+         * If triggerOnChange is set to true, the on change event is triggered, if
+         * and only if one value is passed.
+         * 
+         * @param {Array} deselectValues
+         * @param {Boolean} triggerOnChange
+         */
+        deselect: function(deselectValues, triggerOnChange) {
+            if(!$.isArray(deselectValues)) {
+                deselectValues = [deselectValues];
+            }
+
+            for (var i = 0; i < deselectValues.length; i++) {
+                var value = deselectValues[i];
+
+                if (value === null || value === undefined) {
+                    continue;
+                }
+
+                var $option = this.getOptionByValue(value);
+                var $checkbox = this.getInputByValue(value);
+
+                if($option === undefined || $checkbox === undefined) {
+                    continue;
+                }
+
+                if (this.options.selectedClass) {
+                    $checkbox.closest('li')
+                        .removeClass(this.options.selectedClass);
+                }
+
+                $checkbox.prop('checked', false);
+                $option.prop('selected', false);
+                
+                if (triggerOnChange) {
+                    this.options.onChange($option, false);
+                }
+            }
+
+            this.updateButtonText();
+            this.updateSelectAll();
+        },
+        
+        /**
+         * Selects all enabled & visible options.
+         *
+         * If justVisible is true or not specified, only visible options are selected.
+         *
+         * @param {Boolean} justVisible
+         * @param {Boolean} triggerOnSelectAll
+         */
+        selectAll: function (justVisible, triggerOnSelectAll) {
+            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+            var allCheckboxes = $("li input[type='checkbox']:enabled", this.$ul);
+            var visibleCheckboxes = allCheckboxes.filter(":visible");
+            var allCheckboxesCount = allCheckboxes.length;
+            var visibleCheckboxesCount = visibleCheckboxes.length;
+            
+            if(justVisible) {
+                visibleCheckboxes.prop('checked', true);
+                $("li:not(.divider):not(.disabled)", this.$ul).filter(":visible").addClass(this.options.selectedClass);
+            }
+            else {
+                allCheckboxes.prop('checked', true);
+                $("li:not(.divider):not(.disabled)", this.$ul).addClass(this.options.selectedClass);
+            }
+                
+            if (allCheckboxesCount === visibleCheckboxesCount || justVisible === false) {
+                $("option:enabled", this.$select).prop('selected', true);
+            }
+            else {
+                var values = visibleCheckboxes.map(function() {
+                    return $(this).val();
+                }).get();
+                
+                $("option:enabled", this.$select).filter(function(index) {
+                    return $.inArray($(this).val(), values) !== -1;
+                }).prop('selected', true);
+            }
+            
+            if (triggerOnSelectAll) {
+                this.options.onSelectAll();
+            }
+        },
+
+        /**
+         * Deselects all options.
+         * 
+         * If justVisible is true or not specified, only visible options are deselected.
+         * 
+         * @param {Boolean} justVisible
+         */
+        deselectAll: function (justVisible) {
+            var justVisible = typeof justVisible === 'undefined' ? true : justVisible;
+            
+            if(justVisible) {              
+                var visibleCheckboxes = $("li input[type='checkbox']:not(:disabled)", this.$ul).filter(":visible");
+                visibleCheckboxes.prop('checked', false);
+                
+                var values = visibleCheckboxes.map(function() {
+                    return $(this).val();
+                }).get();
+                
+                $("option:enabled", this.$select).filter(function(index) {
+                    return $.inArray($(this).val(), values) !== -1;
+                }).prop('selected', false);
+                
+                if (this.options.selectedClass) {
+                    $("li:not(.divider):not(.disabled)", this.$ul).filter(":visible").removeClass(this.options.selectedClass);
+                }
+            }
+            else {
+                $("li input[type='checkbox']:enabled", this.$ul).prop('checked', false);
+                $("option:enabled", this.$select).prop('selected', false);
+                
+                if (this.options.selectedClass) {
+                    $("li:not(.divider):not(.disabled)", this.$ul).removeClass(this.options.selectedClass);
+                }
+            }
+        },
+
+        /**
+         * Rebuild the plugin.
+         * 
+         * Rebuilds the dropdown, the filter and the select all option.
+         */
+        rebuild: function() {
+            this.$ul.html('');
+
+            // Important to distinguish between radios and checkboxes.
+            this.options.multiple = this.$select.attr('multiple') === "multiple";
+
+            this.buildSelectAll();
+            this.buildDropdownOptions();
+            this.buildFilter();
+
+            this.updateButtonText();
+            this.updateSelectAll();
+            
+            if (this.options.disableIfEmpty && $('option', this.$select).length <= 0) {
+                this.disable();
+            }
+            else {
+                this.enable();
+            }
+            
+            if (this.options.dropRight) {
+                this.$ul.addClass('pull-right');
+            }
+        },
+
+        /**
+         * The provided data will be used to build the dropdown.
+         */
+        dataprovider: function(dataprovider) {
+            
+            var groupCounter = 0;
+            var $select = this.$select.empty();
+            
+            $.each(dataprovider, function (index, option) {
+                var $tag;
+                
+                if ($.isArray(option.children)) { // create optiongroup tag
+                    groupCounter++;
+                    
+                    $tag = $('<optgroup/>').attr({
+                        label: option.label || 'Group ' + groupCounter,
+                        disabled: !!option.disabled
+                    });
+                    
+                    forEach(option.children, function(subOption) { // add children option tags
+                        $tag.append($('<option/>').attr({
+                            value: subOption.value,
+                            label: subOption.label || subOption.value,
+                            title: subOption.title,
+                            selected: !!subOption.selected,
+                            disabled: !!subOption.disabled
+                        }));
+                    });
+                }
+                else {
+                    $tag = $('<option/>').attr({
+                        value: option.value,
+                        label: option.label || option.value,
+                        title: option.title,
+                        selected: !!option.selected,
+                        disabled: !!option.disabled
+                    });
+                }
+                
+                $select.append($tag);
+            });
+            
+            this.rebuild();
+        },
+
+        /**
+         * Enable the multiselect.
+         */
+        enable: function() {
+            this.$select.prop('disabled', false);
+            this.$button.prop('disabled', false)
+                .removeClass('disabled');
+        },
+
+        /**
+         * Disable the multiselect.
+         */
+        disable: function() {
+            this.$select.prop('disabled', true);
+            this.$button.prop('disabled', true)
+                .addClass('disabled');
+        },
+
+        /**
+         * Set the options.
+         *
+         * @param {Array} options
+         */
+        setOptions: function(options) {
+            this.options = this.mergeOptions(options);
+        },
+
+        /**
+         * Merges the given options with the default options.
+         *
+         * @param {Array} options
+         * @returns {Array}
+         */
+        mergeOptions: function(options) {
+            return $.extend(true, {}, this.defaults, this.options, options);
+        },
+
+        /**
+         * Checks whether a select all checkbox is present.
+         *
+         * @returns {Boolean}
+         */
+        hasSelectAll: function() {
+            return $('li.multiselect-all', this.$ul).length > 0;
+        },
+
+        /**
+         * Updates the select all checkbox based on the currently displayed and selected checkboxes.
+         */
+        updateSelectAll: function() {
+            if (this.hasSelectAll()) {
+                var allBoxes = $("li:not(.multiselect-item):not(.filter-hidden) input:enabled", this.$ul);
+                var allBoxesLength = allBoxes.length;
+                var checkedBoxesLength = allBoxes.filter(":checked").length;
+                var selectAllLi  = $("li.multiselect-all", this.$ul);
+                var selectAllInput = selectAllLi.find("input");
+                
+                if (checkedBoxesLength > 0 && checkedBoxesLength === allBoxesLength) {
+                    selectAllInput.prop("checked", true);
+                    selectAllLi.addClass(this.options.selectedClass);
+                    this.options.onSelectAll();
+                }
+                else {
+                    selectAllInput.prop("checked", false);
+                    selectAllLi.removeClass(this.options.selectedClass);
+                }
+            }
+        },
+
+        /**
+         * Update the button text and its title based on the currently selected options.
+         */
+        updateButtonText: function() {
+            var options = this.getSelected();
+            
+            // First update the displayed button text.
+            if (this.options.enableHTML) {
+                $('.multiselect .multiselect-selected-text', this.$container).html(this.options.buttonText(options, this.$select));
+            }
+            else {
+                $('.multiselect .multiselect-selected-text', this.$container).text(this.options.buttonText(options, this.$select));
+            }
+            
+            // Now update the title attribute of the button.
+            $('.multiselect', this.$container).attr('title', this.options.buttonTitle(options, this.$select));
+        },
+
+        /**
+         * Get all selected options.
+         *
+         * @returns {jQUery}
+         */
+        getSelected: function() {
+            return $('option', this.$select).filter(":selected");
+        },
+
+        /**
+         * Gets a select option by its value.
+         *
+         * @param {String} value
+         * @returns {jQuery}
+         */
+        getOptionByValue: function (value) {
+
+            var options = $('option', this.$select);
+            var valueToCompare = value.toString();
+
+            for (var i = 0; i < options.length; i = i + 1) {
+                var option = options[i];
+                if (option.value === valueToCompare) {
+                    return $(option);
+                }
+            }
+        },
+
+        /**
+         * Get the input (radio/checkbox) by its value.
+         *
+         * @param {String} value
+         * @returns {jQuery}
+         */
+        getInputByValue: function (value) {
+
+            var checkboxes = $('li input', this.$ul);
+            var valueToCompare = value.toString();
+
+            for (var i = 0; i < checkboxes.length; i = i + 1) {
+                var checkbox = checkboxes[i];
+                if (checkbox.value === valueToCompare) {
+                    return $(checkbox);
+                }
+            }
+        },
+
+        /**
+         * Used for knockout integration.
+         */
+        updateOriginalOptions: function() {
+            this.originalOptions = this.$select.clone()[0].options;
+        },
+
+        asyncFunction: function(callback, timeout, self) {
+            var args = Array.prototype.slice.call(arguments, 3);
+            return setTimeout(function() {
+                callback.apply(self || window, args);
+            }, timeout);
+        },
+
+        setAllSelectedText: function(allSelectedText) {
+            this.options.allSelectedText = allSelectedText;
+            this.updateButtonText();
+        }
+    };
+
+    $.fn.multiselect = function(option, parameter, extraOptions) {
+        return this.each(function() {
+            var data = $(this).data('multiselect');
+            var options = typeof option === 'object' && option;
+
+            // Initialize the multiselect.
+            if (!data) {
+                data = new Multiselect(this, options);
+                $(this).data('multiselect', data);
+            }
+
+            // Call multiselect method.
+            if (typeof option === 'string') {
+                data[option](parameter, extraOptions);
+                
+                if (option === 'destroy') {
+                    $(this).data('multiselect', false);
+                }
+            }
+        });
+    };
+
+    $.fn.multiselect.Constructor = Multiselect;
+
+    $(function() {
+        $("select[data-role=multiselect]").multiselect();
+    });
+
+}(window.jQuery);
diff --git a/js/third-party/footable/footable-components.latest/css/footable.core.bootstrap.min.css b/js/third-party/footable/footable-components.latest/css/footable.core.bootstrap.min.css
new file mode 100644
index 0000000..771e966
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/css/footable.core.bootstrap.min.css
@@ -0,0 +1 @@
+table.footable,table.footable-details{position:relative;width:100%;border-spacing:0;border-collapse:collapse}table.footable-details{margin-bottom:0}table.footable-hide-fouc{display:none}table>tbody>tr>td>span.footable-toggle{margin-right:8px;opacity:.3}table>tbody>tr>td>span.footable-toggle.last-column{margin-left:8px;float:right}table.table-condensed>tbody>tr>td>span.footable-toggle{margin-right:5px}table.footable-details>tbody>tr>th:nth-child(1){min-width:40px;width:120px}table.footable-details>tbody>tr>td:nth-child(2){word-break:break-all}table.footable-details>tbody>tr:first-child>td,table.footable-details>tbody>tr:first-child>th,table.footable-details>tfoot>tr:first-child>td,table.footable-details>tfoot>tr:first-child>th,table.footable-details>thead>tr:first-child>td,table.footable-details>thead>tr:first-child>th{border-top-width:0}table.footable-details.table-bordered>tbody>tr:first-child>td,table.footable-details.table-bordered>tbody>tr:first-child>th,table.footable-details.table-bordered>tfoot>tr:first-child>td,table.footable-details.table-bordered>tfoot>tr:first-child>th,table.footable-details.table-bordered>thead>tr:first-child>td,table.footable-details.table-bordered>thead>tr:first-child>th{border-top-width:1px}div.footable-loader{vertical-align:middle;text-align:center;height:300px;position:relative}div.footable-loader>span.fooicon{display:inline-block;opacity:.3;font-size:30px;line-height:32px;width:32px;height:32px;margin-top:-16px;margin-left:-16px;position:absolute;top:50%;left:50%;-webkit-animation:fooicon-spin-r 2s infinite linear;animation:fooicon-spin-r 2s infinite linear}table.footable>tbody>tr.footable-empty>td{vertical-align:middle;text-align:center;font-size:30px}table.footable>tbody>tr>td,table.footable>tbody>tr>th{display:none}table.footable>tbody>tr.footable-detail-row>td,table.footable>tbody>tr.footable-detail-row>th,table.footable>tbody>tr.footable-empty>td,table.footable>tbody>tr.footable-empty>th{display:table-cell}@-webkit-keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fooicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings'!important;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fooicon:after,.fooicon:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fooicon-loader:before{content:"\e030"}.fooicon-plus:before{content:"\2b"}.fooicon-minus:before{content:"\2212"}.fooicon-search:before{content:"\e003"}.fooicon-remove:before{content:"\e014"}.fooicon-sort:before{content:"\e150"}.fooicon-sort-asc:before{content:"\e155"}.fooicon-sort-desc:before{content:"\e156"}.fooicon-pencil:before{content:"\270f"}.fooicon-trash:before{content:"\e020"}.fooicon-eye-close:before{content:"\e106"}.fooicon-flash:before{content:"\e162"}.fooicon-cog:before{content:"\e019"}.fooicon-stats:before{content:"\e185"}
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/css/footable.core.standalone.min.css b/js/third-party/footable/footable-components.latest/css/footable.core.standalone.min.css
new file mode 100644
index 0000000..ca4cdc6
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/css/footable.core.standalone.min.css
@@ -0,0 +1 @@
+.footable .btn,.footable .caret{display:inline-block;vertical-align:middle}.footable-details.table,.footable-details.table *,.footable.table,.footable.table *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.footable-details.table th,.footable.table th{text-align:left}.footable-details.table,.footable.table{width:100%;max-width:100%;margin-bottom:20px}.footable-details.table>caption+thead>tr:first-child>td,.footable-details.table>caption+thead>tr:first-child>th,.footable-details.table>colgroup+thead>tr:first-child>td,.footable-details.table>colgroup+thead>tr:first-child>th,.footable-details.table>thead:first-child>tr:first-child>td,.footable-details.table>thead:first-child>tr:first-child>th,.footable.table>caption+thead>tr:first-child>td,.footable.table>caption+thead>tr:first-child>th,.footable.table>colgroup+thead>tr:first-child>td,.footable.table>colgroup+thead>tr:first-child>th,.footable.table>thead:first-child>tr:first-child>td,.footable.table>thead:first-child>tr:first-child>th{border-top:0}.footable-details.table>tbody>tr>td,.footable-details.table>tbody>tr>th,.footable-details.table>tfoot>tr>td,.footable-details.table>tfoot>tr>th,.footable-details.table>thead>tr>td,.footable-details.table>thead>tr>th,.footable.table>tbody>tr>td,.footable.table>tbody>tr>th,.footable.table>tfoot>tr>td,.footable.table>tfoot>tr>th,.footable.table>thead>tr>td,.footable.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.footable-details.table>thead>tr>td,.footable-details.table>thead>tr>th,.footable.table>thead>tr>td,.footable.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.footable-details.table-condensed>tbody>tr>td,.footable-details.table-condensed>tbody>tr>th,.footable-details.table-condensed>tfoot>tr>td,.footable-details.table-condensed>tfoot>tr>th,.footable-details.table-condensed>thead>tr>td,.footable-details.table-condensed>thead>tr>th,.footable.table-condensed>tbody>tr>td,.footable.table-condensed>tbody>tr>th,.footable.table-condensed>tfoot>tr>td,.footable.table-condensed>tfoot>tr>th,.footable.table-condensed>thead>tr>td,.footable.table-condensed>thead>tr>th{padding:5px}.footable-details.table-bordered,.footable-details.table-bordered>tbody>tr>td,.footable-details.table-bordered>tbody>tr>th,.footable-details.table-bordered>tfoot>tr>td,.footable-details.table-bordered>tfoot>tr>th,.footable-details.table-bordered>thead>tr>td,.footable-details.table-bordered>thead>tr>th,.footable.table-bordered,.footable.table-bordered>tbody>tr>td,.footable.table-bordered>tbody>tr>th,.footable.table-bordered>tfoot>tr>td,.footable.table-bordered>tfoot>tr>th,.footable.table-bordered>thead>tr>td,.footable.table-bordered>thead>tr>th{border:1px solid #ddd}.footable-details.table-bordered>thead>tr>td,.footable-details.table-bordered>thead>tr>th,.footable.table-bordered>thead>tr>td,.footable.table-bordered>thead>tr>th{border-bottom-width:2px}.footable-details.table-striped>tbody>tr:nth-child(odd),.footable.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.footable-details.table-hover>tbody>tr:hover,.footable.table-hover>tbody>tr:hover{background-color:#f5f5f5}.footable .btn{padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px;overflow:visible;text-transform:none}.footable .btn.focus,.footable .btn:focus,.footable .btn:hover{color:#333;text-decoration:none}.footable .btn-default{color:#333;background-color:#fff;border-color:#ccc}.footable .btn-default.active,.footable .btn-default.focus,.footable .btn-default:active,.footable .btn-default:focus,.footable .btn-default:hover,.footable .open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.footable .btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.footable .btn-primary.active,.footable .btn-primary.focus,.footable .btn-primary:active,.footable .btn-primary:focus,.footable .btn-primary:hover,.footable .open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.footable .btn-group,.footable .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.footable .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.footable .btn-group>.btn:first-child{margin-left:0}.footable .btn-group-vertical>.btn,.footable .btn-group>.btn{position:relative;float:left}.footable .btn-group-xs>.btn,.footable .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.footable .btn-group-sm>.btn,.footable .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.footable .btn-group-lg>.btn,.footable .btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.footable .caret{width:0;height:0;margin-left:2px;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.footable .btn .caret{margin-left:0}.form-group{margin-bottom:15px}.footable .form-control{display:block;width:100%;height:34px;padding:6px 12px;margin:0;font-family:inherit;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.footable .input-group{position:relative;display:table;border-collapse:separate}.footable .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.footable .input-group-btn{position:relative;font-size:0}.footable .input-group-addon,.footable .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.footable .input-group .form-control,.footable .input-group-addon,.footable .input-group-btn{display:table-cell}.footable .input-group-btn:last-child>.btn,.footable .input-group-btn:last-child>.btn-group,.footable .input-group-btn>.btn+.btn{margin-left:-1px}.footable .input-group-btn>.btn{position:relative}.footable .input-group-btn>.btn:active,.footable .input-group-btn>.btn:focus,.footable .input-group-btn>.btn:hover{z-index:2}.footable .input-group .form-control:first-child,.footable .input-group-addon:first-child,.footable .input-group-btn:first-child>.btn,.footable .input-group-btn:first-child>.btn-group>.btn,.footable .input-group-btn:first-child>.dropdown-toggle,.footable .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.footable .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.footable .input-group .form-control:last-child,.footable .input-group-addon:last-child,.footable .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.footable .input-group-btn:first-child>.btn:not(:first-child),.footable .input-group-btn:last-child>.btn,.footable .input-group-btn:last-child>.btn-group>.btn,.footable .input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.footable .checkbox,.footable .radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.footable .checkbox label,.footable .radio label{max-width:100%;min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.footable .checkbox input[type=checkbox],.footable .checkbox-inline input[type=checkbox],.footable .radio input[type=radio],.footable .radio-inline input[type=radio]{position:absolute;margin:4px 0 0 -20px;line-height:normal}.footable .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.footable .open>.dropdown-menu{display:block}.footable .dropdown-menu-right{right:0;left:auto}.footable .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.footable .dropdown-menu>li>a:focus,.footable .dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.footable .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.footable .pagination>li{display:inline}.footable .pagination>li:first-child>a,.footable .pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.footable .pagination>li>a,.footable .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.footable .pagination>li>a:focus,.footable .pagination>li>a:hover,.footable .pagination>li>span:focus,.footable .pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.footable .pagination>.active>a,.footable .pagination>.active>a:focus,.footable .pagination>.active>a:hover,.footable .pagination>.active>span,.footable .pagination>.active>span:focus,.footable .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.footable .pagination>.disabled>a,.footable .pagination>.disabled>a:focus,.footable .pagination>.disabled>a:hover,.footable .pagination>.disabled>span,.footable .pagination>.disabled>span:focus,.footable .pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.footable .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.footable .label-default{background-color:#777}.footable-loader.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.footable .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}@media (min-width:768px){.footable .form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.footable .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.footable .form-inline .input-group{display:inline-table;vertical-align:middle}.footable .form-inline .input-group .form-control,.footable .form-inline .input-group .input-group-addon,.footable .form-inline .input-group .input-group-btn{width:auto}.footable .form-inline .input-group>.form-control{width:100%}}table.footable,table.footable-details{position:relative;width:100%;border-spacing:0;border-collapse:collapse}table.footable-details{margin-bottom:0}table.footable-hide-fouc{display:none}table>tbody>tr>td>span.footable-toggle{margin-right:8px;opacity:.3}table>tbody>tr>td>span.footable-toggle.last-column{margin-left:8px;float:right}table.table-condensed>tbody>tr>td>span.footable-toggle{margin-right:5px}table.footable-details>tbody>tr>th:nth-child(1){min-width:40px;width:120px}table.footable-details>tbody>tr>td:nth-child(2){word-break:break-all}table.footable-details>tbody>tr:first-child>td,table.footable-details>tbody>tr:first-child>th,table.footable-details>tfoot>tr:first-child>td,table.footable-details>tfoot>tr:first-child>th,table.footable-details>thead>tr:first-child>td,table.footable-details>thead>tr:first-child>th{border-top-width:0}table.footable-details.table-bordered>tbody>tr:first-child>td,table.footable-details.table-bordered>tbody>tr:first-child>th,table.footable-details.table-bordered>tfoot>tr:first-child>td,table.footable-details.table-bordered>tfoot>tr:first-child>th,table.footable-details.table-bordered>thead>tr:first-child>td,table.footable-details.table-bordered>thead>tr:first-child>th{border-top-width:1px}div.footable-loader{vertical-align:middle;text-align:center;height:300px;position:relative}div.footable-loader>span.fooicon{display:inline-block;opacity:.3;font-size:30px;line-height:32px;width:32px;height:32px;margin-top:-16px;margin-left:-16px;position:absolute;top:50%;left:50%;-webkit-animation:fooicon-spin-r 2s infinite linear;animation:fooicon-spin-r 2s infinite linear}table.footable>tbody>tr.footable-empty>td{vertical-align:middle;text-align:center;font-size:30px}table.footable>tbody>tr>td,table.footable>tbody>tr>th{display:none}table.footable>tbody>tr.footable-detail-row>td,table.footable>tbody>tr.footable-detail-row>th,table.footable>tbody>tr.footable-empty>td,table.footable>tbody>tr.footable-empty>th{display:table-cell}@-webkit-keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fooicon{display:inline-block;font-size:inherit;font-family:FontAwesome!important;font-style:normal;font-weight:400;line-height:1;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.fooicon:after,.fooicon:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fooicon-loader:before{content:"\f01e"}.fooicon-plus:before{content:"\f067"}.fooicon-minus:before{content:"\f068"}.fooicon-search:before{content:"\f002"}.fooicon-remove:before{content:"\f00d"}.fooicon-sort:before{content:"\f0dc"}.fooicon-sort-asc:before{content:"\f160"}.fooicon-sort-desc:before{content:"\f161"}.fooicon-pencil:before{content:"\f040"}.fooicon-trash:before{content:"\f1f8"}.fooicon-eye-close:before{content:"\f070"}.fooicon-flash:before{content:"\f0e7"}.fooicon-cog:before{content:"\f013"}.fooicon-stats:before{content:"\f080"}
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/css/footable.editing.min.css b/js/third-party/footable/footable-components.latest/css/footable.editing.min.css
new file mode 100644
index 0000000..5bce15b
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/css/footable.editing.min.css
@@ -0,0 +1 @@
+td.footable-editing{width:90px;max-width:90px}table.footable-editing-no-delete td.footable-editing,table.footable-editing-no-edit td.footable-editing,table.footable-editing-no-view td.footable-editing{width:70px;max-width:70px}table.footable-editing-no-delete.footable-editing-no-view td.footable-editing,table.footable-editing-no-edit.footable-editing-no-delete td.footable-editing,table.footable-editing-no-edit.footable-editing-no-view td.footable-editing{width:50px;max-width:50px}table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view td.footable-editing,table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view th.footable-editing{width:0;max-width:0;display:none!important}table.footable-editing-right td.footable-editing,table.footable-editing-right tr.footable-editing{text-align:right}table.footable-editing-left td.footable-editing,table.footable-editing-left tr.footable-editing{text-align:left}table.footable-editing button.footable-add,table.footable-editing button.footable-hide,table.footable-editing-show button.footable-show,table.footable-editing.footable-editing-always-show button.footable-hide,table.footable-editing.footable-editing-always-show button.footable-show,table.footable-editing.footable-editing-always-show.footable-editing-no-add tr.footable-editing{display:none}table.footable-editing.footable-editing-always-show button.footable-add,table.footable-editing.footable-editing-show button.footable-add,table.footable-editing.footable-editing-show button.footable-hide{display:inline-block}
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/css/footable.filtering.min.css b/js/third-party/footable/footable-components.latest/css/footable.filtering.min.css
new file mode 100644
index 0000000..c64c3fa
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/css/footable.filtering.min.css
@@ -0,0 +1 @@
+table.footable>thead>tr.footable-filtering>th{border-bottom-width:1px;font-weight:400}.footable-filtering-external.footable-filtering-right,table.footable.footable-filtering-right>thead>tr.footable-filtering>th,table.footable>thead>tr.footable-filtering>th{text-align:right}.footable-filtering-external.footable-filtering-left,table.footable.footable-filtering-left>thead>tr.footable-filtering>th{text-align:left}.footable-filtering-external.footable-filtering-center,table.footable.footable-filtering-center>thead>tr.footable-filtering>th{text-align:center}table.footable>thead>tr.footable-filtering>th div.form-group{margin-bottom:0}table.footable>thead>tr.footable-filtering>th div.form-group+div.form-group{margin-top:5px}table.footable>thead>tr.footable-filtering>th div.input-group{width:100%}.footable-filtering-external ul.dropdown-menu>li>a.checkbox,table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox{margin:0;display:block;position:relative}.footable-filtering-external ul.dropdown-menu>li>a.checkbox>label,table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox>label{display:block;padding-left:20px}.footable-filtering-external ul.dropdown-menu>li>a.checkbox input[type=checkbox],table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox input[type=checkbox]{position:absolute;margin-left:-20px}@media (min-width:768px){table.footable>thead>tr.footable-filtering>th div.input-group{width:auto}table.footable>thead>tr.footable-filtering>th div.form-group{margin-left:2px;margin-right:2px}table.footable>thead>tr.footable-filtering>th div.form-group+div.form-group{margin-top:0}}
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/css/footable.paging.min.css b/js/third-party/footable/footable-components.latest/css/footable.paging.min.css
new file mode 100644
index 0000000..f5cfa8e
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/css/footable.paging.min.css
@@ -0,0 +1 @@
+.footable-paging-external ul.pagination,table.footable>tfoot>tr.footable-paging>td>ul.pagination{margin:10px 0 0}.footable-paging-external span.label,table.footable>tfoot>tr.footable-paging>td>span.label{display:inline-block;margin:0 0 10px;padding:4px 10px}.footable-paging-external.footable-paging-center,table.footable-paging-center>tfoot>tr.footable-paging>td,table.footable>tfoot>tr.footable-paging>td{text-align:center}.footable-paging-external.footable-paging-left,table.footable-paging-left>tfoot>tr.footable-paging>td{text-align:left}.footable-paging-external.footable-paging-right,table.footable-paging-right>tfoot>tr.footable-paging>td{text-align:right}ul.pagination>li.footable-page{display:none}ul.pagination>li.footable-page.visible{display:inline}
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/css/footable.sorting.min.css b/js/third-party/footable/footable-components.latest/css/footable.sorting.min.css
new file mode 100644
index 0000000..1592c94
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/css/footable.sorting.min.css
@@ -0,0 +1 @@
+table.footable>tbody>tr>td.footable-sortable,table.footable>tbody>tr>th.footable-sortable,table.footable>tfoot>tr>td.footable-sortable,table.footable>tfoot>tr>th.footable-sortable,table.footable>thead>tr>td.footable-sortable,table.footable>thead>tr>th.footable-sortable{position:relative;padding-right:30px;cursor:pointer}td.footable-sortable>span.fooicon,th.footable-sortable>span.fooicon{position:absolute;right:6px;top:50%;margin-top:-7px;opacity:0;transition:opacity .3s ease-in}td.footable-sortable.footable-asc>span.fooicon,td.footable-sortable.footable-desc>span.fooicon,td.footable-sortable:hover>span.fooicon,th.footable-sortable.footable-asc>span.fooicon,th.footable-sortable.footable-desc>span.fooicon,th.footable-sortable:hover>span.fooicon{opacity:1}table.footable-sorting-disabled td.footable-sortable.footable-asc>span.fooicon,table.footable-sorting-disabled td.footable-sortable.footable-desc>span.fooicon,table.footable-sorting-disabled td.footable-sortable:hover>span.fooicon,table.footable-sorting-disabled th.footable-sortable.footable-asc>span.fooicon,table.footable-sorting-disabled th.footable-sortable.footable-desc>span.fooicon,table.footable-sorting-disabled th.footable-sortable:hover>span.fooicon{opacity:0;visibility:hidden}
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/js/footable.core.min.js b/js/third-party/footable/footable-components.latest/js/footable.core.min.js
new file mode 100644
index 0000000..1540ab3
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/js/footable.core.min.js
@@ -0,0 +1,9 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a,b){window.console=window.console||{log:function(){},error:function(){}},a.fn.footable=function(a,c){return a=a||{},this.filter("table").each(function(d,e){b.init(e,a,c)})};var c={events:[]};b.__debug__=JSON.parse(localStorage.getItem("footable_debug"))||!1,b.__debug_options__=JSON.parse(localStorage.getItem("footable_debug_options"))||c,b.debug=function(d,e){return b.is["boolean"](d)?(b.__debug__=d,void(b.__debug__?(localStorage.setItem("footable_debug",JSON.stringify(b.__debug__)),b.__debug_options__=a.extend(!0,{},c,e||{}),b.is.hash(e)&&localStorage.setItem("footable_debug_options",JSON.stringify(b.__debug_options__))):(localStorage.removeItem("footable_debug"),localStorage.removeItem("footable_debug_options")))):b.__debug__},b.get=function(b){return a(b).first().data("__FooTable__")},b.init=function(a,c,d){var e=b.get(a);return e instanceof b.Table&&e.destroy(),new b.Table(a,c,d)},b.getRow=function(b){var c=a(b).closest("tr");return c.hasClass("footable-detail-row")&&(c=c.prev()),c.data("__FooTableRow__")}}(jQuery,FooTable=window.FooTable||{}),function(a){var b=function(){return!0};a.arr={},a.arr.each=function(b,c){if(a.is.array(b)&&a.is.fn(c))for(var d=0,e=b.length;e>d&&c(b[d],d)!==!1;d++);},a.arr.get=function(b,c){var d=[];if(!a.is.array(b))return d;if(!a.is.fn(c))return b;for(var e=0,f=b.length;f>e;e++)c(b[e],e)&&d.push(b[e]);return d},a.arr.any=function(c,d){if(!a.is.array(c))return!1;d=a.is.fn(d)?d:b;for(var e=0,f=c.length;f>e;e++)if(d(c[e],e))return!0;return!1},a.arr.contains=function(b,c){if(!a.is.array(b)||a.is.undef(c))return!1;for(var d=0,e=b.length;e>d;d++)if(b[d]==c)return!0;return!1},a.arr.first=function(c,d){if(!a.is.array(c))return null;d=a.is.fn(d)?d:b;for(var e=0,f=c.length;f>e;e++)if(d(c[e],e))return c[e];return null},a.arr.map=function(b,c){var d=[],e=null;if(!a.is.array(b)||!a.is.fn(c))return d;for(var f=0,g=b.length;g>f;f++)null!=(e=c(b[f],f))&&d.push(e);return d},a.arr.remove=function(b,c){var d=[],e=[];if(!a.is.array(b)||!a.is.fn(c))return e;for(var f=0,g=b.length;g>f;f++)c(b[f],f,e)&&(d.push(f),e.push(b[f]));for(d.sort(function(a,b){return b-a}),f=0,g=d.length;g>f;f++){var h=d[f]-f;b.splice(h,1)}return e},a.arr["delete"]=function(b,c){var d=-1,e=null;if(!a.is.array(b)||a.is.undef(c))return e;for(var f=0,g=b.length;g>f;f++)if(b[f]==c){d=f,e=b[f];break}return-1!=d&&b.splice(d,1),e},a.arr.replace=function(a,b,c){var d=a.indexOf(b);-1!==d&&(a[d]=c)}}(FooTable),function(a){a.is={},a.is.type=function(a,b){return typeof a===b},a.is.defined=function(a){return"undefined"!=typeof a},a.is.undef=function(a){return"undefined"==typeof a},a.is.array=function(a){return"[object Array]"===Object.prototype.toString.call(a)},a.is.date=function(a){return"[object Date]"===Object.prototype.toString.call(a)&&!isNaN(a.getTime())},a.is["boolean"]=function(a){return"[object Boolean]"===Object.prototype.toString.call(a)},a.is.string=function(a){return"[object String]"===Object.prototype.toString.call(a)},a.is.number=function(a){return"[object Number]"===Object.prototype.toString.call(a)&&!isNaN(a)},a.is.fn=function(b){return a.is.defined(window)&&b===window.alert||"[object Function]"===Object.prototype.toString.call(b)},a.is.error=function(a){return"[object Error]"===Object.prototype.toString.call(a)},a.is.object=function(a){return"[object Object]"===Object.prototype.toString.call(a)},a.is.hash=function(b){return a.is.object(b)&&b.constructor===Object&&!b.nodeType&&!b.setInterval},a.is.element=function(a){return"object"==typeof HTMLElement?a instanceof HTMLElement:a&&"object"==typeof a&&null!==a&&1===a.nodeType&&"string"==typeof a.nodeName},a.is.promise=function(b){return a.is.object(b)&&a.is.fn(b.then)&&a.is.fn(b.promise)},a.is.jq=function(b){return a.is.defined(window.jQuery)&&b instanceof jQuery&&b.length>0},a.is.moment=function(b){return a.is.defined(window.moment)&&a.is.object(b)&&a.is["boolean"](b._isAMomentObject)},a.is.emptyObject=function(b){if(!a.is.hash(b))return!1;for(var c in b)if(b.hasOwnProperty(c))return!1;return!0},a.is.emptyArray=function(b){return a.is.array(b)?0===b.length:!0},a.is.emptyString=function(b){return a.is.string(b)?0===b.length:!0}}(FooTable),function(a){a.str={},a.str.contains=function(b,c,d){return a.is.emptyString(b)||a.is.emptyString(c)?!1:c.length<=b.length&&-1!==(d?b.toUpperCase().indexOf(c.toUpperCase()):b.indexOf(c))},a.str.containsExact=function(b,c,d){return a.is.emptyString(b)||a.is.emptyString(c)||c.length>b.length?!1:new RegExp("\\b"+a.str.escapeRegExp(c)+"\\b",d?"i":"").test(b)},a.str.containsWord=function(b,c,d){if(a.is.emptyString(b)||a.is.emptyString(c)||b.length<c.length)return!1;for(var e=b.split(/\W/),f=0,g=e.length;g>f;f++)if(d?e[f].toUpperCase()==c.toUpperCase():e[f]==c)return!0;return!1},a.str.from=function(b,c){return a.is.emptyString(b)?b:a.str.contains(b,c)?b.substring(b.indexOf(c)+1):b},a.str.startsWith=function(b,c){return a.is.emptyString(b)?b==c:b.slice(0,c.length)==c},a.str.toCamelCase=function(b){return a.is.emptyString(b)?b:b.toUpperCase()===b?b.toLowerCase():b.replace(/^([A-Z])|[-\s_](\w)/g,function(b,c,d){return a.is.string(d)?d.toUpperCase():c.toLowerCase()})},a.str.random=function(b){return b=a.is.emptyString(b)?"":b,b+Math.random().toString(36).substr(2,9)},a.str.escapeRegExp=function(b){return a.is.emptyString(b)?b:b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}(FooTable),function(a){"use strict";function b(){}Object.create||(Object.create=function(){var b=function(){};return function(c){if(arguments.length>1)throw Error("Second argument not supported");if(!a.is.object(c))throw TypeError("Argument must be an object");b.prototype=c;var d=new b;return b.prototype=null,d}}());var c=/xyz/.test(function(){xyz})?/\b_super\b/:/.*/;b.__extend__=function(b,d,e,f){b[d]=a.is.fn(f)&&c.test(e)?function(a,b){return function(){var a,c;return a=this._super,this._super=f,c=b.apply(this,arguments),this._super=a,c}}(d,e):e},b.extend=function(d,e){function f(b,d,e,f){b[d]=a.is.fn(f)&&c.test(e)?function(a,b,c){return function(){var a,d;return a=this._super,this._super=c,d=b.apply(this,arguments),this._super=a,d}}(d,e,f):e}var g=Array.prototype.slice.call(arguments);if(d=g.shift(),e=g.shift(),a.is.hash(d)){var h=Object.create(this.prototype),i=this.prototype;for(var j in d)"__ctor__"!==j&&f(h,j,d[j],i[j]);var k=a.is.fn(h.__ctor__)?h.__ctor__:function(){if(!a.is.fn(this.construct))throw new SyntaxError('FooTable class objects must be constructed with the "new" keyword.');this.construct.apply(this,arguments)};return h.construct=a.is.fn(h.construct)?h.construct:function(){},k.prototype=h,h.constructor=k,k.extend=b.extend,k}a.is.string(d)&&a.is.fn(e)&&f(this.prototype,d,e,this.prototype[d])},a.Class=b,a.ClassFactory=a.Class.extend({construct:function(){this.registered={}},contains:function(b){return a.is.defined(this.registered[b])},names:function(){var a,b=[];for(a in this.registered)this.registered.hasOwnProperty(a)&&b.push(a);return b},register:function(b,c,d){if(a.is.string(b)&&a.is.fn(c)){var e=this.registered[b];this.registered[b]={name:b,klass:c,priority:a.is.number(d)?d:a.is.defined(e)?e.priority:0}}},load:function(b,c,d){var e,f,g=this,h=Array.prototype.slice.call(arguments),i=[],j=[];b=h.shift()||{};for(e in g.registered)if(g.registered.hasOwnProperty(e)){var k=g.registered[e];b.hasOwnProperty(e)&&(f=b[e],a.is.string(f)&&(f=a.getFnPointer(b[e])),a.is.fn(f)&&(k={name:e,klass:f,priority:g.registered[e].priority})),i.push(k)}for(e in b)b.hasOwnProperty(e)&&!g.registered.hasOwnProperty(e)&&(f=b[e],a.is.string(f)&&(f=a.getFnPointer(b[e])),a.is.fn(f)&&i.push({name:e,klass:f,priority:0}));return i.sort(function(a,b){return b.priority-a.priority}),a.arr.each(i,function(b){a.is.fn(b.klass)&&j.push(g._make(b.klass,h))}),j},make:function(b,c,d){var e,f=this,g=Array.prototype.slice.call(arguments);return b=g.shift(),e=f.registered[b],a.is.fn(e.klass)?f._make(e.klass,g):null},_make:function(a,b){function c(){return a.apply(this,b)}return c.prototype=a.prototype,new c}})}(FooTable),function(a,b){b.css2json=function(c){if(b.is.emptyString(c))return{};for(var d,e,f,g={},h=c.split(";"),i=0,j=h.length;j>i;i++)b.is.emptyString(h[i])||(d=h[i].split(":"),b.is.emptyString(d[0])||b.is.emptyString(d[1])||(e=b.str.toCamelCase(a.trim(d[0])),f=a.trim(d[1]),g[e]=f));return g},b.getFnPointer=function(a){if(b.is.emptyString(a))return null;var c=window,d=a.split(".");return b.arr.each(d,function(a){c[a]&&(c=c[a])}),b.is.fn(c)?c:null},b.checkFnValue=function(a,c,d){function e(a,c,d){return b.is.fn(c)?function(){return c.apply(a,arguments)}:d}return d=b.is.fn(d)?d:null,b.is.fn(c)?e(a,c,d):b.is.type(c,"string")?e(a,b.getFnPointer(c),d):d}}(jQuery,FooTable),function(a,b){b.Cell=b.Class.extend({construct:function(a,b,c,d){this.ft=a,this.row=b,this.column=c,this.created=!1,this.define(d)},define:function(c){this.$el=b.is.element(c)||b.is.jq(c)?a(c):null,this.$detail=null;var d=b.is.hash(c)&&b.is.hash(c.options)&&b.is.defined(c.value);this.value=this.column.parser.call(this.column,b.is.jq(this.$el)?this.$el:d?c.value:c,this.ft.o),this.o=a.extend(!0,{classes:null,style:null},d?c.options:{}),this.classes=b.is.jq(this.$el)&&this.$el.attr("class")?this.$el.attr("class").match(/\S+/g):b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.jq(this.$el)&&this.$el.attr("style")?b.css2json(this.$el.attr("style")):b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{}},$create:function(){this.created||((this.$el=b.is.jq(this.$el)?this.$el:a("<td/>")).data("value",this.value).contents().detach().end().append(this.format(this.value)),this._setClasses(this.$el),this._setStyle(this.$el),this.$detail=a("<tr/>").addClass(this.row.classes.join(" ")).data("__FooTableCell__",this).append(a("<th/>")).append(a("<td/>")),this.created=!0)},collapse:function(){this.created&&(this.$detail.children("th").html(this.column.title),this.$el.clone().attr("id",this.$el.attr("id")?this.$el.attr("id")+"-detail":void 0).css("display","table-cell").html("").append(this.$el.contents().detach()).replaceAll(this.$detail.children("td").first()),b.is.jq(this.$detail.parent())||this.$detail.appendTo(this.row.$details.find(".footable-details > tbody")))},restore:function(){if(this.created){if(b.is.jq(this.$detail.parent())){var a=this.$detail.children("td").first();this.$el.attr("class",a.attr("class")).attr("style",a.attr("style")).css("display",this.column.hidden||!this.column.visible?"none":"table-cell").append(a.contents().detach())}this.$detail.detach()}},parse:function(){return this.column.parser.call(this.column,this.$el,this.ft.o)},format:function(a){return this.column.formatter.call(this.column,a,this.ft.o,this.row.value)},val:function(c,d,e){if(b.is.undef(c))return this.value;var f=this,g=b.is.hash(c)&&b.is.hash(c.options)&&b.is.defined(c.value);if(this.o=a.extend(!0,{classes:f.classes,style:f.style},g?c.options:{}),this.value=g?c.value:c,this.classes=b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{},e=b.is["boolean"](e)?e:!0,this.created&&e){this.$el.data("value",this.value).empty();var h=this.$detail.children("td").first().empty(),i=b.is.jq(this.$detail.parent())?h:this.$el;i.append(this.format(this.value)),this._setClasses(i),this._setStyle(i),(b.is["boolean"](d)?d:!0)&&this.row.draw()}},_setClasses:function(a){var c=!b.is.emptyArray(this.column.classes),d=!b.is.emptyArray(this.classes),e=null;a.removeAttr("class"),(c||d)&&(c&&d?e=this.classes.concat(this.column.classes).join(" "):c?e=this.column.classes.join(" "):d&&(e=this.classes.join(" ")),b.is.emptyString(e)||a.addClass(e))},_setStyle:function(c){var d=!b.is.emptyObject(this.column.style),e=!b.is.emptyObject(this.style),f=null;c.removeAttr("style"),(d||e)&&(d&&e?f=a.extend({},this.column.style,this.style):d?f=this.column.style:e&&(f=this.style),b.is.hash(f)&&c.css(f))}})}(jQuery,FooTable),function(a,b){b.Column=b.Class.extend({construct:function(a,c,d){this.ft=a,this.type=b.is.emptyString(d)?"text":d,this.virtual=b.is["boolean"](c.virtual)?c.virtual:!1,this.$el=b.is.jq(c.$el)?c.$el:null,this.index=b.is.number(c.index)?c.index:-1,this.internal=!1,this.define(c),this.$create()},define:function(a){this.hidden=b.is["boolean"](a.hidden)?a.hidden:!1,this.visible=b.is["boolean"](a.visible)?a.visible:!0,this.name=b.is.string(a.name)?a.name:null,null==this.name&&(this.name="col"+(a.index+1)),this.title=b.is.string(a.title)?a.title:null,!this.virtual&&null==this.title&&b.is.jq(this.$el)&&(this.title=this.$el.html()),null==this.title&&(this.title="Column "+(a.index+1)),this.style=b.is.hash(a.style)?a.style:b.is.string(a.style)?b.css2json(a.style):{},this.classes=b.is.array(a.classes)?a.classes:b.is.string(a.classes)?a.classes.match(/\S+/g):[],this.parser=b.checkFnValue(this,a.parser,this.parser),this.formatter=b.checkFnValue(this,a.formatter,this.formatter)},$create:function(){(this.$el=!this.virtual&&b.is.jq(this.$el)?this.$el:a("<th/>")).html(this.title).addClass(this.classes.join(" ")).css(this.style)},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("value");return b.is.defined(d)?d:a(c).html()}return b.is.defined(c)&&null!=c?c+"":null},formatter:function(a,b,c){return null==a?"":a},createCell:function(a){var c=b.is.jq(a.$el)?a.$el.children("td,th").get(this.index):null,d=b.is.hash(a.value)?a.value[this.name]:null;return new b.Cell(this.ft,a,this,c||d)}}),b.columns=new b.ClassFactory,b.columns.register("text",b.Column)}(jQuery,FooTable),function(a,b){b.Component=b.Class.extend({construct:function(a,c){if(!(a instanceof b.Table))throw new TypeError("The instance parameter must be an instance of FooTable.Table.");this.ft=a,this.enabled=b.is["boolean"](c)?c:!1},preinit:function(a){},init:function(){},destroy:function(){},predraw:function(){},draw:function(){},postdraw:function(){}}),b.components=new b.ClassFactory}(jQuery,FooTable),function(a,b){b.Defaults=function(){this.stopPropagation=!1,this.on=null},b.defaults=new b.Defaults}(jQuery,FooTable),function(a,b){b.Row=b.Class.extend({construct:function(a,b,c){this.ft=a,this.columns=b,this.created=!1,this.define(c)},define:function(c){this.$el=b.is.element(c)||b.is.jq(c)?a(c):null,this.$toggle=a("<span/>",{"class":"footable-toggle fooicon fooicon-plus"});var d=b.is.hash(c),e=d&&b.is.hash(c.options)&&b.is.hash(c.value);this.value=d?e?c.value:c:null,this.o=a.extend(!0,{expanded:!1,classes:null,style:null},e?c.options:{}),this.expanded=b.is.jq(this.$el)?this.$el.data("expanded")||this.o.expanded:this.o.expanded,this.classes=b.is.jq(this.$el)&&this.$el.attr("class")?this.$el.attr("class").match(/\S+/g):b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.jq(this.$el)&&this.$el.attr("style")?b.css2json(this.$el.attr("style")):b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{},this.cells=this.createCells();var f=this;f.value={},b.arr.each(f.cells,function(a){f.value[a.column.name]=a.val()})},$create:function(){if(!this.created){(this.$el=b.is.jq(this.$el)?this.$el:a("<tr/>")).data("__FooTableRow__",this),this._setClasses(this.$el),this._setStyle(this.$el),"last"==this.ft.rows.toggleColumn&&this.$toggle.addClass("last-column"),this.$details=a("<tr/>",{"class":"footable-detail-row"}).append(a("<td/>",{colspan:this.ft.columns.visibleColspan}).append(a("<table/>",{"class":"footable-details "+this.ft.classes.join(" ")}).append("<tbody/>")));var c=this;b.arr.each(c.cells,function(a){a.created||a.$create(),c.$el.append(a.$el)}),c.$el.off("click.ft.row").on("click.ft.row",{self:c},c._onToggle),this.created=!0}},createCells:function(){var a=this;return b.arr.map(a.columns,function(b){return b.createCell(a)})},val:function(c,d,e){var f=this;if(!b.is.hash(c))return b.is.hash(this.value)&&!b.is.emptyObject(this.value)||(this.value={},b.arr.each(this.cells,function(a){a.column.internal||(f.value[a.column.name]=a.val())})),this.value;this.collapse(!1);var g=b.is.hash(c),h=g&&b.is.hash(c.options)&&b.is.hash(c.value);if(this.o=a.extend(!0,{expanded:f.expanded,classes:f.classes,style:f.style},h?c.options:{}),this.expanded=this.o.expanded,this.classes=b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{},g)if(h&&(c=c.value),b.is.hash(this.value))for(var i in c)c.hasOwnProperty(i)&&(this.value[i]=c[i]);else this.value=c;else this.value=null;e=b.is["boolean"](e)?e:!0,b.arr.each(this.cells,function(a){!a.column.internal&&b.is.defined(f.value[a.column.name])&&a.val(f.value[a.column.name],!1,e)}),this.created&&e&&(this._setClasses(this.$el),this._setStyle(this.$el),(b.is["boolean"](d)?d:!0)&&this.draw())},_setClasses:function(a){var c=!b.is.emptyArray(this.classes),d=null;a.removeAttr("class"),c&&(d=this.classes.join(" "),b.is.emptyString(d)||a.addClass(d))},_setStyle:function(a){var c=!b.is.emptyObject(this.style),d=null;a.removeAttr("style"),c&&(d=this.style,b.is.hash(d)&&a.css(d))},expand:function(){if(this.created){var a=this;a.ft.raise("expand.ft.row",[a]).then(function(){a.__hidden__=b.arr.map(a.cells,function(a){return a.column.hidden&&a.column.visible?a:null}),a.__hidden__.length>0&&(a.$details.insertAfter(a.$el).children("td").first().attr("colspan",a.ft.columns.visibleColspan),b.arr.each(a.__hidden__,function(a){a.collapse()})),a.$el.attr("data-expanded",!0),a.$toggle.removeClass("fooicon-plus").addClass("fooicon-minus"),a.expanded=!0,a.ft.raise("expanded.ft.row",[a])})}},collapse:function(a){if(this.created){var c=this;c.ft.raise("collapse.ft.row",[c]).then(function(){b.arr.each(c.__hidden__,function(a){a.restore()}),c.$details.detach(),c.$el.removeAttr("data-expanded"),c.$toggle.removeClass("fooicon-minus").addClass("fooicon-plus"),(b.is["boolean"](a)?a:!0)&&(c.expanded=!1),c.ft.raise("collapsed.ft.row",[c])})}},predraw:function(a){this.created&&(this.expanded&&this.collapse(!1),this.$toggle.detach(),a=b.is["boolean"](a)?a:!0,a&&this.$el.detach())},draw:function(a){this.created||this.$create(),b.is.jq(a)&&a.append(this.$el);var c=this;b.arr.each(c.cells,function(a){a.$el.css("display",a.column.hidden||!a.column.visible?"none":"table-cell"),c.ft.rows.showToggle&&c.ft.columns.hasHidden&&("first"==c.ft.rows.toggleColumn&&a.column.index==c.ft.columns.firstVisibleIndex||"last"==c.ft.rows.toggleColumn&&a.column.index==c.ft.columns.lastVisibleIndex)&&a.$el.prepend(c.$toggle),a.$el.add(a.column.$el).removeClass("footable-first-visible footable-last-visible"),a.column.index==c.ft.columns.firstVisibleIndex&&a.$el.add(a.column.$el).addClass("footable-first-visible"),a.column.index==c.ft.columns.lastVisibleIndex&&a.$el.add(a.column.$el).addClass("footable-last-visible")}),this.expanded&&this.expand()},toggle:function(){this.created&&this.ft.columns.hasHidden&&(this.expanded?this.collapse():this.expand())},_onToggle:function(b){var c=b.data.self;a(b.target).is(c.ft.rows.toggleSelector)&&c.toggle()}})}(jQuery,FooTable),function(a,b){b.instances=[],b.Table=b.Class.extend({construct:function(c,d,e){this._resizeTimeout=null,this.id=b.instances.push(this),this.initialized=!1,this.$el=(b.is.jq(c)?c:a(c)).first(),this.$loader=a("<div/>",{"class":"footable-loader"}).append(a("<span/>",{"class":"fooicon fooicon-loader"})),this.o=a.extend(!0,{},b.defaults,d),this.data=this.$el.data()||{},this.classes=[],this.components=b.components.load(b.is.hash(this.data.components)?this.data.components:this.o.components,this),this.breakpoints=this.use(FooTable.Breakpoints),this.columns=this.use(FooTable.Columns),this.rows=this.use(FooTable.Rows),this._construct(e)},_construct:function(a){var c=this;return this._preinit().then(function(){return c._init().then(function(){return c.raise("ready.ft.table").then(function(){b.is.fn(a)&&a.call(c,c)})})}).always(function(a){c.$el.show(),b.is.error(a)&&console.error("FooTable: unhandled error thrown during initialization.",a)})},_preinit:function(){var a=this;return this.raise("preinit.ft.table",[a.data]).then(function(){var c=(a.$el.attr("class")||"").match(/\S+/g)||[];a.o.ajax=b.checkFnValue(a,a.data.ajax,a.o.ajax),a.o.stopPropagation=b.is["boolean"](a.data.stopPropagation)?a.data.stopPropagation:a.o.stopPropagation;for(var d=0,e=c.length;e>d;d++)b.str.startsWith(c[d],"footable")||a.classes.push(c[d]);return a.$el.hide().after(a.$loader),a.execute(!1,!1,"preinit",a.data)})},_init:function(){var c=this;return c.raise("init.ft.table").then(function(){var d=c.$el.children("thead"),e=c.$el.children("tbody"),f=c.$el.children("tfoot");return c.$el.addClass("footable footable-"+c.id),b.is.hash(c.o.on)&&c.$el.on(c.o.on),0==f.length&&c.$el.append(f=a("<tfoot/>")),0==e.length&&c.$el.append("<tbody/>"),0==d.length&&c.$el.prepend(d=a("<thead/>")),c.execute(!1,!0,"init").then(function(){return c.$el.data("__FooTable__",c),0==f.children("tr").length&&f.remove(),0==d.children("tr").length&&d.remove(),c.raise("postinit.ft.table").then(function(){return c.draw()}).always(function(){a(window).off("resize.ft"+c.id,c._onWindowResize).on("resize.ft"+c.id,{self:c},c._onWindowResize),c.initialized=!0})})})},destroy:function(){var c=this;return c.raise("destroy.ft.table").then(function(){return c.execute(!0,!0,"destroy").then(function(){c.$el.removeData("__FooTable__").removeClass("footable-"+c.id),b.is.hash(c.o.on)&&c.$el.off(c.o.on),a(window).off("resize.ft"+c.id,c._onWindowResize),c.initialized=!1,b.instances[c.id]=null})}).fail(function(a){b.is.error(a)&&console.error("FooTable: unhandled error thrown while destroying the plugin.",a)})},raise:function(c,d){var e=this,f=b.__debug__&&(b.is.emptyArray(b.__debug_options__.events)||b.arr.any(b.__debug_options__.events,function(a){return b.str.contains(c,a)}));return d=d||[],d.unshift(this),a.Deferred(function(b){var g=a.Event(c);1==e.o.stopPropagation&&e.$el.one(c,function(a){a.stopPropagation()}),f&&console.log("FooTable:"+c+": ",d),e.$el.trigger(g,d),g.isDefaultPrevented()?(f&&console.log('FooTable: default prevented for the "'+c+'" event.'),b.reject(g)):b.resolve(g)})},use:function(a){for(var b=0,c=this.components.length;c>b;b++)if(this.components[b]instanceof a)return this.components[b];return null},draw:function(){var a=this,c=a.$el.clone().insertBefore(a.$el);return a.$el.detach(),a.execute(!1,!0,"predraw").then(function(){return a.raise("predraw.ft.table").then(function(){return a.execute(!1,!0,"draw").then(function(){return a.raise("draw.ft.table").then(function(){return a.execute(!1,!0,"postdraw").then(function(){return a.raise("postdraw.ft.table")})})})})}).fail(function(a){b.is.error(a)&&console.error("FooTable: unhandled error thrown during a draw operation.",a)}).always(function(){c.replaceWith(a.$el),a.$loader.remove()})},execute:function(a,c,d,e,f){var g=this,h=Array.prototype.slice.call(arguments);a=h.shift(),c=h.shift();var i=c?b.arr.get(g.components,function(a){return a.enabled}):g.components.slice(0);return h.unshift(a?i.reverse():i),g._execute.apply(g,h)},_execute:function(c,d,e,f){if(!c||!c.length)return a.when();var g,h=this,i=Array.prototype.slice.call(arguments);return c=i.shift(),d=i.shift(),g=c.shift(),b.is.fn(g[d])?a.Deferred(function(a){try{var c=g[d].apply(g,i);if(b.is.promise(c))return c.then(a.resolve,a.reject);a.resolve(c)}catch(e){a.reject(e)}}).then(function(){return h._execute.apply(h,[c,d].concat(i))}):h._execute.apply(h,[c,d].concat(i))},_onWindowResize:function(a){var b=a.data.self;null!=b._resizeTimeout&&clearTimeout(b._resizeTimeout),b._resizeTimeout=setTimeout(function(){b._resizeTimeout=null,b.raise("resize.ft.table").then(function(){b.breakpoints.check()})},300)}})}(jQuery,FooTable),function(a,b){b.ArrayColumn=b.Column.extend({construct:function(a,b){this._super(a,b,"array")},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c),e=d.data("value");if(b.is.array(e))return e;e=d.html();try{e=JSON.parse(e)}catch(f){e=null}return b.is.array(e)?e:null}return b.is.array(c)?c:null},formatter:function(a,c,d){return b.is.array(a)?JSON.stringify(a):""}}),b.columns.register("array",b.ArrayColumn)}(jQuery,FooTable),function(a,b){b.is.undef(window.moment)||(b.DateColumn=b.Column.extend({construct:function(a,c){this._super(a,c,"date"),this.formatString=b.is.string(c.formatString)?c.formatString:"MM-DD-YYYY"},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("value");c=b.is.defined(d)?d:a(c).text(),b.is.string(c)&&(c=isNaN(c)?c:+c)}if(b.is.date(c))return moment(c);if(b.is.object(c)&&b.is["boolean"](c._isAMomentObject))return c;if(b.is.string(c)){if(isNaN(c))return moment(c,this.formatString);c=+c}return b.is.number(c)?moment(c):null},formatter:function(a,c,d){return b.is.object(a)&&b.is["boolean"](a._isAMomentObject)&&a.isValid()?a.format(this.formatString):""},filterValue:function(c){if((b.is.element(c)||b.is.jq(c))&&(c=a(c).data("filterValue")||a(c).text()),b.is.hash(c)&&b.is.hash(c.options)&&(b.is.string(c.options.filterValue)&&(c=c.options.filterValue),b.is.defined(c.value)&&(c=c.value)),b.is.object(c)&&b.is["boolean"](c._isAMomentObject))return c.format(this.formatString);if(b.is.string(c)){if(isNaN(c))return c;c=+c}return b.is.number(c)||b.is.date(c)?moment(c).format(this.formatString):b.is.defined(c)&&null!=c?c+"":""}}),b.columns.register("date",b.DateColumn))}(jQuery,FooTable),function(a,b){b.HTMLColumn=b.Column.extend({construct:function(a,b){this._super(a,b,"html")},parser:function(c){if(b.is.string(c)&&(c=a(a.trim(c))),b.is.element(c)&&(c=a(c)),b.is.jq(c)){var d=c.prop("tagName").toLowerCase();if("td"==d||"th"==d){var e=c.data("value");return b.is.defined(e)?e:c.contents()}return c}return null}}),b.columns.register("html",b.HTMLColumn)}(jQuery,FooTable),function(a,b){b.NumberColumn=b.Column.extend({construct:function(a,c){this._super(a,c,"number"),this.decimalSeparator=b.is.string(c.decimalSeparator)?c.decimalSeparator:".",this.thousandSeparator=b.is.string(c.thousandSeparator)?c.thousandSeparator:",",this.decimalSeparatorRegex=new RegExp(b.str.escapeRegExp(this.decimalSeparator),"g"),this.thousandSeparatorRegex=new RegExp(b.str.escapeRegExp(this.thousandSeparator),"g"),this.cleanRegex=new RegExp("[^-0-9"+b.str.escapeRegExp(this.decimalSeparator)+"]","g")},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("value");c=b.is.defined(d)?d:a(c).text().replace(this.cleanRegex,"")}return b.is.string(c)&&(c=c.replace(this.thousandSeparatorRegex,"").replace(this.decimalSeparatorRegex,"."),c=parseFloat(c)),b.is.number(c)?c:null},formatter:function(a,b,c){if(null==a)return"";var d=(a+"").split(".");return 2==d.length&&d[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,this.thousandSeparator)),d.join(this.decimalSeparator)}}),b.columns.register("number",b.NumberColumn)}(jQuery,FooTable),function(a,b){b.ObjectColumn=b.Column.extend({construct:function(a,b){this._super(a,b,"object")},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c),e=d.data("value");if(b.is.object(e))return e;e=d.html();try{e=JSON.parse(e)}catch(f){e=null}return b.is.object(e)?e:null}return b.is.object(c)?c:null},formatter:function(a,c,d){return b.is.object(a)?JSON.stringify(a):""}}),b.columns.register("object",b.ObjectColumn)}(jQuery,FooTable),function(a,b){b.Breakpoint=b.Class.extend({construct:function(a,b){this.name=a,this.width=b}})}(jQuery,FooTable),function(a,b){b.Breakpoints=b.Component.extend({construct:function(a){this._super(a,!0),this.o=a.o,this.current=null,this.array=[],this.cascade=this.o.cascade,this.useParentWidth=this.o.useParentWidth,this.hidden=null,this._classNames="",this.getWidth=b.checkFnValue(this,this.o.getWidth,this.getWidth)},preinit:function(a){var c=this;return this.ft.raise("preinit.ft.breakpoints",[a]).then(function(){c.cascade=b.is["boolean"](a.cascade)?a.cascade:c.cascade,c.o.breakpoints=b.is.hash(a.breakpoints)?a.breakpoints:c.o.breakpoints,c.getWidth=b.checkFnValue(c,a.getWidth,c.getWidth),null==c.o.breakpoints&&(c.o.breakpoints={xs:480,sm:768,md:992,lg:1200});for(var d in c.o.breakpoints)c.o.breakpoints.hasOwnProperty(d)&&(c.array.push(new b.Breakpoint(d,c.o.breakpoints[d])),c._classNames+="breakpoint-"+d+" ");c.array.sort(function(a,b){return b.width-a.width})})},init:function(){var a=this;return this.ft.raise("init.ft.breakpoints").then(function(){a.current=a.get()})},draw:function(){this.ft.$el.removeClass(this._classNames).addClass("breakpoint-"+this.current.name)},calculate:function(){for(var a,c=this,d=null,e=[],f=null,g=c.getWidth(),h=0,i=c.array.length;i>h;h++)a=c.array[h],(!d&&h==i-1||g>=a.width&&(f instanceof b.Breakpoint?g<f.width:!0))&&(d=a),d||e.push(a.name),f=a;return e.push(d.name),c.hidden=e.join(" "),d},visible:function(a){if(b.is.emptyString(a))return!0;if("all"===a)return!1;for(var c=a.split(" "),d=0,e=c.length;e>d;d++)if(this.cascade?b.str.containsWord(this.hidden,c[d]):c[d]==this.current.name)return!1;return!0},check:function(){var a=this,c=a.get();c instanceof b.Breakpoint&&c!=a.current&&a.ft.raise("before.ft.breakpoints",[a.current,c]).then(function(){var b=a.current;return a.current=c,a.ft.draw().then(function(){a.ft.raise("after.ft.breakpoints",[a.current,b])})})},get:function(a){return b.is.undef(a)?this.calculate():a instanceof b.Breakpoint?a:b.is.string(a)?b.arr.first(this.array,function(b){return b.name==a}):b.is.number(a)&&a>=0&&a<this.array.length?this.array[a]:null},getWidth:function(){return b.is.fn(this.o.getWidth)?this.o.getWidth(this.ft):1==this.useParentWidth?this.getParentWidth():this.getViewportWidth()},getParentWidth:function(){return this.ft.$el.parent().width()},getViewportWidth:function(){return Math.max(document.documentElement.clientWidth,window.innerWidth,0)}}),b.components.register("breakpoints",b.Breakpoints,1e3)}(jQuery,FooTable),function(a){a.Column.prototype.breakpoints=null,a.Column.prototype.__breakpoints_define__=function(b){this.breakpoints=a.is.emptyString(b.breakpoints)?null:b.breakpoints},a.Column.extend("define",function(a){this._super(a),this.__breakpoints_define__(a)})}(FooTable),function(a){a.Defaults.prototype.breakpoints=null,a.Defaults.prototype.cascade=!1,a.Defaults.prototype.useParentWidth=!1,a.Defaults.prototype.getWidth=null}(FooTable),function(a,b){b.Columns=b.Component.extend({construct:function(a){this._super(a,!0),this.o=a.o,this.array=[],this.$header=null,this.showHeader=a.o.showHeader,this._fromHTML=b.is.emptyArray(a.o.columns)&&!b.is.promise(a.o.columns)},parse:function(c){var d=this;return a.Deferred(function(c){function e(c,d){var e=[];if(0==c.length||0==d.length)e=c.concat(d);else{var f=0;b.arr.each(c.concat(d),function(a){a.index>f&&(f=a.index)}),f++;for(var g,h,i=0;f>i;i++)g={},b.arr.each(c,function(a){return a.index==i?(g=a,!1):void 0}),h={},b.arr.each(d,function(a){return a.index==i?(h=a,!1):void 0}),e.push(a.extend(!0,{},g,h))}return e}var f,g,h=[],i=[],j=d.ft.$el.find("tr.footable-header, thead > tr:last:has([data-breakpoints]), tbody > tr:first:has([data-breakpoints]), thead > tr:last, tbody > tr:first").first();if(j.length>0){var k=j.parent().is("tbody")&&j.children().length==j.children("td").length;k||(d.$header=j.addClass("footable-header")),j.children("td,th").each(function(b,c){f=a(c),g=f.data(),g.index=b,g.$el=f,g.virtual=k,i.push(g)}),k&&(d.showHeader=!1)}b.is.array(d.o.columns)&&!b.is.emptyArray(d.o.columns)?(b.arr.each(d.o.columns,function(a,b){a.index=b,h.push(a)}),d.parseFinalize(c,e(h,i))):b.is.promise(d.o.columns)?d.o.columns.then(function(a){b.arr.each(a,function(a,b){a.index=b,h.push(a)}),d.parseFinalize(c,e(h,i))},function(a){c.reject(Error("Columns ajax request error: "+a.status+" ("+a.statusText+")"))}):d.parseFinalize(c,e(h,i))})},parseFinalize:function(a,c){var d,e=this,f=[];b.arr.each(c,function(a){(d=b.columns.contains(a.type)?b.columns.make(a.type,e.ft,a):new b.Column(e.ft,a))&&f.push(d)}),b.is.emptyArray(f)?a.reject(Error("No columns supplied.")):(f.sort(function(a,b){
+return a.index-b.index}),a.resolve(f))},preinit:function(a){var c=this;return c.ft.raise("preinit.ft.columns",[a]).then(function(){return c.parse(a).then(function(d){c.array=d,c.showHeader=b.is["boolean"](a.showHeader)?a.showHeader:c.showHeader})})},init:function(){var a=this;return this.ft.raise("init.ft.columns",[a.array]).then(function(){a.$create()})},destroy:function(){var a=this;this.ft.raise("destroy.ft.columns").then(function(){a._fromHTML||a.$header.remove()})},predraw:function(){var a=this,c=!0;a.visibleColspan=0,a.firstVisibleIndex=0,a.lastVisibleIndex=0,a.hasHidden=!1,b.arr.each(a.array,function(b){b.hidden=!a.ft.breakpoints.visible(b.breakpoints),!b.hidden&&b.visible&&(c&&(a.firstVisibleIndex=b.index,c=!1),a.lastVisibleIndex=b.index,a.visibleColspan++),b.hidden&&(a.hasHidden=!0)}),a.ft.$el.toggleClass("breakpoint",a.hasHidden)},draw:function(){b.arr.each(this.array,function(a){a.$el.css("display",a.hidden||!a.visible?"none":"table-cell")}),!this.showHeader&&b.is.jq(this.$header.parent())&&this.$header.detach()},$create:function(){var c=this;c.$header=b.is.jq(c.$header)?c.$header:a("<tr/>",{"class":"footable-header"}),c.$header.children("th,td").detach(),b.arr.each(c.array,function(a){c.$header.append(a.$el)}),c.showHeader&&!b.is.jq(c.$header.parent())&&c.ft.$el.children("thead").append(c.$header)},get:function(a){return a instanceof b.Column?a:b.is.string(a)?b.arr.first(this.array,function(b){return b.name==a}):b.is.number(a)?b.arr.first(this.array,function(b){return b.index==a}):b.is.fn(a)?b.arr.get(this.array,a):null},ensure:function(a){var c=this,d=[];return b.is.array(a)?(b.arr.each(a,function(a){d.push(c.get(a))}),d):d}}),b.components.register("columns",b.Columns,900)}(jQuery,FooTable),function(a){a.Defaults.prototype.columns=[],a.Defaults.prototype.showHeader=!0}(FooTable),function(a,b){b.Rows=b.Component.extend({construct:function(a){this._super(a,!0),this.o=a.o,this.array=[],this.all=[],this.showToggle=a.o.showToggle,this.toggleSelector=a.o.toggleSelector,this.toggleColumn=a.o.toggleColumn,this.emptyString=a.o.empty,this.expandFirst=a.o.expandFirst,this.expandAll=a.o.expandAll,this.$empty=null,this._fromHTML=b.is.emptyArray(a.o.rows)&&!b.is.promise(a.o.rows)},parse:function(){var c=this;return a.Deferred(function(a){var d=c.ft.$el.children("tbody").children("tr");b.is.array(c.o.rows)&&c.o.rows.length>0?c.parseFinalize(a,c.o.rows):b.is.promise(c.o.rows)?c.o.rows.then(function(b){c.parseFinalize(a,b)},function(b){a.reject(Error("Rows ajax request error: "+b.status+" ("+b.statusText+")"))}):b.is.jq(d)?(c.parseFinalize(a,d),d.detach()):c.parseFinalize(a,[])})},parseFinalize:function(c,d){var e=this,f=a.map(d,function(a){return new b.Row(e.ft,e.ft.columns.array,a)});c.resolve(f)},preinit:function(a){var c=this;return c.ft.raise("preinit.ft.rows",[a]).then(function(){return c.parse().then(function(d){c.all=d,c.array=c.all.slice(0),c.showToggle=b.is["boolean"](a.showToggle)?a.showToggle:c.showToggle,c.toggleSelector=b.is.string(a.toggleSelector)?a.toggleSelector:c.toggleSelector,c.toggleColumn=b.is.string(a.toggleColumn)?a.toggleColumn:c.toggleColumn,"first"!=c.toggleColumn&&"last"!=c.toggleColumn&&(c.toggleColumn="first"),c.emptyString=b.is.string(a.empty)?a.empty:c.emptyString,c.expandFirst=b.is["boolean"](a.expandFirst)?a.expandFirst:c.expandFirst,c.expandAll=b.is["boolean"](a.expandAll)?a.expandAll:c.expandAll})})},init:function(){var a=this;return a.ft.raise("init.ft.rows",[a.all]).then(function(){a.$create()})},destroy:function(){var a=this;this.ft.raise("destroy.ft.rows").then(function(){b.arr.each(a.array,function(b){b.predraw(!a._fromHTML)}),a.all=a.array=[]})},predraw:function(){b.arr.each(this.array,function(a){a.predraw()}),this.array=this.all.slice(0)},$create:function(){this.$empty=a("<tr/>",{"class":"footable-empty"}).append(a("<td/>").text(this.emptyString))},draw:function(){var a=this,c=a.ft.$el.children("tbody"),d=!0;a.array.length>0?(a.$empty.detach(),b.arr.each(a.array,function(b){(a.expandFirst&&d||a.expandAll)&&(b.expanded=!0,d=!1),b.draw(c)})):(a.$empty.children("td").attr("colspan",a.ft.columns.visibleColspan),c.append(a.$empty))},load:function(c,d){var e=this,f=a.map(c,function(a){return new b.Row(e.ft,e.ft.columns.array,a)});b.arr.each(this.array,function(a){a.predraw()}),this.all=(b.is["boolean"](d)?d:!1)?this.all.concat(f):f,this.array=this.all.slice(0),this.ft.draw()},expand:function(){b.arr.each(this.array,function(a){a.expand()})},collapse:function(){b.arr.each(this.array,function(a){a.collapse()})}}),b.components.register("rows",b.Rows,800)}(jQuery,FooTable),function(a){a.Defaults.prototype.rows=[],a.Defaults.prototype.empty="No results",a.Defaults.prototype.showToggle=!0,a.Defaults.prototype.toggleSelector="tr,td,.footable-toggle",a.Defaults.prototype.toggleColumn="first",a.Defaults.prototype.expandFirst=!1,a.Defaults.prototype.expandAll=!1}(FooTable),function(a){a.Table.prototype.loadRows=function(a,b){this.rows.load(a,b)}}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/js/footable.editing.min.js b/js/third-party/footable/footable-components.latest/js/footable.editing.min.js
new file mode 100644
index 0000000..5d84955
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/js/footable.editing.min.js
@@ -0,0 +1,8 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a,b){b.Editing=b.Component.extend({construct:function(c){this._super(c,c.o.editing.enabled),this.pageToNew=c.o.editing.pageToNew,this.alwaysShow=c.o.editing.alwaysShow,this.column=a.extend(!0,{},c.o.editing.column,{visible:this.alwaysShow}),this.position=c.o.editing.position,this.showText=c.o.editing.showText,this.hideText=c.o.editing.hideText,this.addText=c.o.editing.addText,this.editText=c.o.editing.editText,this.deleteText=c.o.editing.deleteText,this.viewText=c.o.editing.viewText,this.allowAdd=c.o.editing.allowAdd,this.allowEdit=c.o.editing.allowEdit,this.allowDelete=c.o.editing.allowDelete,this.allowView=c.o.editing.allowView,this._$buttons=null,this.callbacks={addRow:b.checkFnValue(this,c.o.editing.addRow),editRow:b.checkFnValue(this,c.o.editing.editRow),deleteRow:b.checkFnValue(this,c.o.editing.deleteRow),viewRow:b.checkFnValue(this,c.o.editing.viewRow)}},preinit:function(c){var d=this;this.ft.raise("preinit.ft.editing",[c]).then(function(){if(d.ft.$el.hasClass("footable-editing")&&(d.enabled=!0),d.enabled=b.is["boolean"](c.editing)?c.editing:d.enabled,d.enabled){if(d.pageToNew=b.is["boolean"](c.editingPageToNew)?c.editingPageToNew:d.pageToNew,d.alwaysShow=b.is["boolean"](c.editingAlwaysShow)?c.editingAlwaysShow:d.alwaysShow,d.position=b.is.string(c.editingPosition)?c.editingPosition:d.position,d.showText=b.is.string(c.editingShowText)?c.editingShowText:d.showText,d.hideText=b.is.string(c.editingHideText)?c.editingHideText:d.hideText,d.addText=b.is.string(c.editingAddText)?c.editingAddText:d.addText,d.editText=b.is.string(c.editingEditText)?c.editingEditText:d.editText,d.deleteText=b.is.string(c.editingDeleteText)?c.editingDeleteText:d.deleteText,d.viewText=b.is.string(c.editingViewText)?c.editingViewText:d.viewText,d.allowAdd=b.is["boolean"](c.editingAllowAdd)?c.editingAllowAdd:d.allowAdd,d.allowEdit=b.is["boolean"](c.editingAllowEdit)?c.editingAllowEdit:d.allowEdit,d.allowDelete=b.is["boolean"](c.editingAllowDelete)?c.editingAllowDelete:d.allowDelete,d.allowView=b.is["boolean"](c.editingAllowView)?c.editingAllowView:d.allowView,d.column=new b.EditingColumn(d.ft,d,a.extend(!0,{},d.column,c.editingColumn,{visible:d.alwaysShow})),d.ft.$el.hasClass("footable-editing-left")&&(d.position="left"),d.ft.$el.hasClass("footable-editing-right")&&(d.position="right"),"right"===d.position)d.column.index=d.ft.columns.array.length;else{d.column.index=0;for(var e=0,f=d.ft.columns.array.length;f>e;e++)d.ft.columns.array[e].index+=1}d.ft.columns.array.push(d.column),d.ft.columns.array.sort(function(a,b){return a.index-b.index}),d.callbacks.addRow=b.checkFnValue(d,c.editingAddRow,d.callbacks.addRow),d.callbacks.editRow=b.checkFnValue(d,c.editingEditRow,d.callbacks.editRow),d.callbacks.deleteRow=b.checkFnValue(d,c.editingDeleteRow,d.callbacks.deleteRow),d.callbacks.viewRow=b.checkFnValue(d,c.editingViewRow,d.callbacks.viewRow)}},function(){d.enabled=!1})},init:function(){var a=this;this.ft.raise("init.ft.editing").then(function(){a.$create()},function(){a.enabled=!1})},destroy:function(){var a=this;this.ft.raise("destroy.ft.editing").then(function(){a.ft.$el.removeClass("footable-editing footable-editing-always-show footable-editing-no-add footable-editing-no-edit footable-editing-no-delete footable-editing-no-view").off("click.ft.editing").find("tfoot > tr.footable-editing").remove()})},$create:function(){var b=this,c="right"===b.position?"footable-editing-right":"footable-editing-left";b.ft.$el.addClass("footable-editing").addClass(c).on("click.ft.editing",".footable-show",{self:b},b._onShowClick).on("click.ft.editing",".footable-hide",{self:b},b._onHideClick).on("click.ft.editing",".footable-edit",{self:b},b._onEditClick).on("click.ft.editing",".footable-delete",{self:b},b._onDeleteClick).on("click.ft.editing",".footable-view",{self:b},b._onViewClick).on("click.ft.editing",".footable-add",{self:b},b._onAddClick),b.$cell=a("<td/>").attr("colspan",b.ft.columns.visibleColspan).append(b.$buttonShow()),b.allowAdd&&b.$cell.append(b.$buttonAdd()),b.$cell.append(b.$buttonHide()),b.alwaysShow&&b.ft.$el.addClass("footable-editing-always-show"),b.allowAdd||b.ft.$el.addClass("footable-editing-no-add"),b.allowEdit||b.ft.$el.addClass("footable-editing-no-edit"),b.allowDelete||b.ft.$el.addClass("footable-editing-no-delete"),b.allowView||b.ft.$el.addClass("footable-editing-no-view");var d=b.ft.$el.children("tfoot");0==d.length&&(d=a("<tfoot/>"),b.ft.$el.append(d)),b.$row=a("<tr/>",{"class":"footable-editing"}).append(b.$cell).appendTo(d)},$buttonShow:function(){return'<button type="button" class="btn btn-primary footable-show">'+this.showText+"</button>"},$buttonHide:function(){return'<button type="button" class="btn btn-default footable-hide">'+this.hideText+"</button>"},$buttonAdd:function(){return'<button type="button" class="btn btn-primary footable-add">'+this.addText+"</button> "},$buttonEdit:function(){return'<button type="button" class="btn btn-default footable-edit">'+this.editText+"</button> "},$buttonDelete:function(){return'<button type="button" class="btn btn-default footable-delete">'+this.deleteText+"</button>"},$buttonView:function(){return'<button type="button" class="btn btn-default footable-view">'+this.viewText+"</button> "},$rowButtons:function(){return b.is.jq(this._$buttons)?this._$buttons.clone():(this._$buttons=a('<div class="btn-group btn-group-xs" role="group"></div>'),this.allowView&&this._$buttons.append(this.$buttonView()),this.allowEdit&&this._$buttons.append(this.$buttonEdit()),this.allowDelete&&this._$buttons.append(this.$buttonDelete()),this._$buttons)},draw:function(){this.$cell.attr("colspan",this.ft.columns.visibleColspan)},_onEditClick:function(c){c.preventDefault();var d=c.data.self,e=a(this).closest("tr").data("__FooTableRow__");e instanceof b.Row&&d.ft.raise("edit.ft.editing",[e]).then(function(){d.callbacks.editRow.call(d.ft,e)})},_onDeleteClick:function(c){c.preventDefault();var d=c.data.self,e=a(this).closest("tr").data("__FooTableRow__");e instanceof b.Row&&d.ft.raise("delete.ft.editing",[e]).then(function(){d.callbacks.deleteRow.call(d.ft,e)})},_onViewClick:function(c){c.preventDefault();var d=c.data.self,e=a(this).closest("tr").data("__FooTableRow__");e instanceof b.Row&&d.ft.raise("view.ft.editing",[e]).then(function(){d.callbacks.viewRow.call(d.ft,e)})},_onAddClick:function(a){a.preventDefault();var b=a.data.self;b.ft.raise("add.ft.editing").then(function(){b.callbacks.addRow.call(b.ft)})},_onShowClick:function(a){a.preventDefault();var b=a.data.self;b.ft.raise("show.ft.editing").then(function(){b.ft.$el.addClass("footable-editing-show"),b.column.visible=!0,b.ft.draw()})},_onHideClick:function(a){a.preventDefault();var b=a.data.self;b.ft.raise("hide.ft.editing").then(function(){b.ft.$el.removeClass("footable-editing-show"),b.column.visible=!1,b.ft.draw()})}}),b.components.register("editing",b.Editing,850)}(jQuery,FooTable),function(a,b){b.EditingColumn=b.Column.extend({construct:function(a,b,c){this._super(a,c,"editing"),this.editing=b,this.internal=!0},$create:function(){(this.$el=!this.virtual&&b.is.jq(this.$el)?this.$el:a("<th/>",{"class":"footable-editing"})).html(this.title)},parser:function(c){if(b.is.string(c)&&(c=a(a.trim(c))),b.is.element(c)&&(c=a(c)),b.is.jq(c)){var d=c.prop("tagName").toLowerCase();return"td"==d||"th"==d?c.data("value")||c.contents():c}return null},createCell:function(c){var d=this.editing.$rowButtons(),e=a("<td/>").append(d);return b.is.jq(c.$el)&&(0===this.index?e.prependTo(c.$el):e.insertAfter(c.$el.children().eq(this.index-1))),new b.Cell(this.ft,c,this,e||e.html())}}),b.columns.register("editing",b.EditingColumn)}(jQuery,FooTable),function(a,b){b.Defaults.prototype.editing={enabled:!1,pageToNew:!0,position:"right",alwaysShow:!1,addRow:function(){},editRow:function(a){},deleteRow:function(a){},viewRow:function(a){},showText:'<span class="fooicon fooicon-pencil" aria-hidden="true"></span> Edit rows',hideText:"Cancel",addText:"New row",editText:'<span class="fooicon fooicon-pencil" aria-hidden="true"></span>',deleteText:'<span class="fooicon fooicon-trash" aria-hidden="true"></span>',viewText:'<span class="fooicon fooicon-stats" aria-hidden="true"></span>',allowAdd:!0,allowEdit:!0,allowDelete:!0,allowView:!1,column:{classes:"footable-editing",name:"editing",title:"",filterable:!1,sortable:!1}}}(jQuery,FooTable),function(a,b){b.is.defined(b.Paging)&&(b.Paging.prototype.unpaged=[],b.Paging.extend("predraw",function(){this.unpaged=this.ft.rows.array.slice(0),this._super()}))}(jQuery,FooTable),function(a,b){b.Row.prototype.add=function(c){c=b.is["boolean"](c)?c:!0;var d=this;return a.Deferred(function(a){var b=d.ft.rows.all.push(d)-1;return c?d.ft.draw().then(function(){a.resolve(b)}):void a.resolve(b)})},b.Row.prototype["delete"]=function(c){c=b.is["boolean"](c)?c:!0;var d=this;return a.Deferred(function(a){var e=d.ft.rows.all.indexOf(d);return b.is.number(e)&&e>=0&&e<d.ft.rows.all.length&&(d.ft.rows.all.splice(e,1),c)?d.ft.draw().then(function(){a.resolve(d)}):void a.resolve(d)})},b.is.defined(b.Paging)&&b.Row.extend("add",function(a){a=b.is["boolean"](a)?a:!0;var c,d=this,e=this._super(a),f=d.ft.use(b.Editing);return f&&f.pageToNew&&(c=d.ft.use(b.Paging))&&a?e.then(function(){var a=c.unpaged.indexOf(d),b=Math.ceil((a+1)/c.size);return c.current!==b?c["goto"](b):void 0}):e}),b.is.defined(b.Sorting)&&b.Row.extend("val",function(a,c){c=b.is["boolean"](c)?c:!0;var d=this._super(a);if(!b.is.hash(a))return d;var e=this;return c&&e.ft.draw().then(function(){var a,c=e.ft.use(b.Editing);if(b.is.defined(b.Paging)&&c&&c.pageToNew&&(a=e.ft.use(b.Paging))){var d=a.unpaged.indexOf(e),f=Math.ceil((d+1)/a.size);if(a.current!==f)return a["goto"](f)}}),d})}(jQuery,FooTable),function(a){a.Rows.prototype.add=function(b,c){var d=b;a.is.hash(b)&&(d=new FooTable.Row(this.ft,this.ft.columns.array,b)),d instanceof FooTable.Row&&d.add(c)},a.Rows.prototype.update=function(b,c,d){var e=this.ft.rows.all.length,f=b;a.is.number(b)&&b>=0&&e>b&&(f=this.ft.rows.all[b]),f instanceof FooTable.Row&&a.is.hash(c)&&f.val(c,d)},a.Rows.prototype["delete"]=function(b,c){var d=this.ft.rows.all.length,e=b;a.is.number(b)&&b>=0&&d>b&&(e=this.ft.rows.all[b]),e instanceof FooTable.Row&&e["delete"](c)}}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/js/footable.export.min.js b/js/third-party/footable/footable-components.latest/js/footable.export.min.js
new file mode 100644
index 0000000..a316d16
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/js/footable.export.min.js
@@ -0,0 +1,8 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a,b){b.Export=b.Component.extend({construct:function(a){this._super(a,!0),this.snapshot=[]},predraw:function(){this.snapshot=this.ft.rows.array.slice(0)},columns:function(){var a=[];return b.arr.each(this.ft.columns.array,function(b){b.internal||a.push({type:b.type,name:b.name,title:b.title,visible:b.visible,hidden:b.hidden,classes:b.classes,style:b.style})}),a},rows:function(a){a=b.is["boolean"](a)?a:!1;var c=a?this.ft.rows.all:this.snapshot,d=[];return b.arr.each(c,function(a){d.push(a.val())}),d},json:function(a){return JSON.parse(JSON.stringify({columns:this.columns(),rows:this.rows(a)}))},csv:function(a){var c,d,e="",f=this.columns();b.arr.each(f,function(a,b){d='"'+a.title.replace(/"/g,'""')+'"',e+=0===b?d:","+d}),e+="\n";var g=a?this.ft.rows.all:this.snapshot;return b.arr.each(g,function(a){b.arr.each(a.cells,function(a,b){a.column.internal||(c=a.column.stringify.call(a.column,a.value,a.ft.o,a.row.value),d='"'+c.replace(/"/g,'""')+'"',e+=0===b?d:","+d)}),e+="\n"}),e}}),b.components.register("export",b.Export,490)}(jQuery,FooTable),function(a){a.Column.prototype.__export_define__=function(b){this.stringify=a.checkFnValue(this,b.stringify,this.stringify)},a.Column.extend("define",function(a){this._super(a),this.__export_define__(a)}),a.Column.prototype.stringify=function(a,b,c){return a+""},a.DateColumn.prototype.stringify=function(b,c,d){return a.is.object(b)&&a.is["boolean"](b._isAMomentObject)&&b.isValid()?b.format(this.formatString):""},a.ObjectColumn.prototype.stringify=function(b,c,d){return a.is.object(b)?JSON.stringify(b):""},a.ArrayColumn.prototype.stringify=function(b,c,d){return a.is.array(b)?JSON.stringify(b):""}}(FooTable),function(a){a.Table.prototype.toJSON=function(b){return this.use(a.Export).json(b)},a.Table.prototype.toCSV=function(b){return this.use(a.Export).csv(b)}}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/js/footable.filtering.min.js b/js/third-party/footable/footable-components.latest/js/footable.filtering.min.js
new file mode 100644
index 0000000..e6629e4
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/js/footable.filtering.min.js
@@ -0,0 +1,8 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a){a.Filter=a.Class.extend({construct:function(b,c,d,e,f,g,h){this.name=b,this.space=!a.is.string(e)||"OR"!=e&&"AND"!=e?"AND":e,this.connectors=a.is["boolean"](f)?f:!0,this.ignoreCase=a.is["boolean"](g)?g:!0,this.hidden=a.is["boolean"](h)?h:!1,this.query=c instanceof a.Query?c:new a.Query(c,this.space,this.connectors,this.ignoreCase),this.columns=d},match:function(b){return a.is.string(b)?(a.is.string(this.query)&&(this.query=new a.Query(this.query,this.space,this.connectors,this.ignoreCase)),this.query instanceof a.Query?this.query.match(b):!1):!1},matchRow:function(b){var c=this,d=a.arr.map(b.cells,function(b){return a.arr.contains(c.columns,b.column)?b.filterValue:null}).join(" ");return c.match(d)}})}(FooTable),function(a,b){b.Filtering=b.Component.extend({construct:function(a){this._super(a,a.o.filtering.enabled),this.filters=a.o.filtering.filters,this.delay=a.o.filtering.delay,this.min=a.o.filtering.min,this.space=a.o.filtering.space,this.connectors=a.o.filtering.connectors,this.ignoreCase=a.o.filtering.ignoreCase,this.exactMatch=a.o.filtering.exactMatch,this.placeholder=a.o.filtering.placeholder,this.dropdownTitle=a.o.filtering.dropdownTitle,this.position=a.o.filtering.position,this.focus=a.o.filtering.focus,this.container=a.o.filtering.container,this.$container=null,this.$row=null,this.$cell=null,this.$form=null,this.$dropdown=null,this.$input=null,this.$button=null,this._filterTimeout=null,this._exactRegExp=/^"(.*?)"$/},preinit:function(a){var c=this;return c.ft.raise("preinit.ft.filtering").then(function(){c.ft.$el.hasClass("footable-filtering")&&(c.enabled=!0),c.enabled=b.is["boolean"](a.filtering)?a.filtering:c.enabled,c.enabled&&(c.space=b.is.string(a.filterSpace)?a.filterSpace:c.space,c.min=b.is.number(a.filterMin)?a.filterMin:c.min,c.connectors=b.is["boolean"](a.filterConnectors)?a.filterConnectors:c.connectors,c.ignoreCase=b.is["boolean"](a.filterIgnoreCase)?a.filterIgnoreCase:c.ignoreCase,c.exactMatch=b.is["boolean"](a.filterExactMatch)?a.filterExactMatch:c.exactMatch,c.focus=b.is["boolean"](a.filterFocus)?a.filterFocus:c.focus,c.delay=b.is.number(a.filterDelay)?a.filterDelay:c.delay,c.placeholder=b.is.string(a.filterPlaceholder)?a.filterPlaceholder:c.placeholder,c.dropdownTitle=b.is.string(a.filterDropdownTitle)?a.filterDropdownTitle:c.dropdownTitle,c.container=b.is.string(a.filterContainer)?a.filterContainer:c.container,c.filters=b.is.array(a.filterFilters)?c.ensure(a.filterFilters):c.ensure(c.filters),c.ft.$el.hasClass("footable-filtering-left")&&(c.position="left"),c.ft.$el.hasClass("footable-filtering-center")&&(c.position="center"),c.ft.$el.hasClass("footable-filtering-right")&&(c.position="right"),c.position=b.is.string(a.filterPosition)?a.filterPosition:c.position)},function(){c.enabled=!1})},init:function(){var a=this;return a.ft.raise("init.ft.filtering").then(function(){a.$create()},function(){a.enabled=!1})},destroy:function(){var a=this;return a.ft.raise("destroy.ft.filtering").then(function(){a.ft.$el.removeClass("footable-filtering").find("thead > tr.footable-filtering").remove()})},$create:function(){var c,d=this,e=a("<div/>",{"class":"form-group footable-filtering-search"}).append(a("<label/>",{"class":"sr-only",text:"Search"})),f=a("<div/>",{"class":"input-group"}).appendTo(e),g=a("<div/>",{"class":"input-group-btn"}),h=a("<button/>",{type:"button","class":"btn btn-default dropdown-toggle"}).on("click",{self:d},d._onDropdownToggleClicked).append(a("<span/>",{"class":"caret"}));switch(d.position){case"left":c="footable-filtering-left";break;case"center":c="footable-filtering-center";break;default:c="footable-filtering-right"}d.ft.$el.addClass("footable-filtering").addClass(c),d.$container=null===d.container?a():a(d.container).first(),d.$container.length?d.$container.addClass("footable-filtering-external").addClass(c):(d.$row=a("<tr/>",{"class":"footable-filtering"}).prependTo(d.ft.$el.children("thead")),d.$cell=a("<th/>").attr("colspan",d.ft.columns.visibleColspan).appendTo(d.$row),d.$container=d.$cell),d.$form=a("<form/>",{"class":"form-inline"}).append(e).appendTo(d.$container),d.$input=a("<input/>",{type:"text","class":"form-control",placeholder:d.placeholder}),d.$button=a("<button/>",{type:"button","class":"btn btn-primary"}).on("click",{self:d},d._onSearchButtonClicked).append(a("<span/>",{"class":"fooicon fooicon-search"})),d.$dropdown=a("<ul/>",{"class":"dropdown-menu dropdown-menu-right"}),b.is.emptyString(d.dropdownTitle)||d.$dropdown.append(a("<li/>",{"class":"dropdown-header",text:d.dropdownTitle})),d.$dropdown.append(b.arr.map(d.ft.columns.array,function(b){return b.filterable?a("<li/>").append(a("<a/>",{"class":"checkbox"}).append(a("<label/>",{html:b.title}).prepend(a("<input/>",{type:"checkbox",checked:!0}).data("__FooTableColumn__",b)))):null})),d.delay>0&&(d.$input.on("keypress keyup paste",{self:d},d._onSearchInputChanged),d.$dropdown.on("click",'input[type="checkbox"]',{self:d},d._onSearchColumnClicked)),g.append(d.$button,h,d.$dropdown),f.append(d.$input,g)},predraw:function(){if(!b.is.emptyArray(this.filters)){var c=this;c.ft.rows.array=a.grep(c.ft.rows.array,function(a){return a.filtered(c.filters)})}},draw:function(){b.is.jq(this.$cell)&&this.$cell.attr("colspan",this.ft.columns.visibleColspan);var a=this.find("search");if(a instanceof b.Filter){var c=a.query.val();this.exactMatch&&this._exactRegExp.test(c)&&(c=c.replace(this._exactRegExp,"$1")),this.$input.val(c)}else this.$input.val(null);this.setButton(!b.arr.any(this.filters,function(a){return!a.hidden}))},addFilter:function(a,c,d,e,f,g,h){var i=this.createFilter(a,c,d,e,f,g,h);i instanceof b.Filter&&(this.removeFilter(i.name),this.filters.push(i))},removeFilter:function(a){b.arr.remove(this.filters,function(b){return b.name==a})},filter:function(a){var b=this;return b.filters=b.ensure(b.filters),b.ft.raise("before.ft.filtering",[b.filters]).then(function(){if(b.filters=b.ensure(b.filters),a)var c=b.$input.prop("selectionStart"),d=b.$input.prop("selectionEnd");return b.ft.draw().then(function(){a&&b.$input.focus().prop({selectionStart:c,selectionEnd:d}),b.ft.raise("after.ft.filtering",[b.filters])})})},clear:function(){return this.filters=b.arr.get(this.filters,function(a){return a.hidden}),this.filter(this.focus)},setButton:function(a){a?this.$button.children(".fooicon").removeClass("fooicon-remove").addClass("fooicon-search"):this.$button.children(".fooicon").removeClass("fooicon-search").addClass("fooicon-remove")},find:function(a){return b.arr.first(this.filters,function(b){return b.name==a})},columns:function(){return b.is.jq(this.$dropdown)?this.$dropdown.find("input:checked").map(function(){return a(this).data("__FooTableColumn__")}).get():this.ft.columns.get(function(a){return a.filterable})},ensure:function(a){var c=this,d=[],e=c.columns();return b.is.emptyArray(a)||b.arr.each(a,function(a){a=c._ensure(a,e),a instanceof b.Filter&&d.push(a)}),d},createFilter:function(a,c,d,e,f,g,h){return b.is.string(a)&&(a={name:a,query:c,columns:d,ignoreCase:e,connectors:f,space:g,hidden:h}),this._ensure(a,this.columns())},_ensure:function(a,c){return(b.is.hash(a)||a instanceof b.Filter)&&!b.is.emptyString(a.name)&&(!b.is.emptyString(a.query)||a.query instanceof b.Query)?(a.columns=b.is.emptyArray(a.columns)?c:this.ft.columns.ensure(a.columns),a.ignoreCase=b.is["boolean"](a.ignoreCase)?a.ignoreCase:this.ignoreCase,a.connectors=b.is["boolean"](a.connectors)?a.connectors:this.connectors,a.hidden=b.is["boolean"](a.hidden)?a.hidden:!1,a.space=!b.is.string(a.space)||"AND"!==a.space&&"OR"!==a.space?this.space:a.space,a.query=b.is.string(a.query)?new b.Query(a.query,a.space,a.connectors,a.ignoreCase):a.query,a instanceof b.Filter?a:new b.Filter(a.name,a.query,a.columns,a.space,a.connectors,a.ignoreCase,a.hidden)):null},_onSearchInputChanged:function(a){var c=a.data.self,d="keypress"==a.type&&!b.is.emptyString(String.fromCharCode(a.charCode)),e="keyup"==a.type&&(8==a.which||46==a.which),f="paste"==a.type;(d||e||f)&&(13==a.which&&a.preventDefault(),null!=c._filterTimeout&&clearTimeout(c._filterTimeout),c._filterTimeout=setTimeout(function(){c._filterTimeout=null;var a=c.$input.val();a.length>=c.min?(c.exactMatch&&!c._exactRegExp.test(a)&&(a='"'+a+'"'),c.addFilter("search",a),c.filter(c.focus)):b.is.emptyString(a)&&c.clear()},c.delay))},_onSearchButtonClicked:function(a){a.preventDefault();var b=a.data.self;null!=b._filterTimeout&&clearTimeout(b._filterTimeout);var c=b.$button.children(".fooicon");if(c.hasClass("fooicon-remove"))b.clear();else{var d=b.$input.val();d.length>=b.min&&(b.exactMatch&&!b._exactRegExp.test(d)&&(d='"'+d+'"'),b.addFilter("search",d),b.filter(b.focus))}},_onSearchColumnClicked:function(a){var b=a.data.self;null!=b._filterTimeout&&clearTimeout(b._filterTimeout),b._filterTimeout=setTimeout(function(){b._filterTimeout=null;var a=b.$button.children(".fooicon");a.hasClass("fooicon-remove")&&(a.removeClass("fooicon-remove").addClass("fooicon-search"),b.addFilter("search",b.$input.val()),b.filter())},b.delay)},_onDropdownToggleClicked:function(b){b.preventDefault(),b.stopPropagation();var c=b.data.self;c.$dropdown.parent().toggleClass("open"),c.$dropdown.parent().hasClass("open")?a(document).on("click.footable",{self:c},c._onDocumentClicked):a(document).off("click.footable",c._onDocumentClicked)},_onDocumentClicked:function(b){if(0==a(b.target).closest(".dropdown-menu").length){b.preventDefault();var c=b.data.self;c.$dropdown.parent().removeClass("open"),a(document).off("click.footable",c._onDocumentClicked)}}}),b.components.register("filtering",b.Filtering,500)}(jQuery,FooTable),function(a){a.Query=a.Class.extend({construct:function(b,c,d,e){this._original=null,this._value=null,this.space=!a.is.string(c)||"OR"!=c&&"AND"!=c?"AND":c,this.connectors=a.is["boolean"](d)?d:!0,this.ignoreCase=a.is["boolean"](e)?e:!0,this.left=null,this.right=null,this.parts=[],this.operator=null,this.val(b)},val:function(b){if(a.is.emptyString(b))return this._value;if(a.is.emptyString(this._original))this._original=b;else if(this._original==b)return;this._value=b,this._parse()},match:function(b){return a.is.emptyString(this.operator)||"OR"===this.operator?this._left(b,!1)||this._match(b,!1)||this._right(b,!1):"AND"===this.operator?this._left(b,!0)&&this._match(b,!0)&&this._right(b,!0):void 0},_match:function(b,c){var d=this,e=!1,f=a.is.emptyString(b);return a.is.emptyArray(d.parts)&&d.left instanceof a.Query?c:a.is.emptyArray(d.parts)?e:("OR"===d.space?a.arr.each(d.parts,function(c){if(c.empty&&f){if(e=!0,c.negate)return e=!1}else{var g=(c.exact?a.str.containsExact:a.str.contains)(b,c.query,d.ignoreCase);if(g&&!c.negate&&(e=!0),g&&c.negate)return e=!1}}):(e=!0,a.arr.each(d.parts,function(c){if(c.empty)return(!f&&!c.negate||f&&c.negate)&&(e=!1),e;var g=(c.exact?a.str.containsExact:a.str.contains)(b,c.query,d.ignoreCase);return(!g&&!c.negate||g&&c.negate)&&(e=!1),e})),e)},_left:function(b,c){return this.left instanceof a.Query?this.left.match(b):c},_right:function(b,c){return this.right instanceof a.Query?this.right.match(b):c},_parse:function(){if(!a.is.emptyString(this._value))if(/\sOR\s/.test(this._value)){this.operator="OR";var b=this._value.split(/(?:\sOR\s)(.*)?/);this.left=new a.Query(b[0],this.space,this.connectors,this.ignoreCase),this.right=new a.Query(b[1],this.space,this.connectors,this.ignoreCase)}else if(/\sAND\s/.test(this._value)){this.operator="AND";var c=this._value.split(/(?:\sAND\s)(.*)?/);this.left=new a.Query(c[0],this.space,this.connectors,this.ignoreCase),this.right=new a.Query(c[1],this.space,this.connectors,this.ignoreCase)}else{var d=this;this.parts=a.arr.map(this._value.match(/(?:[^\s"]+|"[^"]*")+/g),function(a){return d._part(a)})}},_part:function(b){var c={query:b,negate:!1,phrase:!1,exact:!1,empty:!1};return a.str.startsWith(c.query,"-")&&(c.query=a.str.from(c.query,"-"),c.negate=!0),/^"(.*?)"$/.test(c.query)?(c.query=c.query.replace(/^"(.*?)"$/,"$1"),c.phrase=!0,c.exact=!0):this.connectors&&/(?:\w)+?([-_\+\.])(?:\w)+?/.test(c.query)&&(c.query=c.query.replace(/(?:\w)+?([-_\+\.])(?:\w)+?/g,function(a,b){return a.replace(b," ")}),c.phrase=!0),c.empty=c.phrase&&a.is.emptyString(c.query),c}})}(FooTable),function(a){a.Cell.prototype.filterValue=null,a.Cell.prototype.__filtering_define__=function(a){this.filterValue=this.column.filterValue.call(this.column,a)},a.Cell.prototype.__filtering_val__=function(b){a.is.defined(b)&&(this.filterValue=this.column.filterValue.call(this.column,b))},a.Cell.extend("define",function(a){this._super(a),this.__filtering_define__(a)}),a.Cell.extend("val",function(a,b,c){var d=this._super(a,b,c);return this.__filtering_val__(a),d})}(FooTable),function(a,b){b.Column.prototype.filterable=!0,b.Column.prototype.filterValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("filterValue");return b.is.defined(d)?""+d:a(c).text()}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.filterValue))return c.options.filterValue;b.is.defined(c.value)&&(c=c.value)}return b.is.defined(c)&&null!=c?c+"":""},b.Column.prototype.__filtering_define__=function(a){this.filterable=b.is["boolean"](a.filterable)?a.filterable:this.filterable,this.filterValue=b.checkFnValue(this,a.filterValue,this.filterValue)},b.Column.extend("define",function(a){this._super(a),this.__filtering_define__(a)})}(jQuery,FooTable),function(a){a.Defaults.prototype.filtering={enabled:!1,filters:[],delay:1200,min:1,space:"AND",placeholder:"Search",dropdownTitle:null,position:"right",connectors:!0,ignoreCase:!0,exactMatch:!1,focus:!0,container:null}}(FooTable),function(a){a.Row.prototype.filtered=function(b){var c=!0,d=this;return a.arr.each(b,function(a){return 0==(c=a.matchRow(d))?!1:void 0}),c}}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/js/footable.paging.min.js b/js/third-party/footable/footable-components.latest/js/footable.paging.min.js
new file mode 100644
index 0000000..5c71a2f
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/js/footable.paging.min.js
@@ -0,0 +1,8 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a,b){b.Pager=b.Class.extend({construct:function(a,b,c,d,e){this.total=a,this.current=b,this.size=c,this.page=d,this.forward=e}})}(jQuery,FooTable),function(a,b){b.Paging=b.Component.extend({construct:function(a){this._super(a,a.o.paging.enabled),this.strings=a.o.paging.strings,this.current=a.o.paging.current,this.size=a.o.paging.size,this.limit=a.o.paging.limit,this.position=a.o.paging.position,this.countFormat=a.o.paging.countFormat,this.container=a.o.paging.container,this.total=-1,this.totalRows=0,this.previous=-1,this.formattedCount=null,this.$container=null,this.$wrapper=null,this.$row=null,this.$cell=null,this.$pagination=null,this.$count=null,this.detached=!0,this._createdLinks=0},preinit:function(a){var c=this;this.ft.raise("preinit.ft.paging",[a]).then(function(){c.ft.$el.hasClass("footable-paging")&&(c.enabled=!0),c.enabled=b.is["boolean"](a.paging)?a.paging:c.enabled,c.enabled&&(c.size=b.is.number(a.pagingSize)?a.pagingSize:c.size,c.current=b.is.number(a.pagingCurrent)?a.pagingCurrent:c.current,c.limit=b.is.number(a.pagingLimit)?a.pagingLimit:c.limit,c.ft.$el.hasClass("footable-paging-left")&&(c.position="left"),c.ft.$el.hasClass("footable-paging-center")&&(c.position="center"),c.ft.$el.hasClass("footable-paging-right")&&(c.position="right"),c.position=b.is.string(a.pagingPosition)?a.pagingPosition:c.position,c.countFormat=b.is.string(a.pagingCountFormat)?a.pagingCountFormat:c.countFormat,c.container=b.is.string(a.pagingContainer)?a.pagingContainer:c.container,c.total=Math.ceil(c.ft.rows.all.length/c.size))},function(){c.enabled=!1})},init:function(){var a=this;this.ft.raise("init.ft.paging").then(function(){a.$create()},function(){a.enabled=!1})},destroy:function(){var a=this;this.ft.raise("destroy.ft.paging").then(function(){a.ft.$el.removeClass("footable-paging").find("tfoot > tr.footable-paging").remove(),a.detached=!0,a._createdLinks=0})},predraw:function(){this.total=Math.ceil(this.ft.rows.array.length/this.size),this.current=this.current>this.total?this.total:this.current<1?1:this.current,this.totalRows=this.ft.rows.array.length,this.totalRows>this.size&&(this.ft.rows.array=this.ft.rows.array.splice((this.current-1)*this.size,this.size)),this.formattedCount=this.format(this.countFormat)},draw:function(){if(this.total<=1)this.detached||(this.$row?this.$row.detach():this.$wrapper.detach(),this.detached=!0);else{if(this.detached){if(this.$row){var c=this.ft.$el.children("tfoot");0==c.length&&(c=a("<tfoot/>"),this.ft.$el.append(c)),this.$row.appendTo(c)}else this.$wrapper.appendTo(this.$container);this.detached=!1}b.is.jq(this.$cell)&&this.$cell.attr("colspan",this.ft.columns.visibleColspan),this._createLinks(),this._setVisible(this.current,this.current>this.previous),this._setNavigation(!0),this.$count.text(this.formattedCount)}},$create:function(){this._createdLinks=0;var c="footable-paging-center";switch(this.position){case"left":c="footable-paging-left";break;case"right":c="footable-paging-right"}if(this.ft.$el.addClass("footable-paging").addClass(c),this.$container=null===this.container?null:a(this.container).first(),b.is.jq(this.$container))this.$container.addClass("footable-paging-external").addClass(c);else{var d=this.ft.$el.children("tfoot");0==d.length&&(d=a("<tfoot/>"),this.ft.$el.append(d)),this.$row=a("<tr/>",{"class":"footable-paging"}).prependTo(d),this.$container=this.$cell=a("<td/>").attr("colspan",this.ft.columns.visibleColspan).appendTo(this.$row)}this.$wrapper=a("<div/>",{"class":"footable-pagination-wrapper"}).appendTo(this.$container),this.$pagination=a("<ul/>",{"class":"pagination"}).on("click.footable","a.footable-page-link",{self:this},this._onPageClicked),this.$count=a("<span/>",{"class":"label label-default"}),this.$wrapper.append(this.$pagination,a("<div/>",{"class":"divider"}),this.$count),this.detached=!1},format:function(a){var b=this.size*(this.current-1)+1,c=this.size*this.current;return 0==this.ft.rows.array.length?(b=0,c=0):c=c>this.totalRows?this.totalRows:c,a.replace(/\{CP}/g,this.current).replace(/\{TP}/g,this.total).replace(/\{PF}/g,b).replace(/\{PL}/g,c).replace(/\{TR}/g,this.totalRows)},first:function(){return this._set(1)},prev:function(){return this._set(this.current-1>0?this.current-1:1)},next:function(){return this._set(this.current+1<this.total?this.current+1:this.total)},last:function(){return this._set(this.total)},"goto":function(a){return this._set(a>this.total?this.total:1>a?1:a)},prevPages:function(){var a=this.$pagination.children("li.footable-page.visible:first").data("page")-1;this._setVisible(a,!0),this._setNavigation(!1)},nextPages:function(){var a=this.$pagination.children("li.footable-page.visible:last").data("page")+1;this._setVisible(a,!1),this._setNavigation(!1)},pageSize:function(a){return a=parseInt(a),isNaN(a)?this.size:(this.size=a,this.total=Math.ceil(this.ft.rows.all.length/this.size),b.is.jq(this.$wrapper)&&(this.$container.is("td")?this.$row.remove():this.$wrapper.remove()),this.$create(),void this.ft.draw())},_set:function(c){var d=this,e=new b.Pager(d.total,d.current,d.size,c,c>d.current);return d.ft.raise("before.ft.paging",[e]).then(function(){return e.page=e.page>e.total?e.total:e.page,e.page=e.page<1?1:e.page,d.current==c?a.when():(d.previous=d.current,d.current=e.page,d.ft.draw().then(function(){d.ft.raise("after.ft.paging",[e])}))})},_createLinks:function(){if(this._createdLinks!==this.total){var b=this,c=b.total>1,d=function(b,c,d){return a("<li/>",{"class":d}).attr("data-page",b).append(a("<a/>",{"class":"footable-page-link",href:"#"}).data("page",b).html(c))};b.$pagination.empty(),c&&(b.$pagination.append(d("first",b.strings.first,"footable-page-nav")),b.$pagination.append(d("prev",b.strings.prev,"footable-page-nav")),b.limit>0&&b.limit<b.total&&b.$pagination.append(d("prev-limit",b.strings.prevPages,"footable-page-nav")));for(var e,f=0;f<b.total;f++)e=d(f+1,f+1,"footable-page"),b.$pagination.append(e);c&&(b.limit>0&&b.limit<b.total&&b.$pagination.append(d("next-limit",b.strings.nextPages,"footable-page-nav")),b.$pagination.append(d("next",b.strings.next,"footable-page-nav")),b.$pagination.append(d("last",b.strings.last,"footable-page-nav"))),b._createdLinks=b.total}},_setNavigation:function(a){1==this.current?this.$pagination.children('li[data-page="first"],li[data-page="prev"]').addClass("disabled"):this.$pagination.children('li[data-page="first"],li[data-page="prev"]').removeClass("disabled"),this.current==this.total?this.$pagination.children('li[data-page="next"],li[data-page="last"]').addClass("disabled"):this.$pagination.children('li[data-page="next"],li[data-page="last"]').removeClass("disabled"),1==(this.$pagination.children("li.footable-page.visible:first").data("page")||1)?this.$pagination.children('li[data-page="prev-limit"]').addClass("disabled"):this.$pagination.children('li[data-page="prev-limit"]').removeClass("disabled"),(this.$pagination.children("li.footable-page.visible:last").data("page")||this.limit)==this.total?this.$pagination.children('li[data-page="next-limit"]').addClass("disabled"):this.$pagination.children('li[data-page="next-limit"]').removeClass("disabled"),this.limit>0&&this.total<this.limit?this.$pagination.children('li[data-page="prev-limit"],li[data-page="next-limit"]').css("display","none"):this.$pagination.children('li[data-page="prev-limit"],li[data-page="next-limit"]').css("display",""),a&&this.$pagination.children("li.footable-page").removeClass("active").filter('li[data-page="'+this.current+'"]').addClass("active")},_setVisible:function(a,b){if(this.limit>0&&this.total>this.limit){if(!this.$pagination.children('li.footable-page[data-page="'+a+'"]').hasClass("visible")){var c=0,d=0;1==b?(d=a>this.total?this.total:a,c=d-this.limit):(c=1>a?0:a-1,d=c+this.limit),0>c&&(c=0,d=this.limit>this.total?this.total:this.limit),d>this.total&&(d=this.total,c=this.total-this.limit<0?0:this.total-this.limit),this.$pagination.children("li.footable-page").removeClass("visible").slice(c,d).addClass("visible")}}else this.$pagination.children("li.footable-page").removeClass("visible").slice(0,this.total).addClass("visible")},_onPageClicked:function(b){if(b.preventDefault(),!a(b.target).closest("li").is(".active,.disabled")){var c=b.data.self,d=a(this).data("page");switch(d){case"first":return void c.first();case"prev":return void c.prev();case"next":return void c.next();case"last":return void c.last();case"prev-limit":return void c.prevPages();case"next-limit":return void c.nextPages();default:return void c._set(d)}}}}),b.components.register("paging",b.Paging,400)}(jQuery,FooTable),function(a){a.Defaults.prototype.paging={enabled:!1,countFormat:"{CP} of {TP}",current:1,limit:5,position:"center",size:10,container:null,strings:{first:"&laquo;",prev:"&lsaquo;",next:"&rsaquo;",last:"&raquo;",prevPages:"...",nextPages:"..."}}}(FooTable),function(a){a.Table.prototype.gotoPage=function(b){return this.use(a.Paging)["goto"](b)},a.Table.prototype.nextPage=function(){return this.use(a.Paging).next()},a.Table.prototype.prevPage=function(){return this.use(a.Paging).prev()},a.Table.prototype.firstPage=function(){return this.use(a.Paging).first()},a.Table.prototype.lastPage=function(){return this.use(a.Paging).last()},a.Table.prototype.nextPages=function(){return this.use(a.Paging).nextPages()},a.Table.prototype.prevPages=function(){return this.use(a.Paging).prevPages()},a.Table.prototype.pageSize=function(b){return this.use(a.Paging).pageSize(b)}}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/js/footable.sorting.min.js b/js/third-party/footable/footable-components.latest/js/footable.sorting.min.js
new file mode 100644
index 0000000..bd2a1c8
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/js/footable.sorting.min.js
@@ -0,0 +1,8 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a,b){b.Sorter=b.Class.extend({construct:function(a,b){this.column=a,this.direction=b}})}(jQuery,FooTable),function(a,b){b.Sorting=b.Component.extend({construct:function(a){this._super(a,a.o.sorting.enabled),this.o=a.o.sorting,this.column=null,this.allowed=!0,this.initial=null},preinit:function(a){var c=this;this.ft.raise("preinit.ft.sorting",[a]).then(function(){c.ft.$el.hasClass("footable-sorting")&&(c.enabled=!0),c.enabled=b.is["boolean"](a.sorting)?a.sorting:c.enabled,c.enabled&&(c.column=b.arr.first(c.ft.columns.array,function(a){return a.sorted}))},function(){c.enabled=!1})},init:function(){var c=this;this.ft.raise("init.ft.sorting").then(function(){if(!c.initial){var d=!!c.column;c.initial={isset:d,rows:c.ft.rows.all.slice(0),column:d?c.column.name:null,direction:d?c.column.direction:null}}b.arr.each(c.ft.columns.array,function(b){b.sortable&&b.$el.addClass("footable-sortable").append(a("<span/>",{"class":"fooicon fooicon-sort"}))}),c.ft.$el.on("click.footable",".footable-sortable",{self:c},c._onSortClicked)},function(){c.enabled=!1})},destroy:function(){var a=this;this.ft.raise("destroy.ft.paging").then(function(){a.ft.$el.off("click.footable",".footable-sortable",a._onSortClicked),a.ft.$el.children("thead").children("tr.footable-header").children(".footable-sortable").removeClass("footable-sortable footable-asc footable-desc").find("span.fooicon").remove()})},predraw:function(){if(this.column){var a=this,b=a.column;a.ft.rows.array.sort(function(a,c){return"DESC"==b.direction?b.sorter(c.cells[b.index].sortValue,a.cells[b.index].sortValue):b.sorter(a.cells[b.index].sortValue,c.cells[b.index].sortValue)})}},draw:function(){if(this.column){var a=this,b=a.ft.$el.find("thead > tr > .footable-sortable"),c=a.column.$el;b.removeClass("footable-asc footable-desc").children(".fooicon").removeClass("fooicon-sort fooicon-sort-asc fooicon-sort-desc"),b.not(c).children(".fooicon").addClass("fooicon-sort"),c.addClass("DESC"==a.column.direction?"footable-desc":"footable-asc").children(".fooicon").addClass("DESC"==a.column.direction?"fooicon-sort-desc":"fooicon-sort-asc")}},sort:function(a,b){return this._sort(a,b)},toggleAllowed:function(a){a=b.is["boolean"](a)?a:!this.allowed,this.allowed=a,this.ft.$el.toggleClass("footable-sorting-disabled",!this.allowed)},hasChanged:function(){return!(!this.initial||!this.column||this.column.name===this.initial.column&&(this.column.direction===this.initial.direction||null===this.initial.direction&&"ASC"===this.column.direction))},reset:function(){this.initial&&(this.initial.isset?this.sort(this.initial.column,this.initial.direction):(this.column&&(this.column.$el.removeClass("footable-asc footable-desc"),this.column=null),this.ft.rows.all=this.initial.rows,this.ft.draw()))},_sort:function(c,d){if(!this.allowed)return a.Deferred().reject("sorting disabled");var e=this,f=new b.Sorter(e.ft.columns.get(c),b.Sorting.dir(d));return e.ft.raise("before.ft.sorting",[f]).then(function(){return b.arr.each(e.ft.columns.array,function(a){a!=e.column&&(a.direction=null)}),e.column=e.ft.columns.get(f.column),e.column&&(e.column.direction=b.Sorting.dir(f.direction)),e.ft.draw().then(function(){e.ft.raise("after.ft.sorting",[f])})})},_onSortClicked:function(b){var c=b.data.self,d=a(this).closest("th,td"),e=d.is(".footable-asc, .footable-desc")?d.hasClass("footable-desc")?"ASC":"DESC":"ASC";c._sort(d.index(),e)}}),b.Sorting.dir=function(a){return!b.is.string(a)||"ASC"!=a&&"DESC"!=a?"ASC":a},b.components.register("sorting",b.Sorting,600)}(jQuery,FooTable),function(a){a.Cell.prototype.sortValue=null,a.Cell.prototype.__sorting_define__=function(a){this.sortValue=this.column.sortValue.call(this.column,a)},a.Cell.prototype.__sorting_val__=function(b){a.is.defined(b)&&(this.sortValue=this.column.sortValue.call(this.column,b))},a.Cell.extend("define",function(a){this._super(a),this.__sorting_define__(a)}),a.Cell.extend("val",function(a,b,c){var d=this._super(a,b,c);return this.__sorting_val__(a),d})}(FooTable),function(a,b){b.Column.prototype.direction=null,b.Column.prototype.sortable=!0,b.Column.prototype.sorted=!1,b.Column.prototype.sorter=function(a,b){return"string"==typeof a&&(a=a.toLowerCase()),"string"==typeof b&&(b=b.toLowerCase()),a===b?0:b>a?-1:1},b.Column.prototype.sortValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("sortValue");return b.is.defined(d)?d:this.parser(c)}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.sortValue))return c.options.sortValue;b.is.defined(c.value)&&(c=c.value)}return b.is.defined(c)&&null!=c?c:null},b.Column.prototype.__sorting_define__=function(a){this.sorter=b.checkFnValue(this,a.sorter,this.sorter),this.direction=b.is.type(a.direction,"string")?b.Sorting.dir(a.direction):null,this.sortable=b.is["boolean"](a.sortable)?a.sortable:!0,this.sorted=b.is["boolean"](a.sorted)?a.sorted:!1,this.sortValue=b.checkFnValue(this,a.sortValue,this.sortValue)},b.Column.extend("define",function(a){this._super(a),this.__sorting_define__(a)})}(jQuery,FooTable),function(a){a.Defaults.prototype.sorting={enabled:!1}}(FooTable),function(a,b){b.HTMLColumn.extend("__sorting_define__",function(c){this._super(c),this.sortUse=b.is.string(c.sortUse)&&-1!==a.inArray(c.sortUse,["html","text"])?c.sortUse:"html"}),b.HTMLColumn.prototype.sortValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("sortValue");return b.is.defined(d)?d:this.parser(c)}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.sortValue))return c.options.sortValue;b.is.defined(c.value)&&(c=c.value)}return b.is.defined(c)&&null!=c?c:null}}(jQuery,FooTable),function(a,b){b.NumberColumn.prototype.sortValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("sortValue");return b.is.number(d)?d:this.parser(c)}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.sortValue))return this.parser(c);if(b.is.number(c.options.sortValue))return c.options.sortValue;if(b.is.number(c.value))return c.value}return b.is.string(c)?this.parser(c):b.is.number(c)?c:null}}(jQuery,FooTable),function(a){a.Table.prototype.sort=function(b,c){return this.use(a.Sorting).sort(b,c)}}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/footable/footable-components.latest/js/footable.state.min.js b/js/third-party/footable/footable-components.latest/js/footable.state.min.js
new file mode 100644
index 0000000..a19bec2
--- /dev/null
+++ b/js/third-party/footable/footable-components.latest/js/footable.state.min.js
@@ -0,0 +1,8 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a,b){var c=0,d=function(a){var b,c,d=2166136261;for(b=0,c=a.length;c>b;b++)d^=a.charCodeAt(b),d+=(d<<1)+(d<<4)+(d<<7)+(d<<8)+(d<<24);return d>>>0}(location.origin+location.pathname);b.State=b.Component.extend({construct:function(a){this._super(a,a.o.state.enabled),this._key="1",this.key=this._key+(b.is.string(a.o.state.key)?a.o.state.key:this._uid()),this.filtering=b.is["boolean"](a.o.state.filtering)?a.o.state.filtering:!0,this.paging=b.is["boolean"](a.o.state.paging)?a.o.state.paging:!0,this.sorting=b.is["boolean"](a.o.state.sorting)?a.o.state.sorting:!0},preinit:function(a){var c=this;this.ft.raise("preinit.ft.state",[a]).then(function(){c.enabled=b.is["boolean"](a.state)?a.state:c.enabled,c.enabled&&(c.key=c._key+(b.is.string(a.stateKey)?a.stateKey:c.key),c.filtering=b.is["boolean"](a.stateFiltering)?a.stateFiltering:c.filtering,c.paging=b.is["boolean"](a.statePaging)?a.statePaging:c.paging,c.sorting=b.is["boolean"](a.stateSorting)?a.stateSorting:c.sorting)},function(){c.enabled=!1})},get:function(a){return JSON.parse(localStorage.getItem(this.key+":"+a))},set:function(a,b){localStorage.setItem(this.key+":"+a,JSON.stringify(b))},remove:function(a){localStorage.removeItem(this.key+":"+a)},read:function(){this.ft.execute(!1,!0,"readState")},write:function(){this.ft.execute(!1,!0,"writeState")},clear:function(){this.ft.execute(!1,!0,"clearState")},_uid:function(){var a=this.ft.$el.attr("id");return d+"_"+(b.is.string(a)?a:++c)}}),b.components.register("state",b.State,700)}(jQuery,FooTable),function(a){a.Component.prototype.readState=function(){},a.Component.prototype.writeState=function(){},a.Component.prototype.clearState=function(){}}(FooTable),function(a){a.Defaults.prototype.state={enabled:!1,filtering:!0,paging:!0,sorting:!0,key:null}}(FooTable),function(a){a.Filtering&&(a.Filtering.prototype.readState=function(){if(this.ft.state.filtering){var b=this.ft.state.get("filtering");a.is.hash(b)&&!a.is.emptyArray(b.filters)&&(this.filters=this.ensure(b.filters))}},a.Filtering.prototype.writeState=function(){if(this.ft.state.filtering){var b=a.arr.map(this.filters,function(b){return{name:b.name,query:b.query instanceof a.Query?b.query.val():b.query,columns:a.arr.map(b.columns,function(a){return a.name}),hidden:b.hidden,space:b.space,connectors:b.connectors,ignoreCase:b.ignoreCase}});this.ft.state.set("filtering",{filters:b})}},a.Filtering.prototype.clearState=function(){this.ft.state.filtering&&this.ft.state.remove("filtering")})}(FooTable),function(a){a.Paging&&(a.Paging.prototype.readState=function(){if(this.ft.state.paging){var b=this.ft.state.get("paging");a.is.hash(b)&&(this.current=b.current,this.size=b.size)}},a.Paging.prototype.writeState=function(){this.ft.state.paging&&this.ft.state.set("paging",{current:this.current,size:this.size})},a.Paging.prototype.clearState=function(){this.ft.state.paging&&this.ft.state.remove("paging")})}(FooTable),function(a){a.Sorting&&(a.Sorting.prototype.readState=function(){if(this.ft.state.sorting){var b=this.ft.state.get("sorting");if(a.is.hash(b)){var c=this.ft.columns.get(b.column);c instanceof a.Column&&(this.column=c,this.column.direction=b.direction)}}},a.Sorting.prototype.writeState=function(){this.ft.state.sorting&&this.column instanceof a.Column&&this.ft.state.set("sorting",{column:this.column.name,direction:this.column.direction})},a.Sorting.prototype.clearState=function(){this.ft.state.sorting&&this.ft.state.remove("sorting")})}(FooTable),function(a){a.Table.extend("_construct",function(a){return this.state=this.use(FooTable.State),this._super(a)}),a.Table.extend("_preinit",function(){var a=this;return a._super().then(function(){a.state.enabled&&a.state.read()})}),a.Table.extend("draw",function(){var a=this;return a._super().then(function(){a.state.enabled&&a.state.write()})})}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/footable/footable-standalone.latest/css/footable.standalone.min.css b/js/third-party/footable/footable-standalone.latest/css/footable.standalone.min.css
new file mode 100644
index 0000000..0ac5adf
--- /dev/null
+++ b/js/third-party/footable/footable-standalone.latest/css/footable.standalone.min.css
@@ -0,0 +1 @@
+.footable .btn,.footable .caret{display:inline-block;vertical-align:middle}.footable-details.table,.footable-details.table *,.footable.table,.footable.table *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.footable-details.table th,.footable.table th{text-align:left}.footable-details.table,.footable.table{width:100%;max-width:100%;margin-bottom:20px}.footable-details.table>caption+thead>tr:first-child>td,.footable-details.table>caption+thead>tr:first-child>th,.footable-details.table>colgroup+thead>tr:first-child>td,.footable-details.table>colgroup+thead>tr:first-child>th,.footable-details.table>thead:first-child>tr:first-child>td,.footable-details.table>thead:first-child>tr:first-child>th,.footable.table>caption+thead>tr:first-child>td,.footable.table>caption+thead>tr:first-child>th,.footable.table>colgroup+thead>tr:first-child>td,.footable.table>colgroup+thead>tr:first-child>th,.footable.table>thead:first-child>tr:first-child>td,.footable.table>thead:first-child>tr:first-child>th{border-top:0}.footable-details.table>tbody>tr>td,.footable-details.table>tbody>tr>th,.footable-details.table>tfoot>tr>td,.footable-details.table>tfoot>tr>th,.footable-details.table>thead>tr>td,.footable-details.table>thead>tr>th,.footable.table>tbody>tr>td,.footable.table>tbody>tr>th,.footable.table>tfoot>tr>td,.footable.table>tfoot>tr>th,.footable.table>thead>tr>td,.footable.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.footable-details.table>thead>tr>td,.footable-details.table>thead>tr>th,.footable.table>thead>tr>td,.footable.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.footable-details.table-condensed>tbody>tr>td,.footable-details.table-condensed>tbody>tr>th,.footable-details.table-condensed>tfoot>tr>td,.footable-details.table-condensed>tfoot>tr>th,.footable-details.table-condensed>thead>tr>td,.footable-details.table-condensed>thead>tr>th,.footable.table-condensed>tbody>tr>td,.footable.table-condensed>tbody>tr>th,.footable.table-condensed>tfoot>tr>td,.footable.table-condensed>tfoot>tr>th,.footable.table-condensed>thead>tr>td,.footable.table-condensed>thead>tr>th{padding:5px}.footable-details.table-bordered,.footable-details.table-bordered>tbody>tr>td,.footable-details.table-bordered>tbody>tr>th,.footable-details.table-bordered>tfoot>tr>td,.footable-details.table-bordered>tfoot>tr>th,.footable-details.table-bordered>thead>tr>td,.footable-details.table-bordered>thead>tr>th,.footable.table-bordered,.footable.table-bordered>tbody>tr>td,.footable.table-bordered>tbody>tr>th,.footable.table-bordered>tfoot>tr>td,.footable.table-bordered>tfoot>tr>th,.footable.table-bordered>thead>tr>td,.footable.table-bordered>thead>tr>th{border:1px solid #ddd}.footable-details.table-bordered>thead>tr>td,.footable-details.table-bordered>thead>tr>th,.footable.table-bordered>thead>tr>td,.footable.table-bordered>thead>tr>th{border-bottom-width:2px}.footable-details.table-striped>tbody>tr:nth-child(odd),.footable.table-striped>tbody>tr:nth-child(odd){background-color:#f9f9f9}.footable-details.table-hover>tbody>tr:hover,.footable.table-hover>tbody>tr:hover{background-color:#f5f5f5}.footable .btn{padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px;overflow:visible;text-transform:none}.footable .btn.focus,.footable .btn:focus,.footable .btn:hover{color:#333;text-decoration:none}.footable .btn-default{color:#333;background-color:#fff;border-color:#ccc}.footable .btn-default.active,.footable .btn-default.focus,.footable .btn-default:active,.footable .btn-default:focus,.footable .btn-default:hover,.footable .open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.footable .btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.footable .btn-primary.active,.footable .btn-primary.focus,.footable .btn-primary:active,.footable .btn-primary:focus,.footable .btn-primary:hover,.footable .open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.footable .btn-group,.footable .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.footable .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.footable .btn-group>.btn:first-child{margin-left:0}.footable .btn-group-vertical>.btn,.footable .btn-group>.btn{position:relative;float:left}.footable .btn-group-xs>.btn,.footable .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.footable .btn-group-sm>.btn,.footable .btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.footable .btn-group-lg>.btn,.footable .btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.footable .caret{width:0;height:0;margin-left:2px;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.footable .btn .caret{margin-left:0}.form-group{margin-bottom:15px}.footable .form-control{display:block;width:100%;height:34px;padding:6px 12px;margin:0;font-family:inherit;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.footable .input-group{position:relative;display:table;border-collapse:separate}.footable .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.footable .input-group-btn{position:relative;font-size:0}.footable .input-group-addon,.footable .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.footable .input-group .form-control,.footable .input-group-addon,.footable .input-group-btn{display:table-cell}.footable .input-group-btn:last-child>.btn,.footable .input-group-btn:last-child>.btn-group,.footable .input-group-btn>.btn+.btn{margin-left:-1px}.footable .input-group-btn>.btn{position:relative}.footable .input-group-btn>.btn:active,.footable .input-group-btn>.btn:focus,.footable .input-group-btn>.btn:hover{z-index:2}.footable .input-group .form-control:first-child,.footable .input-group-addon:first-child,.footable .input-group-btn:first-child>.btn,.footable .input-group-btn:first-child>.btn-group>.btn,.footable .input-group-btn:first-child>.dropdown-toggle,.footable .input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.footable .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.footable .input-group .form-control:last-child,.footable .input-group-addon:last-child,.footable .input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.footable .input-group-btn:first-child>.btn:not(:first-child),.footable .input-group-btn:last-child>.btn,.footable .input-group-btn:last-child>.btn-group>.btn,.footable .input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.footable .checkbox,.footable .radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.footable .checkbox label,.footable .radio label{max-width:100%;min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.footable .checkbox input[type=checkbox],.footable .checkbox-inline input[type=checkbox],.footable .radio input[type=radio],.footable .radio-inline input[type=radio]{position:absolute;margin:4px 0 0 -20px;line-height:normal}.footable .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.footable .open>.dropdown-menu{display:block}.footable .dropdown-menu-right{right:0;left:auto}.footable .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.footable .dropdown-menu>li>a:focus,.footable .dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.footable .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.footable .pagination>li{display:inline}.footable .pagination>li:first-child>a,.footable .pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.footable .pagination>li>a,.footable .pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.footable .pagination>li>a:focus,.footable .pagination>li>a:hover,.footable .pagination>li>span:focus,.footable .pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.footable .pagination>.active>a,.footable .pagination>.active>a:focus,.footable .pagination>.active>a:hover,.footable .pagination>.active>span,.footable .pagination>.active>span:focus,.footable .pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.footable .pagination>.disabled>a,.footable .pagination>.disabled>a:focus,.footable .pagination>.disabled>a:hover,.footable .pagination>.disabled>span,.footable .pagination>.disabled>span:focus,.footable .pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.footable .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.footable .label-default{background-color:#777}.footable-loader.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.footable .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}table.footable-details,table.footable>thead>tr.footable-filtering>th div.form-group{margin-bottom:0}@media (min-width:768px){.footable .form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.footable .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.footable .form-inline .input-group{display:inline-table;vertical-align:middle}.footable .form-inline .input-group .form-control,.footable .form-inline .input-group .input-group-addon,.footable .form-inline .input-group .input-group-btn{width:auto}.footable .form-inline .input-group>.form-control{width:100%}}table.footable,table.footable-details{position:relative;width:100%;border-spacing:0;border-collapse:collapse}table.footable-hide-fouc{display:none}table>tbody>tr>td>span.footable-toggle{margin-right:8px;opacity:.3}table>tbody>tr>td>span.footable-toggle.last-column{margin-left:8px;float:right}table.table-condensed>tbody>tr>td>span.footable-toggle{margin-right:5px}table.footable-details>tbody>tr>th:nth-child(1){min-width:40px;width:120px}table.footable-details>tbody>tr>td:nth-child(2){word-break:break-all}table.footable-details>tbody>tr:first-child>td,table.footable-details>tbody>tr:first-child>th,table.footable-details>tfoot>tr:first-child>td,table.footable-details>tfoot>tr:first-child>th,table.footable-details>thead>tr:first-child>td,table.footable-details>thead>tr:first-child>th{border-top-width:0}table.footable-details.table-bordered>tbody>tr:first-child>td,table.footable-details.table-bordered>tbody>tr:first-child>th,table.footable-details.table-bordered>tfoot>tr:first-child>td,table.footable-details.table-bordered>tfoot>tr:first-child>th,table.footable-details.table-bordered>thead>tr:first-child>td,table.footable-details.table-bordered>thead>tr:first-child>th{border-top-width:1px}div.footable-loader{vertical-align:middle;text-align:center;height:300px;position:relative}div.footable-loader>span.fooicon{display:inline-block;opacity:.3;font-size:30px;line-height:32px;width:32px;height:32px;margin-top:-16px;margin-left:-16px;position:absolute;top:50%;left:50%;-webkit-animation:fooicon-spin-r 2s infinite linear;animation:fooicon-spin-r 2s infinite linear}table.footable>tbody>tr.footable-empty>td{vertical-align:middle;text-align:center;font-size:30px}table.footable>tbody>tr>td,table.footable>tbody>tr>th{display:none}table.footable>tbody>tr.footable-detail-row>td,table.footable>tbody>tr.footable-detail-row>th,table.footable>tbody>tr.footable-empty>td,table.footable>tbody>tr.footable-empty>th{display:table-cell}@-webkit-keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fooicon-spin-r{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fooicon{display:inline-block;font-size:inherit;font-family:FontAwesome!important;font-style:normal;font-weight:400;line-height:1;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0,0)}.fooicon:after,.fooicon:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fooicon-loader:before{content:"\f01e"}.fooicon-plus:before{content:"\f067"}.fooicon-minus:before{content:"\f068"}.fooicon-search:before{content:"\f002"}.fooicon-remove:before{content:"\f00d"}.fooicon-sort:before{content:"\f0dc"}.fooicon-sort-asc:before{content:"\f160"}.fooicon-sort-desc:before{content:"\f161"}.fooicon-pencil:before{content:"\f040"}.fooicon-trash:before{content:"\f1f8"}.fooicon-eye-close:before{content:"\f070"}.fooicon-flash:before{content:"\f0e7"}.fooicon-cog:before{content:"\f013"}.fooicon-stats:before{content:"\f080"}table.footable>thead>tr.footable-filtering>th{border-bottom-width:1px;font-weight:400}.footable-filtering-external.footable-filtering-right,table.footable.footable-filtering-right>thead>tr.footable-filtering>th,table.footable>thead>tr.footable-filtering>th{text-align:right}.footable-filtering-external.footable-filtering-left,table.footable.footable-filtering-left>thead>tr.footable-filtering>th{text-align:left}.footable-filtering-external.footable-filtering-center,.footable-paging-external.footable-paging-center,table.footable-paging-center>tfoot>tr.footable-paging>td,table.footable.footable-filtering-center>thead>tr.footable-filtering>th,table.footable>tfoot>tr.footable-paging>td{text-align:center}table.footable>thead>tr.footable-filtering>th div.form-group+div.form-group{margin-top:5px}table.footable>thead>tr.footable-filtering>th div.input-group{width:100%}.footable-filtering-external ul.dropdown-menu>li>a.checkbox,table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox{margin:0;display:block;position:relative}.footable-filtering-external ul.dropdown-menu>li>a.checkbox>label,table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox>label{display:block;padding-left:20px}.footable-filtering-external ul.dropdown-menu>li>a.checkbox input[type=checkbox],table.footable>thead>tr.footable-filtering>th ul.dropdown-menu>li>a.checkbox input[type=checkbox]{position:absolute;margin-left:-20px}@media (min-width:768px){table.footable>thead>tr.footable-filtering>th div.input-group{width:auto}table.footable>thead>tr.footable-filtering>th div.form-group{margin-left:2px;margin-right:2px}table.footable>thead>tr.footable-filtering>th div.form-group+div.form-group{margin-top:0}}table.footable>tbody>tr>td.footable-sortable,table.footable>tbody>tr>th.footable-sortable,table.footable>tfoot>tr>td.footable-sortable,table.footable>tfoot>tr>th.footable-sortable,table.footable>thead>tr>td.footable-sortable,table.footable>thead>tr>th.footable-sortable{position:relative;padding-right:30px;cursor:pointer}td.footable-sortable>span.fooicon,th.footable-sortable>span.fooicon{position:absolute;right:6px;top:50%;margin-top:-7px;opacity:0;transition:opacity .3s ease-in}td.footable-sortable.footable-asc>span.fooicon,td.footable-sortable.footable-desc>span.fooicon,td.footable-sortable:hover>span.fooicon,th.footable-sortable.footable-asc>span.fooicon,th.footable-sortable.footable-desc>span.fooicon,th.footable-sortable:hover>span.fooicon{opacity:1}table.footable-sorting-disabled td.footable-sortable.footable-asc>span.fooicon,table.footable-sorting-disabled td.footable-sortable.footable-desc>span.fooicon,table.footable-sorting-disabled td.footable-sortable:hover>span.fooicon,table.footable-sorting-disabled th.footable-sortable.footable-asc>span.fooicon,table.footable-sorting-disabled th.footable-sortable.footable-desc>span.fooicon,table.footable-sorting-disabled th.footable-sortable:hover>span.fooicon{opacity:0;visibility:hidden}.footable-paging-external ul.pagination,table.footable>tfoot>tr.footable-paging>td>ul.pagination{margin:10px 0 0}.footable-paging-external span.label,table.footable>tfoot>tr.footable-paging>td>span.label{display:inline-block;margin:0 0 10px;padding:4px 10px}.footable-paging-external.footable-paging-left,table.footable-paging-left>tfoot>tr.footable-paging>td{text-align:left}.footable-paging-external.footable-paging-right,table.footable-editing-right td.footable-editing,table.footable-editing-right tr.footable-editing,table.footable-paging-right>tfoot>tr.footable-paging>td{text-align:right}ul.pagination>li.footable-page{display:none}ul.pagination>li.footable-page.visible{display:inline}td.footable-editing{width:90px;max-width:90px}table.footable-editing-no-delete td.footable-editing,table.footable-editing-no-edit td.footable-editing,table.footable-editing-no-view td.footable-editing{width:70px;max-width:70px}table.footable-editing-no-delete.footable-editing-no-view td.footable-editing,table.footable-editing-no-edit.footable-editing-no-delete td.footable-editing,table.footable-editing-no-edit.footable-editing-no-view td.footable-editing{width:50px;max-width:50px}table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view td.footable-editing,table.footable-editing-no-edit.footable-editing-no-delete.footable-editing-no-view th.footable-editing{width:0;max-width:0;display:none!important}table.footable-editing-left td.footable-editing,table.footable-editing-left tr.footable-editing{text-align:left}table.footable-editing button.footable-add,table.footable-editing button.footable-hide,table.footable-editing-show button.footable-show,table.footable-editing.footable-editing-always-show button.footable-hide,table.footable-editing.footable-editing-always-show button.footable-show,table.footable-editing.footable-editing-always-show.footable-editing-no-add tr.footable-editing{display:none}table.footable-editing.footable-editing-always-show button.footable-add,table.footable-editing.footable-editing-show button.footable-add,table.footable-editing.footable-editing-show button.footable-hide{display:inline-block}
\ No newline at end of file
diff --git a/js/third-party/footable/footable-standalone.latest/js/footable.min.js b/js/third-party/footable/footable-standalone.latest/js/footable.min.js
new file mode 100644
index 0000000..b735140
--- /dev/null
+++ b/js/third-party/footable/footable-standalone.latest/js/footable.min.js
@@ -0,0 +1,10 @@
+/*
+* FooTable v3 - FooTable is a jQuery plugin that aims to make HTML tables on smaller devices look awesome.
+* @version 3.1.5
+* @link http://fooplugins.com
+* @copyright Steven Usher & Brad Vincent 2015
+* @license Released under the GPLv3 license.
+*/
+!function(a,b){window.console=window.console||{log:function(){},error:function(){}},a.fn.footable=function(a,c){return a=a||{},this.filter("table").each(function(d,e){b.init(e,a,c)})};var c={events:[]};b.__debug__=JSON.parse(localStorage.getItem("footable_debug"))||!1,b.__debug_options__=JSON.parse(localStorage.getItem("footable_debug_options"))||c,b.debug=function(d,e){return b.is["boolean"](d)?(b.__debug__=d,void(b.__debug__?(localStorage.setItem("footable_debug",JSON.stringify(b.__debug__)),b.__debug_options__=a.extend(!0,{},c,e||{}),b.is.hash(e)&&localStorage.setItem("footable_debug_options",JSON.stringify(b.__debug_options__))):(localStorage.removeItem("footable_debug"),localStorage.removeItem("footable_debug_options")))):b.__debug__},b.get=function(b){return a(b).first().data("__FooTable__")},b.init=function(a,c,d){var e=b.get(a);return e instanceof b.Table&&e.destroy(),new b.Table(a,c,d)},b.getRow=function(b){var c=a(b).closest("tr");return c.hasClass("footable-detail-row")&&(c=c.prev()),c.data("__FooTableRow__")}}(jQuery,FooTable=window.FooTable||{}),function(a){var b=function(){return!0};a.arr={},a.arr.each=function(b,c){if(a.is.array(b)&&a.is.fn(c))for(var d=0,e=b.length;e>d&&c(b[d],d)!==!1;d++);},a.arr.get=function(b,c){var d=[];if(!a.is.array(b))return d;if(!a.is.fn(c))return b;for(var e=0,f=b.length;f>e;e++)c(b[e],e)&&d.push(b[e]);return d},a.arr.any=function(c,d){if(!a.is.array(c))return!1;d=a.is.fn(d)?d:b;for(var e=0,f=c.length;f>e;e++)if(d(c[e],e))return!0;return!1},a.arr.contains=function(b,c){if(!a.is.array(b)||a.is.undef(c))return!1;for(var d=0,e=b.length;e>d;d++)if(b[d]==c)return!0;return!1},a.arr.first=function(c,d){if(!a.is.array(c))return null;d=a.is.fn(d)?d:b;for(var e=0,f=c.length;f>e;e++)if(d(c[e],e))return c[e];return null},a.arr.map=function(b,c){var d=[],e=null;if(!a.is.array(b)||!a.is.fn(c))return d;for(var f=0,g=b.length;g>f;f++)null!=(e=c(b[f],f))&&d.push(e);return d},a.arr.remove=function(b,c){var d=[],e=[];if(!a.is.array(b)||!a.is.fn(c))return e;for(var f=0,g=b.length;g>f;f++)c(b[f],f,e)&&(d.push(f),e.push(b[f]));for(d.sort(function(a,b){return b-a}),f=0,g=d.length;g>f;f++){var h=d[f]-f;b.splice(h,1)}return e},a.arr["delete"]=function(b,c){var d=-1,e=null;if(!a.is.array(b)||a.is.undef(c))return e;for(var f=0,g=b.length;g>f;f++)if(b[f]==c){d=f,e=b[f];break}return-1!=d&&b.splice(d,1),e},a.arr.replace=function(a,b,c){var d=a.indexOf(b);-1!==d&&(a[d]=c)}}(FooTable),function(a){a.is={},a.is.type=function(a,b){return typeof a===b},a.is.defined=function(a){return"undefined"!=typeof a},a.is.undef=function(a){return"undefined"==typeof a},a.is.array=function(a){return"[object Array]"===Object.prototype.toString.call(a)},a.is.date=function(a){return"[object Date]"===Object.prototype.toString.call(a)&&!isNaN(a.getTime())},a.is["boolean"]=function(a){return"[object Boolean]"===Object.prototype.toString.call(a)},a.is.string=function(a){return"[object String]"===Object.prototype.toString.call(a)},a.is.number=function(a){return"[object Number]"===Object.prototype.toString.call(a)&&!isNaN(a)},a.is.fn=function(b){return a.is.defined(window)&&b===window.alert||"[object Function]"===Object.prototype.toString.call(b)},a.is.error=function(a){return"[object Error]"===Object.prototype.toString.call(a)},a.is.object=function(a){return"[object Object]"===Object.prototype.toString.call(a)},a.is.hash=function(b){return a.is.object(b)&&b.constructor===Object&&!b.nodeType&&!b.setInterval},a.is.element=function(a){return"object"==typeof HTMLElement?a instanceof HTMLElement:a&&"object"==typeof a&&null!==a&&1===a.nodeType&&"string"==typeof a.nodeName},a.is.promise=function(b){return a.is.object(b)&&a.is.fn(b.then)&&a.is.fn(b.promise)},a.is.jq=function(b){return a.is.defined(window.jQuery)&&b instanceof jQuery&&b.length>0},a.is.moment=function(b){return a.is.defined(window.moment)&&a.is.object(b)&&a.is["boolean"](b._isAMomentObject)},a.is.emptyObject=function(b){if(!a.is.hash(b))return!1;for(var c in b)if(b.hasOwnProperty(c))return!1;return!0},a.is.emptyArray=function(b){return a.is.array(b)?0===b.length:!0},a.is.emptyString=function(b){return a.is.string(b)?0===b.length:!0}}(FooTable),function(a){a.str={},a.str.contains=function(b,c,d){return a.is.emptyString(b)||a.is.emptyString(c)?!1:c.length<=b.length&&-1!==(d?b.toUpperCase().indexOf(c.toUpperCase()):b.indexOf(c))},a.str.containsExact=function(b,c,d){return a.is.emptyString(b)||a.is.emptyString(c)||c.length>b.length?!1:new RegExp("\\b"+a.str.escapeRegExp(c)+"\\b",d?"i":"").test(b)},a.str.containsWord=function(b,c,d){if(a.is.emptyString(b)||a.is.emptyString(c)||b.length<c.length)return!1;for(var e=b.split(/\W/),f=0,g=e.length;g>f;f++)if(d?e[f].toUpperCase()==c.toUpperCase():e[f]==c)return!0;return!1},a.str.from=function(b,c){return a.is.emptyString(b)?b:a.str.contains(b,c)?b.substring(b.indexOf(c)+1):b},a.str.startsWith=function(b,c){return a.is.emptyString(b)?b==c:b.slice(0,c.length)==c},a.str.toCamelCase=function(b){return a.is.emptyString(b)?b:b.toUpperCase()===b?b.toLowerCase():b.replace(/^([A-Z])|[-\s_](\w)/g,function(b,c,d){return a.is.string(d)?d.toUpperCase():c.toLowerCase()})},a.str.random=function(b){return b=a.is.emptyString(b)?"":b,b+Math.random().toString(36).substr(2,9)},a.str.escapeRegExp=function(b){return a.is.emptyString(b)?b:b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}}(FooTable),function(a){"use strict";function b(){}Object.create||(Object.create=function(){var b=function(){};return function(c){if(arguments.length>1)throw Error("Second argument not supported");if(!a.is.object(c))throw TypeError("Argument must be an object");b.prototype=c;var d=new b;return b.prototype=null,d}}());var c=/xyz/.test(function(){xyz})?/\b_super\b/:/.*/;b.__extend__=function(b,d,e,f){b[d]=a.is.fn(f)&&c.test(e)?function(a,b){return function(){var a,c;return a=this._super,this._super=f,c=b.apply(this,arguments),this._super=a,c}}(d,e):e},b.extend=function(d,e){function f(b,d,e,f){b[d]=a.is.fn(f)&&c.test(e)?function(a,b,c){return function(){var a,d;return a=this._super,this._super=c,d=b.apply(this,arguments),this._super=a,d}}(d,e,f):e}var g=Array.prototype.slice.call(arguments);if(d=g.shift(),e=g.shift(),a.is.hash(d)){var h=Object.create(this.prototype),i=this.prototype;for(var j in d)"__ctor__"!==j&&f(h,j,d[j],i[j]);var k=a.is.fn(h.__ctor__)?h.__ctor__:function(){if(!a.is.fn(this.construct))throw new SyntaxError('FooTable class objects must be constructed with the "new" keyword.');this.construct.apply(this,arguments)};return h.construct=a.is.fn(h.construct)?h.construct:function(){},k.prototype=h,h.constructor=k,k.extend=b.extend,k}a.is.string(d)&&a.is.fn(e)&&f(this.prototype,d,e,this.prototype[d])},a.Class=b,a.ClassFactory=a.Class.extend({construct:function(){this.registered={}},contains:function(b){return a.is.defined(this.registered[b])},names:function(){var a,b=[];for(a in this.registered)this.registered.hasOwnProperty(a)&&b.push(a);return b},register:function(b,c,d){if(a.is.string(b)&&a.is.fn(c)){var e=this.registered[b];this.registered[b]={name:b,klass:c,priority:a.is.number(d)?d:a.is.defined(e)?e.priority:0}}},load:function(b,c,d){var e,f,g=this,h=Array.prototype.slice.call(arguments),i=[],j=[];b=h.shift()||{};for(e in g.registered)if(g.registered.hasOwnProperty(e)){var k=g.registered[e];b.hasOwnProperty(e)&&(f=b[e],a.is.string(f)&&(f=a.getFnPointer(b[e])),a.is.fn(f)&&(k={name:e,klass:f,priority:g.registered[e].priority})),i.push(k)}for(e in b)b.hasOwnProperty(e)&&!g.registered.hasOwnProperty(e)&&(f=b[e],a.is.string(f)&&(f=a.getFnPointer(b[e])),a.is.fn(f)&&i.push({name:e,klass:f,priority:0}));return i.sort(function(a,b){return b.priority-a.priority}),a.arr.each(i,function(b){a.is.fn(b.klass)&&j.push(g._make(b.klass,h))}),j},make:function(b,c,d){var e,f=this,g=Array.prototype.slice.call(arguments);return b=g.shift(),e=f.registered[b],a.is.fn(e.klass)?f._make(e.klass,g):null},_make:function(a,b){function c(){return a.apply(this,b)}return c.prototype=a.prototype,new c}})}(FooTable),function(a,b){b.css2json=function(c){if(b.is.emptyString(c))return{};for(var d,e,f,g={},h=c.split(";"),i=0,j=h.length;j>i;i++)b.is.emptyString(h[i])||(d=h[i].split(":"),b.is.emptyString(d[0])||b.is.emptyString(d[1])||(e=b.str.toCamelCase(a.trim(d[0])),f=a.trim(d[1]),g[e]=f));return g},b.getFnPointer=function(a){if(b.is.emptyString(a))return null;var c=window,d=a.split(".");return b.arr.each(d,function(a){c[a]&&(c=c[a])}),b.is.fn(c)?c:null},b.checkFnValue=function(a,c,d){function e(a,c,d){return b.is.fn(c)?function(){return c.apply(a,arguments)}:d}return d=b.is.fn(d)?d:null,b.is.fn(c)?e(a,c,d):b.is.type(c,"string")?e(a,b.getFnPointer(c),d):d}}(jQuery,FooTable),function(a,b){b.Cell=b.Class.extend({construct:function(a,b,c,d){this.ft=a,this.row=b,this.column=c,this.created=!1,this.define(d)},define:function(c){this.$el=b.is.element(c)||b.is.jq(c)?a(c):null,this.$detail=null;var d=b.is.hash(c)&&b.is.hash(c.options)&&b.is.defined(c.value);this.value=this.column.parser.call(this.column,b.is.jq(this.$el)?this.$el:d?c.value:c,this.ft.o),this.o=a.extend(!0,{classes:null,style:null},d?c.options:{}),this.classes=b.is.jq(this.$el)&&this.$el.attr("class")?this.$el.attr("class").match(/\S+/g):b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.jq(this.$el)&&this.$el.attr("style")?b.css2json(this.$el.attr("style")):b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{}},$create:function(){this.created||((this.$el=b.is.jq(this.$el)?this.$el:a("<td/>")).data("value",this.value).contents().detach().end().append(this.format(this.value)),this._setClasses(this.$el),this._setStyle(this.$el),this.$detail=a("<tr/>").addClass(this.row.classes.join(" ")).data("__FooTableCell__",this).append(a("<th/>")).append(a("<td/>")),this.created=!0)},collapse:function(){this.created&&(this.$detail.children("th").html(this.column.title),this.$el.clone().attr("id",this.$el.attr("id")?this.$el.attr("id")+"-detail":void 0).css("display","table-cell").html("").append(this.$el.contents().detach()).replaceAll(this.$detail.children("td").first()),b.is.jq(this.$detail.parent())||this.$detail.appendTo(this.row.$details.find(".footable-details > tbody")))},restore:function(){if(this.created){if(b.is.jq(this.$detail.parent())){var a=this.$detail.children("td").first();this.$el.attr("class",a.attr("class")).attr("style",a.attr("style")).css("display",this.column.hidden||!this.column.visible?"none":"table-cell").append(a.contents().detach())}this.$detail.detach()}},parse:function(){return this.column.parser.call(this.column,this.$el,this.ft.o)},format:function(a){return this.column.formatter.call(this.column,a,this.ft.o,this.row.value)},val:function(c,d,e){if(b.is.undef(c))return this.value;var f=this,g=b.is.hash(c)&&b.is.hash(c.options)&&b.is.defined(c.value);if(this.o=a.extend(!0,{classes:f.classes,style:f.style},g?c.options:{}),this.value=g?c.value:c,this.classes=b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{},e=b.is["boolean"](e)?e:!0,this.created&&e){this.$el.data("value",this.value).empty();var h=this.$detail.children("td").first().empty(),i=b.is.jq(this.$detail.parent())?h:this.$el;i.append(this.format(this.value)),this._setClasses(i),this._setStyle(i),(b.is["boolean"](d)?d:!0)&&this.row.draw()}},_setClasses:function(a){var c=!b.is.emptyArray(this.column.classes),d=!b.is.emptyArray(this.classes),e=null;a.removeAttr("class"),(c||d)&&(c&&d?e=this.classes.concat(this.column.classes).join(" "):c?e=this.column.classes.join(" "):d&&(e=this.classes.join(" ")),b.is.emptyString(e)||a.addClass(e))},_setStyle:function(c){var d=!b.is.emptyObject(this.column.style),e=!b.is.emptyObject(this.style),f=null;c.removeAttr("style"),(d||e)&&(d&&e?f=a.extend({},this.column.style,this.style):d?f=this.column.style:e&&(f=this.style),b.is.hash(f)&&c.css(f))}})}(jQuery,FooTable),function(a,b){b.Column=b.Class.extend({construct:function(a,c,d){this.ft=a,this.type=b.is.emptyString(d)?"text":d,this.virtual=b.is["boolean"](c.virtual)?c.virtual:!1,this.$el=b.is.jq(c.$el)?c.$el:null,this.index=b.is.number(c.index)?c.index:-1,this.internal=!1,this.define(c),this.$create()},define:function(a){this.hidden=b.is["boolean"](a.hidden)?a.hidden:!1,this.visible=b.is["boolean"](a.visible)?a.visible:!0,this.name=b.is.string(a.name)?a.name:null,null==this.name&&(this.name="col"+(a.index+1)),this.title=b.is.string(a.title)?a.title:null,!this.virtual&&null==this.title&&b.is.jq(this.$el)&&(this.title=this.$el.html()),null==this.title&&(this.title="Column "+(a.index+1)),this.style=b.is.hash(a.style)?a.style:b.is.string(a.style)?b.css2json(a.style):{},this.classes=b.is.array(a.classes)?a.classes:b.is.string(a.classes)?a.classes.match(/\S+/g):[],this.parser=b.checkFnValue(this,a.parser,this.parser),this.formatter=b.checkFnValue(this,a.formatter,this.formatter)},$create:function(){(this.$el=!this.virtual&&b.is.jq(this.$el)?this.$el:a("<th/>")).html(this.title).addClass(this.classes.join(" ")).css(this.style)},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("value");return b.is.defined(d)?d:a(c).html()}return b.is.defined(c)&&null!=c?c+"":null},formatter:function(a,b,c){return null==a?"":a},createCell:function(a){var c=b.is.jq(a.$el)?a.$el.children("td,th").get(this.index):null,d=b.is.hash(a.value)?a.value[this.name]:null;return new b.Cell(this.ft,a,this,c||d)}}),b.columns=new b.ClassFactory,b.columns.register("text",b.Column)}(jQuery,FooTable),function(a,b){b.Component=b.Class.extend({construct:function(a,c){if(!(a instanceof b.Table))throw new TypeError("The instance parameter must be an instance of FooTable.Table.");this.ft=a,this.enabled=b.is["boolean"](c)?c:!1},preinit:function(a){},init:function(){},destroy:function(){},predraw:function(){},draw:function(){},postdraw:function(){}}),b.components=new b.ClassFactory}(jQuery,FooTable),function(a,b){b.Defaults=function(){this.stopPropagation=!1,this.on=null},b.defaults=new b.Defaults}(jQuery,FooTable),function(a,b){b.Row=b.Class.extend({construct:function(a,b,c){this.ft=a,this.columns=b,this.created=!1,this.define(c)},define:function(c){this.$el=b.is.element(c)||b.is.jq(c)?a(c):null,this.$toggle=a("<span/>",{"class":"footable-toggle fooicon fooicon-plus"});var d=b.is.hash(c),e=d&&b.is.hash(c.options)&&b.is.hash(c.value);this.value=d?e?c.value:c:null,this.o=a.extend(!0,{expanded:!1,classes:null,style:null},e?c.options:{}),this.expanded=b.is.jq(this.$el)?this.$el.data("expanded")||this.o.expanded:this.o.expanded,this.classes=b.is.jq(this.$el)&&this.$el.attr("class")?this.$el.attr("class").match(/\S+/g):b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.jq(this.$el)&&this.$el.attr("style")?b.css2json(this.$el.attr("style")):b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{},this.cells=this.createCells();var f=this;f.value={},b.arr.each(f.cells,function(a){f.value[a.column.name]=a.val()})},$create:function(){if(!this.created){(this.$el=b.is.jq(this.$el)?this.$el:a("<tr/>")).data("__FooTableRow__",this),this._setClasses(this.$el),this._setStyle(this.$el),"last"==this.ft.rows.toggleColumn&&this.$toggle.addClass("last-column"),this.$details=a("<tr/>",{"class":"footable-detail-row"}).append(a("<td/>",{colspan:this.ft.columns.visibleColspan}).append(a("<table/>",{"class":"footable-details "+this.ft.classes.join(" ")}).append("<tbody/>")));var c=this;b.arr.each(c.cells,function(a){a.created||a.$create(),c.$el.append(a.$el)}),c.$el.off("click.ft.row").on("click.ft.row",{self:c},c._onToggle),this.created=!0}},createCells:function(){var a=this;return b.arr.map(a.columns,function(b){return b.createCell(a)})},val:function(c,d,e){var f=this;if(!b.is.hash(c))return b.is.hash(this.value)&&!b.is.emptyObject(this.value)||(this.value={},b.arr.each(this.cells,function(a){a.column.internal||(f.value[a.column.name]=a.val())})),this.value;this.collapse(!1);var g=b.is.hash(c),h=g&&b.is.hash(c.options)&&b.is.hash(c.value);if(this.o=a.extend(!0,{expanded:f.expanded,classes:f.classes,style:f.style},h?c.options:{}),this.expanded=this.o.expanded,this.classes=b.is.array(this.o.classes)?this.o.classes:b.is.string(this.o.classes)?this.o.classes.match(/\S+/g):[],this.style=b.is.hash(this.o.style)?this.o.style:b.is.string(this.o.style)?b.css2json(this.o.style):{},g)if(h&&(c=c.value),b.is.hash(this.value))for(var i in c)c.hasOwnProperty(i)&&(this.value[i]=c[i]);else this.value=c;else this.value=null;e=b.is["boolean"](e)?e:!0,b.arr.each(this.cells,function(a){!a.column.internal&&b.is.defined(f.value[a.column.name])&&a.val(f.value[a.column.name],!1,e)}),this.created&&e&&(this._setClasses(this.$el),this._setStyle(this.$el),(b.is["boolean"](d)?d:!0)&&this.draw())},_setClasses:function(a){var c=!b.is.emptyArray(this.classes),d=null;a.removeAttr("class"),c&&(d=this.classes.join(" "),b.is.emptyString(d)||a.addClass(d))},_setStyle:function(a){var c=!b.is.emptyObject(this.style),d=null;a.removeAttr("style"),c&&(d=this.style,b.is.hash(d)&&a.css(d))},expand:function(){if(this.created){var a=this;a.ft.raise("expand.ft.row",[a]).then(function(){a.__hidden__=b.arr.map(a.cells,function(a){return a.column.hidden&&a.column.visible?a:null}),a.__hidden__.length>0&&(a.$details.insertAfter(a.$el).children("td").first().attr("colspan",a.ft.columns.visibleColspan),b.arr.each(a.__hidden__,function(a){a.collapse()})),a.$el.attr("data-expanded",!0),a.$toggle.removeClass("fooicon-plus").addClass("fooicon-minus"),a.expanded=!0,a.ft.raise("expanded.ft.row",[a])})}},collapse:function(a){if(this.created){var c=this;c.ft.raise("collapse.ft.row",[c]).then(function(){b.arr.each(c.__hidden__,function(a){a.restore()}),c.$details.detach(),c.$el.removeAttr("data-expanded"),c.$toggle.removeClass("fooicon-minus").addClass("fooicon-plus"),(b.is["boolean"](a)?a:!0)&&(c.expanded=!1),c.ft.raise("collapsed.ft.row",[c])})}},predraw:function(a){this.created&&(this.expanded&&this.collapse(!1),this.$toggle.detach(),a=b.is["boolean"](a)?a:!0,a&&this.$el.detach())},draw:function(a){this.created||this.$create(),b.is.jq(a)&&a.append(this.$el);var c=this;b.arr.each(c.cells,function(a){a.$el.css("display",a.column.hidden||!a.column.visible?"none":"table-cell"),c.ft.rows.showToggle&&c.ft.columns.hasHidden&&("first"==c.ft.rows.toggleColumn&&a.column.index==c.ft.columns.firstVisibleIndex||"last"==c.ft.rows.toggleColumn&&a.column.index==c.ft.columns.lastVisibleIndex)&&a.$el.prepend(c.$toggle),a.$el.add(a.column.$el).removeClass("footable-first-visible footable-last-visible"),a.column.index==c.ft.columns.firstVisibleIndex&&a.$el.add(a.column.$el).addClass("footable-first-visible"),a.column.index==c.ft.columns.lastVisibleIndex&&a.$el.add(a.column.$el).addClass("footable-last-visible")}),this.expanded&&this.expand()},toggle:function(){this.created&&this.ft.columns.hasHidden&&(this.expanded?this.collapse():this.expand())},_onToggle:function(b){var c=b.data.self;a(b.target).is(c.ft.rows.toggleSelector)&&c.toggle()}})}(jQuery,FooTable),function(a,b){b.instances=[],b.Table=b.Class.extend({construct:function(c,d,e){this._resizeTimeout=null,this.id=b.instances.push(this),this.initialized=!1,this.$el=(b.is.jq(c)?c:a(c)).first(),this.$loader=a("<div/>",{"class":"footable-loader"}).append(a("<span/>",{"class":"fooicon fooicon-loader"})),this.o=a.extend(!0,{},b.defaults,d),this.data=this.$el.data()||{},this.classes=[],this.components=b.components.load(b.is.hash(this.data.components)?this.data.components:this.o.components,this),this.breakpoints=this.use(FooTable.Breakpoints),this.columns=this.use(FooTable.Columns),this.rows=this.use(FooTable.Rows),this._construct(e)},_construct:function(a){var c=this;return this._preinit().then(function(){return c._init().then(function(){return c.raise("ready.ft.table").then(function(){b.is.fn(a)&&a.call(c,c)})})}).always(function(a){c.$el.show(),b.is.error(a)&&console.error("FooTable: unhandled error thrown during initialization.",a)})},_preinit:function(){var a=this;return this.raise("preinit.ft.table",[a.data]).then(function(){var c=(a.$el.attr("class")||"").match(/\S+/g)||[];a.o.ajax=b.checkFnValue(a,a.data.ajax,a.o.ajax),a.o.stopPropagation=b.is["boolean"](a.data.stopPropagation)?a.data.stopPropagation:a.o.stopPropagation;for(var d=0,e=c.length;e>d;d++)b.str.startsWith(c[d],"footable")||a.classes.push(c[d]);return a.$el.hide().after(a.$loader),a.execute(!1,!1,"preinit",a.data)})},_init:function(){var c=this;return c.raise("init.ft.table").then(function(){var d=c.$el.children("thead"),e=c.$el.children("tbody"),f=c.$el.children("tfoot");return c.$el.addClass("footable footable-"+c.id),b.is.hash(c.o.on)&&c.$el.on(c.o.on),0==f.length&&c.$el.append(f=a("<tfoot/>")),0==e.length&&c.$el.append("<tbody/>"),0==d.length&&c.$el.prepend(d=a("<thead/>")),c.execute(!1,!0,"init").then(function(){return c.$el.data("__FooTable__",c),0==f.children("tr").length&&f.remove(),0==d.children("tr").length&&d.remove(),c.raise("postinit.ft.table").then(function(){return c.draw()}).always(function(){a(window).off("resize.ft"+c.id,c._onWindowResize).on("resize.ft"+c.id,{self:c},c._onWindowResize),c.initialized=!0})})})},destroy:function(){var c=this;return c.raise("destroy.ft.table").then(function(){return c.execute(!0,!0,"destroy").then(function(){c.$el.removeData("__FooTable__").removeClass("footable-"+c.id),b.is.hash(c.o.on)&&c.$el.off(c.o.on),a(window).off("resize.ft"+c.id,c._onWindowResize),c.initialized=!1,b.instances[c.id]=null})}).fail(function(a){b.is.error(a)&&console.error("FooTable: unhandled error thrown while destroying the plugin.",a)})},raise:function(c,d){var e=this,f=b.__debug__&&(b.is.emptyArray(b.__debug_options__.events)||b.arr.any(b.__debug_options__.events,function(a){return b.str.contains(c,a)}));return d=d||[],d.unshift(this),a.Deferred(function(b){var g=a.Event(c);1==e.o.stopPropagation&&e.$el.one(c,function(a){a.stopPropagation()}),f&&console.log("FooTable:"+c+": ",d),e.$el.trigger(g,d),g.isDefaultPrevented()?(f&&console.log('FooTable: default prevented for the "'+c+'" event.'),b.reject(g)):b.resolve(g)})},use:function(a){for(var b=0,c=this.components.length;c>b;b++)if(this.components[b]instanceof a)return this.components[b];return null},draw:function(){var a=this,c=a.$el.clone().insertBefore(a.$el);return a.$el.detach(),a.execute(!1,!0,"predraw").then(function(){return a.raise("predraw.ft.table").then(function(){return a.execute(!1,!0,"draw").then(function(){return a.raise("draw.ft.table").then(function(){return a.execute(!1,!0,"postdraw").then(function(){return a.raise("postdraw.ft.table")})})})})}).fail(function(a){b.is.error(a)&&console.error("FooTable: unhandled error thrown during a draw operation.",a)}).always(function(){c.replaceWith(a.$el),a.$loader.remove()})},execute:function(a,c,d,e,f){var g=this,h=Array.prototype.slice.call(arguments);a=h.shift(),c=h.shift();var i=c?b.arr.get(g.components,function(a){return a.enabled}):g.components.slice(0);return h.unshift(a?i.reverse():i),g._execute.apply(g,h)},_execute:function(c,d,e,f){if(!c||!c.length)return a.when();var g,h=this,i=Array.prototype.slice.call(arguments);return c=i.shift(),d=i.shift(),g=c.shift(),b.is.fn(g[d])?a.Deferred(function(a){try{var c=g[d].apply(g,i);if(b.is.promise(c))return c.then(a.resolve,a.reject);a.resolve(c)}catch(e){a.reject(e)}}).then(function(){return h._execute.apply(h,[c,d].concat(i))}):h._execute.apply(h,[c,d].concat(i))},_onWindowResize:function(a){var b=a.data.self;null!=b._resizeTimeout&&clearTimeout(b._resizeTimeout),b._resizeTimeout=setTimeout(function(){b._resizeTimeout=null,b.raise("resize.ft.table").then(function(){b.breakpoints.check()})},300)}})}(jQuery,FooTable),function(a,b){b.ArrayColumn=b.Column.extend({construct:function(a,b){this._super(a,b,"array")},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c),e=d.data("value");if(b.is.array(e))return e;e=d.html();try{e=JSON.parse(e)}catch(f){e=null}return b.is.array(e)?e:null}return b.is.array(c)?c:null},formatter:function(a,c,d){return b.is.array(a)?JSON.stringify(a):""}}),b.columns.register("array",b.ArrayColumn)}(jQuery,FooTable),function(a,b){b.is.undef(window.moment)||(b.DateColumn=b.Column.extend({construct:function(a,c){this._super(a,c,"date"),this.formatString=b.is.string(c.formatString)?c.formatString:"MM-DD-YYYY"},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("value");c=b.is.defined(d)?d:a(c).text(),b.is.string(c)&&(c=isNaN(c)?c:+c)}if(b.is.date(c))return moment(c);if(b.is.object(c)&&b.is["boolean"](c._isAMomentObject))return c;if(b.is.string(c)){if(isNaN(c))return moment(c,this.formatString);c=+c}return b.is.number(c)?moment(c):null},formatter:function(a,c,d){return b.is.object(a)&&b.is["boolean"](a._isAMomentObject)&&a.isValid()?a.format(this.formatString):""},filterValue:function(c){if((b.is.element(c)||b.is.jq(c))&&(c=a(c).data("filterValue")||a(c).text()),b.is.hash(c)&&b.is.hash(c.options)&&(b.is.string(c.options.filterValue)&&(c=c.options.filterValue),b.is.defined(c.value)&&(c=c.value)),b.is.object(c)&&b.is["boolean"](c._isAMomentObject))return c.format(this.formatString);if(b.is.string(c)){if(isNaN(c))return c;c=+c}return b.is.number(c)||b.is.date(c)?moment(c).format(this.formatString):b.is.defined(c)&&null!=c?c+"":""}}),b.columns.register("date",b.DateColumn))}(jQuery,FooTable),function(a,b){b.HTMLColumn=b.Column.extend({construct:function(a,b){this._super(a,b,"html")},parser:function(c){if(b.is.string(c)&&(c=a(a.trim(c))),b.is.element(c)&&(c=a(c)),b.is.jq(c)){var d=c.prop("tagName").toLowerCase();if("td"==d||"th"==d){var e=c.data("value");return b.is.defined(e)?e:c.contents()}return c}return null}}),b.columns.register("html",b.HTMLColumn)}(jQuery,FooTable),function(a,b){b.NumberColumn=b.Column.extend({construct:function(a,c){this._super(a,c,"number"),this.decimalSeparator=b.is.string(c.decimalSeparator)?c.decimalSeparator:".",this.thousandSeparator=b.is.string(c.thousandSeparator)?c.thousandSeparator:",",this.decimalSeparatorRegex=new RegExp(b.str.escapeRegExp(this.decimalSeparator),"g"),this.thousandSeparatorRegex=new RegExp(b.str.escapeRegExp(this.thousandSeparator),"g"),this.cleanRegex=new RegExp("[^-0-9"+b.str.escapeRegExp(this.decimalSeparator)+"]","g")},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("value");c=b.is.defined(d)?d:a(c).text().replace(this.cleanRegex,"")}return b.is.string(c)&&(c=c.replace(this.thousandSeparatorRegex,"").replace(this.decimalSeparatorRegex,"."),c=parseFloat(c)),b.is.number(c)?c:null},formatter:function(a,b,c){if(null==a)return"";var d=(a+"").split(".");return 2==d.length&&d[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,this.thousandSeparator)),d.join(this.decimalSeparator)}}),b.columns.register("number",b.NumberColumn)}(jQuery,FooTable),function(a,b){b.ObjectColumn=b.Column.extend({construct:function(a,b){this._super(a,b,"object")},parser:function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c),e=d.data("value");if(b.is.object(e))return e;e=d.html();try{e=JSON.parse(e)}catch(f){e=null}return b.is.object(e)?e:null}return b.is.object(c)?c:null},formatter:function(a,c,d){return b.is.object(a)?JSON.stringify(a):""}}),b.columns.register("object",b.ObjectColumn)}(jQuery,FooTable),function(a,b){b.Breakpoint=b.Class.extend({construct:function(a,b){this.name=a,this.width=b}})}(jQuery,FooTable),function(a,b){b.Breakpoints=b.Component.extend({construct:function(a){this._super(a,!0),this.o=a.o,this.current=null,this.array=[],this.cascade=this.o.cascade,this.useParentWidth=this.o.useParentWidth,this.hidden=null,this._classNames="",this.getWidth=b.checkFnValue(this,this.o.getWidth,this.getWidth)},preinit:function(a){var c=this;return this.ft.raise("preinit.ft.breakpoints",[a]).then(function(){c.cascade=b.is["boolean"](a.cascade)?a.cascade:c.cascade,c.o.breakpoints=b.is.hash(a.breakpoints)?a.breakpoints:c.o.breakpoints,c.getWidth=b.checkFnValue(c,a.getWidth,c.getWidth),null==c.o.breakpoints&&(c.o.breakpoints={xs:480,sm:768,md:992,lg:1200});for(var d in c.o.breakpoints)c.o.breakpoints.hasOwnProperty(d)&&(c.array.push(new b.Breakpoint(d,c.o.breakpoints[d])),c._classNames+="breakpoint-"+d+" ");c.array.sort(function(a,b){return b.width-a.width})})},init:function(){var a=this;return this.ft.raise("init.ft.breakpoints").then(function(){a.current=a.get()})},draw:function(){this.ft.$el.removeClass(this._classNames).addClass("breakpoint-"+this.current.name)},calculate:function(){for(var a,c=this,d=null,e=[],f=null,g=c.getWidth(),h=0,i=c.array.length;i>h;h++)a=c.array[h],(!d&&h==i-1||g>=a.width&&(f instanceof b.Breakpoint?g<f.width:!0))&&(d=a),d||e.push(a.name),f=a;return e.push(d.name),c.hidden=e.join(" "),d},visible:function(a){if(b.is.emptyString(a))return!0;if("all"===a)return!1;for(var c=a.split(" "),d=0,e=c.length;e>d;d++)if(this.cascade?b.str.containsWord(this.hidden,c[d]):c[d]==this.current.name)return!1;return!0},check:function(){var a=this,c=a.get();c instanceof b.Breakpoint&&c!=a.current&&a.ft.raise("before.ft.breakpoints",[a.current,c]).then(function(){var b=a.current;return a.current=c,a.ft.draw().then(function(){a.ft.raise("after.ft.breakpoints",[a.current,b])})})},get:function(a){return b.is.undef(a)?this.calculate():a instanceof b.Breakpoint?a:b.is.string(a)?b.arr.first(this.array,function(b){return b.name==a}):b.is.number(a)&&a>=0&&a<this.array.length?this.array[a]:null},getWidth:function(){return b.is.fn(this.o.getWidth)?this.o.getWidth(this.ft):1==this.useParentWidth?this.getParentWidth():this.getViewportWidth()},getParentWidth:function(){return this.ft.$el.parent().width()},getViewportWidth:function(){return Math.max(document.documentElement.clientWidth,window.innerWidth,0)}}),b.components.register("breakpoints",b.Breakpoints,1e3)}(jQuery,FooTable),function(a){a.Column.prototype.breakpoints=null,a.Column.prototype.__breakpoints_define__=function(b){this.breakpoints=a.is.emptyString(b.breakpoints)?null:b.breakpoints},a.Column.extend("define",function(a){this._super(a),this.__breakpoints_define__(a)})}(FooTable),function(a){a.Defaults.prototype.breakpoints=null,a.Defaults.prototype.cascade=!1,a.Defaults.prototype.useParentWidth=!1,a.Defaults.prototype.getWidth=null}(FooTable),function(a,b){b.Columns=b.Component.extend({construct:function(a){this._super(a,!0),this.o=a.o,this.array=[],this.$header=null,this.showHeader=a.o.showHeader,this._fromHTML=b.is.emptyArray(a.o.columns)&&!b.is.promise(a.o.columns)},parse:function(c){var d=this;return a.Deferred(function(c){function e(c,d){var e=[];if(0==c.length||0==d.length)e=c.concat(d);else{var f=0;b.arr.each(c.concat(d),function(a){a.index>f&&(f=a.index)}),f++;for(var g,h,i=0;f>i;i++)g={},b.arr.each(c,function(a){return a.index==i?(g=a,!1):void 0}),h={},b.arr.each(d,function(a){return a.index==i?(h=a,!1):void 0}),e.push(a.extend(!0,{},g,h))}return e}var f,g,h=[],i=[],j=d.ft.$el.find("tr.footable-header, thead > tr:last:has([data-breakpoints]), tbody > tr:first:has([data-breakpoints]), thead > tr:last, tbody > tr:first").first();if(j.length>0){var k=j.parent().is("tbody")&&j.children().length==j.children("td").length;k||(d.$header=j.addClass("footable-header")),j.children("td,th").each(function(b,c){f=a(c),g=f.data(),g.index=b,g.$el=f,g.virtual=k,i.push(g)}),k&&(d.showHeader=!1)}b.is.array(d.o.columns)&&!b.is.emptyArray(d.o.columns)?(b.arr.each(d.o.columns,function(a,b){a.index=b,h.push(a)}),d.parseFinalize(c,e(h,i))):b.is.promise(d.o.columns)?d.o.columns.then(function(a){b.arr.each(a,function(a,b){a.index=b,h.push(a)}),d.parseFinalize(c,e(h,i))},function(a){c.reject(Error("Columns ajax request error: "+a.status+" ("+a.statusText+")"))}):d.parseFinalize(c,e(h,i))})},parseFinalize:function(a,c){var d,e=this,f=[];b.arr.each(c,function(a){(d=b.columns.contains(a.type)?b.columns.make(a.type,e.ft,a):new b.Column(e.ft,a))&&f.push(d)}),b.is.emptyArray(f)?a.reject(Error("No columns supplied.")):(f.sort(function(a,b){
+return a.index-b.index}),a.resolve(f))},preinit:function(a){var c=this;return c.ft.raise("preinit.ft.columns",[a]).then(function(){return c.parse(a).then(function(d){c.array=d,c.showHeader=b.is["boolean"](a.showHeader)?a.showHeader:c.showHeader})})},init:function(){var a=this;return this.ft.raise("init.ft.columns",[a.array]).then(function(){a.$create()})},destroy:function(){var a=this;this.ft.raise("destroy.ft.columns").then(function(){a._fromHTML||a.$header.remove()})},predraw:function(){var a=this,c=!0;a.visibleColspan=0,a.firstVisibleIndex=0,a.lastVisibleIndex=0,a.hasHidden=!1,b.arr.each(a.array,function(b){b.hidden=!a.ft.breakpoints.visible(b.breakpoints),!b.hidden&&b.visible&&(c&&(a.firstVisibleIndex=b.index,c=!1),a.lastVisibleIndex=b.index,a.visibleColspan++),b.hidden&&(a.hasHidden=!0)}),a.ft.$el.toggleClass("breakpoint",a.hasHidden)},draw:function(){b.arr.each(this.array,function(a){a.$el.css("display",a.hidden||!a.visible?"none":"table-cell")}),!this.showHeader&&b.is.jq(this.$header.parent())&&this.$header.detach()},$create:function(){var c=this;c.$header=b.is.jq(c.$header)?c.$header:a("<tr/>",{"class":"footable-header"}),c.$header.children("th,td").detach(),b.arr.each(c.array,function(a){c.$header.append(a.$el)}),c.showHeader&&!b.is.jq(c.$header.parent())&&c.ft.$el.children("thead").append(c.$header)},get:function(a){return a instanceof b.Column?a:b.is.string(a)?b.arr.first(this.array,function(b){return b.name==a}):b.is.number(a)?b.arr.first(this.array,function(b){return b.index==a}):b.is.fn(a)?b.arr.get(this.array,a):null},ensure:function(a){var c=this,d=[];return b.is.array(a)?(b.arr.each(a,function(a){d.push(c.get(a))}),d):d}}),b.components.register("columns",b.Columns,900)}(jQuery,FooTable),function(a){a.Defaults.prototype.columns=[],a.Defaults.prototype.showHeader=!0}(FooTable),function(a,b){b.Rows=b.Component.extend({construct:function(a){this._super(a,!0),this.o=a.o,this.array=[],this.all=[],this.showToggle=a.o.showToggle,this.toggleSelector=a.o.toggleSelector,this.toggleColumn=a.o.toggleColumn,this.emptyString=a.o.empty,this.expandFirst=a.o.expandFirst,this.expandAll=a.o.expandAll,this.$empty=null,this._fromHTML=b.is.emptyArray(a.o.rows)&&!b.is.promise(a.o.rows)},parse:function(){var c=this;return a.Deferred(function(a){var d=c.ft.$el.children("tbody").children("tr");b.is.array(c.o.rows)&&c.o.rows.length>0?c.parseFinalize(a,c.o.rows):b.is.promise(c.o.rows)?c.o.rows.then(function(b){c.parseFinalize(a,b)},function(b){a.reject(Error("Rows ajax request error: "+b.status+" ("+b.statusText+")"))}):b.is.jq(d)?(c.parseFinalize(a,d),d.detach()):c.parseFinalize(a,[])})},parseFinalize:function(c,d){var e=this,f=a.map(d,function(a){return new b.Row(e.ft,e.ft.columns.array,a)});c.resolve(f)},preinit:function(a){var c=this;return c.ft.raise("preinit.ft.rows",[a]).then(function(){return c.parse().then(function(d){c.all=d,c.array=c.all.slice(0),c.showToggle=b.is["boolean"](a.showToggle)?a.showToggle:c.showToggle,c.toggleSelector=b.is.string(a.toggleSelector)?a.toggleSelector:c.toggleSelector,c.toggleColumn=b.is.string(a.toggleColumn)?a.toggleColumn:c.toggleColumn,"first"!=c.toggleColumn&&"last"!=c.toggleColumn&&(c.toggleColumn="first"),c.emptyString=b.is.string(a.empty)?a.empty:c.emptyString,c.expandFirst=b.is["boolean"](a.expandFirst)?a.expandFirst:c.expandFirst,c.expandAll=b.is["boolean"](a.expandAll)?a.expandAll:c.expandAll})})},init:function(){var a=this;return a.ft.raise("init.ft.rows",[a.all]).then(function(){a.$create()})},destroy:function(){var a=this;this.ft.raise("destroy.ft.rows").then(function(){b.arr.each(a.array,function(b){b.predraw(!a._fromHTML)}),a.all=a.array=[]})},predraw:function(){b.arr.each(this.array,function(a){a.predraw()}),this.array=this.all.slice(0)},$create:function(){this.$empty=a("<tr/>",{"class":"footable-empty"}).append(a("<td/>").text(this.emptyString))},draw:function(){var a=this,c=a.ft.$el.children("tbody"),d=!0;a.array.length>0?(a.$empty.detach(),b.arr.each(a.array,function(b){(a.expandFirst&&d||a.expandAll)&&(b.expanded=!0,d=!1),b.draw(c)})):(a.$empty.children("td").attr("colspan",a.ft.columns.visibleColspan),c.append(a.$empty))},load:function(c,d){var e=this,f=a.map(c,function(a){return new b.Row(e.ft,e.ft.columns.array,a)});b.arr.each(this.array,function(a){a.predraw()}),this.all=(b.is["boolean"](d)?d:!1)?this.all.concat(f):f,this.array=this.all.slice(0),this.ft.draw()},expand:function(){b.arr.each(this.array,function(a){a.expand()})},collapse:function(){b.arr.each(this.array,function(a){a.collapse()})}}),b.components.register("rows",b.Rows,800)}(jQuery,FooTable),function(a){a.Defaults.prototype.rows=[],a.Defaults.prototype.empty="No results",a.Defaults.prototype.showToggle=!0,a.Defaults.prototype.toggleSelector="tr,td,.footable-toggle",a.Defaults.prototype.toggleColumn="first",a.Defaults.prototype.expandFirst=!1,a.Defaults.prototype.expandAll=!1}(FooTable),function(a){a.Table.prototype.loadRows=function(a,b){this.rows.load(a,b)}}(FooTable),function(a){a.Filter=a.Class.extend({construct:function(b,c,d,e,f,g,h){this.name=b,this.space=!a.is.string(e)||"OR"!=e&&"AND"!=e?"AND":e,this.connectors=a.is["boolean"](f)?f:!0,this.ignoreCase=a.is["boolean"](g)?g:!0,this.hidden=a.is["boolean"](h)?h:!1,this.query=c instanceof a.Query?c:new a.Query(c,this.space,this.connectors,this.ignoreCase),this.columns=d},match:function(b){return a.is.string(b)?(a.is.string(this.query)&&(this.query=new a.Query(this.query,this.space,this.connectors,this.ignoreCase)),this.query instanceof a.Query?this.query.match(b):!1):!1},matchRow:function(b){var c=this,d=a.arr.map(b.cells,function(b){return a.arr.contains(c.columns,b.column)?b.filterValue:null}).join(" ");return c.match(d)}})}(FooTable),function(a,b){b.Filtering=b.Component.extend({construct:function(a){this._super(a,a.o.filtering.enabled),this.filters=a.o.filtering.filters,this.delay=a.o.filtering.delay,this.min=a.o.filtering.min,this.space=a.o.filtering.space,this.connectors=a.o.filtering.connectors,this.ignoreCase=a.o.filtering.ignoreCase,this.exactMatch=a.o.filtering.exactMatch,this.placeholder=a.o.filtering.placeholder,this.dropdownTitle=a.o.filtering.dropdownTitle,this.position=a.o.filtering.position,this.focus=a.o.filtering.focus,this.container=a.o.filtering.container,this.$container=null,this.$row=null,this.$cell=null,this.$form=null,this.$dropdown=null,this.$input=null,this.$button=null,this._filterTimeout=null,this._exactRegExp=/^"(.*?)"$/},preinit:function(a){var c=this;return c.ft.raise("preinit.ft.filtering").then(function(){c.ft.$el.hasClass("footable-filtering")&&(c.enabled=!0),c.enabled=b.is["boolean"](a.filtering)?a.filtering:c.enabled,c.enabled&&(c.space=b.is.string(a.filterSpace)?a.filterSpace:c.space,c.min=b.is.number(a.filterMin)?a.filterMin:c.min,c.connectors=b.is["boolean"](a.filterConnectors)?a.filterConnectors:c.connectors,c.ignoreCase=b.is["boolean"](a.filterIgnoreCase)?a.filterIgnoreCase:c.ignoreCase,c.exactMatch=b.is["boolean"](a.filterExactMatch)?a.filterExactMatch:c.exactMatch,c.focus=b.is["boolean"](a.filterFocus)?a.filterFocus:c.focus,c.delay=b.is.number(a.filterDelay)?a.filterDelay:c.delay,c.placeholder=b.is.string(a.filterPlaceholder)?a.filterPlaceholder:c.placeholder,c.dropdownTitle=b.is.string(a.filterDropdownTitle)?a.filterDropdownTitle:c.dropdownTitle,c.container=b.is.string(a.filterContainer)?a.filterContainer:c.container,c.filters=b.is.array(a.filterFilters)?c.ensure(a.filterFilters):c.ensure(c.filters),c.ft.$el.hasClass("footable-filtering-left")&&(c.position="left"),c.ft.$el.hasClass("footable-filtering-center")&&(c.position="center"),c.ft.$el.hasClass("footable-filtering-right")&&(c.position="right"),c.position=b.is.string(a.filterPosition)?a.filterPosition:c.position)},function(){c.enabled=!1})},init:function(){var a=this;return a.ft.raise("init.ft.filtering").then(function(){a.$create()},function(){a.enabled=!1})},destroy:function(){var a=this;return a.ft.raise("destroy.ft.filtering").then(function(){a.ft.$el.removeClass("footable-filtering").find("thead > tr.footable-filtering").remove()})},$create:function(){var c,d=this,e=a("<div/>",{"class":"form-group footable-filtering-search"}).append(a("<label/>",{"class":"sr-only",text:"Search"})),f=a("<div/>",{"class":"input-group"}).appendTo(e),g=a("<div/>",{"class":"input-group-btn"}),h=a("<button/>",{type:"button","class":"btn btn-default dropdown-toggle"}).on("click",{self:d},d._onDropdownToggleClicked).append(a("<span/>",{"class":"caret"}));switch(d.position){case"left":c="footable-filtering-left";break;case"center":c="footable-filtering-center";break;default:c="footable-filtering-right"}d.ft.$el.addClass("footable-filtering").addClass(c),d.$container=null===d.container?a():a(d.container).first(),d.$container.length?d.$container.addClass("footable-filtering-external").addClass(c):(d.$row=a("<tr/>",{"class":"footable-filtering"}).prependTo(d.ft.$el.children("thead")),d.$cell=a("<th/>").attr("colspan",d.ft.columns.visibleColspan).appendTo(d.$row),d.$container=d.$cell),d.$form=a("<form/>",{"class":"form-inline"}).append(e).appendTo(d.$container),d.$input=a("<input/>",{type:"text","class":"form-control",placeholder:d.placeholder}),d.$button=a("<button/>",{type:"button","class":"btn btn-primary"}).on("click",{self:d},d._onSearchButtonClicked).append(a("<span/>",{"class":"fooicon fooicon-search"})),d.$dropdown=a("<ul/>",{"class":"dropdown-menu dropdown-menu-right"}),b.is.emptyString(d.dropdownTitle)||d.$dropdown.append(a("<li/>",{"class":"dropdown-header",text:d.dropdownTitle})),d.$dropdown.append(b.arr.map(d.ft.columns.array,function(b){return b.filterable?a("<li/>").append(a("<a/>",{"class":"checkbox"}).append(a("<label/>",{html:b.title}).prepend(a("<input/>",{type:"checkbox",checked:!0}).data("__FooTableColumn__",b)))):null})),d.delay>0&&(d.$input.on("keypress keyup paste",{self:d},d._onSearchInputChanged),d.$dropdown.on("click",'input[type="checkbox"]',{self:d},d._onSearchColumnClicked)),g.append(d.$button,h,d.$dropdown),f.append(d.$input,g)},predraw:function(){if(!b.is.emptyArray(this.filters)){var c=this;c.ft.rows.array=a.grep(c.ft.rows.array,function(a){return a.filtered(c.filters)})}},draw:function(){b.is.jq(this.$cell)&&this.$cell.attr("colspan",this.ft.columns.visibleColspan);var a=this.find("search");if(a instanceof b.Filter){var c=a.query.val();this.exactMatch&&this._exactRegExp.test(c)&&(c=c.replace(this._exactRegExp,"$1")),this.$input.val(c)}else this.$input.val(null);this.setButton(!b.arr.any(this.filters,function(a){return!a.hidden}))},addFilter:function(a,c,d,e,f,g,h){var i=this.createFilter(a,c,d,e,f,g,h);i instanceof b.Filter&&(this.removeFilter(i.name),this.filters.push(i))},removeFilter:function(a){b.arr.remove(this.filters,function(b){return b.name==a})},filter:function(a){var b=this;return b.filters=b.ensure(b.filters),b.ft.raise("before.ft.filtering",[b.filters]).then(function(){if(b.filters=b.ensure(b.filters),a)var c=b.$input.prop("selectionStart"),d=b.$input.prop("selectionEnd");return b.ft.draw().then(function(){a&&b.$input.focus().prop({selectionStart:c,selectionEnd:d}),b.ft.raise("after.ft.filtering",[b.filters])})})},clear:function(){return this.filters=b.arr.get(this.filters,function(a){return a.hidden}),this.filter(this.focus)},setButton:function(a){a?this.$button.children(".fooicon").removeClass("fooicon-remove").addClass("fooicon-search"):this.$button.children(".fooicon").removeClass("fooicon-search").addClass("fooicon-remove")},find:function(a){return b.arr.first(this.filters,function(b){return b.name==a})},columns:function(){return b.is.jq(this.$dropdown)?this.$dropdown.find("input:checked").map(function(){return a(this).data("__FooTableColumn__")}).get():this.ft.columns.get(function(a){return a.filterable})},ensure:function(a){var c=this,d=[],e=c.columns();return b.is.emptyArray(a)||b.arr.each(a,function(a){a=c._ensure(a,e),a instanceof b.Filter&&d.push(a)}),d},createFilter:function(a,c,d,e,f,g,h){return b.is.string(a)&&(a={name:a,query:c,columns:d,ignoreCase:e,connectors:f,space:g,hidden:h}),this._ensure(a,this.columns())},_ensure:function(a,c){return(b.is.hash(a)||a instanceof b.Filter)&&!b.is.emptyString(a.name)&&(!b.is.emptyString(a.query)||a.query instanceof b.Query)?(a.columns=b.is.emptyArray(a.columns)?c:this.ft.columns.ensure(a.columns),a.ignoreCase=b.is["boolean"](a.ignoreCase)?a.ignoreCase:this.ignoreCase,a.connectors=b.is["boolean"](a.connectors)?a.connectors:this.connectors,a.hidden=b.is["boolean"](a.hidden)?a.hidden:!1,a.space=!b.is.string(a.space)||"AND"!==a.space&&"OR"!==a.space?this.space:a.space,a.query=b.is.string(a.query)?new b.Query(a.query,a.space,a.connectors,a.ignoreCase):a.query,a instanceof b.Filter?a:new b.Filter(a.name,a.query,a.columns,a.space,a.connectors,a.ignoreCase,a.hidden)):null},_onSearchInputChanged:function(a){var c=a.data.self,d="keypress"==a.type&&!b.is.emptyString(String.fromCharCode(a.charCode)),e="keyup"==a.type&&(8==a.which||46==a.which),f="paste"==a.type;(d||e||f)&&(13==a.which&&a.preventDefault(),null!=c._filterTimeout&&clearTimeout(c._filterTimeout),c._filterTimeout=setTimeout(function(){c._filterTimeout=null;var a=c.$input.val();a.length>=c.min?(c.exactMatch&&!c._exactRegExp.test(a)&&(a='"'+a+'"'),c.addFilter("search",a),c.filter(c.focus)):b.is.emptyString(a)&&c.clear()},c.delay))},_onSearchButtonClicked:function(a){a.preventDefault();var b=a.data.self;null!=b._filterTimeout&&clearTimeout(b._filterTimeout);var c=b.$button.children(".fooicon");if(c.hasClass("fooicon-remove"))b.clear();else{var d=b.$input.val();d.length>=b.min&&(b.exactMatch&&!b._exactRegExp.test(d)&&(d='"'+d+'"'),b.addFilter("search",d),b.filter(b.focus))}},_onSearchColumnClicked:function(a){var b=a.data.self;null!=b._filterTimeout&&clearTimeout(b._filterTimeout),b._filterTimeout=setTimeout(function(){b._filterTimeout=null;var a=b.$button.children(".fooicon");a.hasClass("fooicon-remove")&&(a.removeClass("fooicon-remove").addClass("fooicon-search"),b.addFilter("search",b.$input.val()),b.filter())},b.delay)},_onDropdownToggleClicked:function(b){b.preventDefault(),b.stopPropagation();var c=b.data.self;c.$dropdown.parent().toggleClass("open"),c.$dropdown.parent().hasClass("open")?a(document).on("click.footable",{self:c},c._onDocumentClicked):a(document).off("click.footable",c._onDocumentClicked)},_onDocumentClicked:function(b){if(0==a(b.target).closest(".dropdown-menu").length){b.preventDefault();var c=b.data.self;c.$dropdown.parent().removeClass("open"),a(document).off("click.footable",c._onDocumentClicked)}}}),b.components.register("filtering",b.Filtering,500)}(jQuery,FooTable),function(a){a.Query=a.Class.extend({construct:function(b,c,d,e){this._original=null,this._value=null,this.space=!a.is.string(c)||"OR"!=c&&"AND"!=c?"AND":c,this.connectors=a.is["boolean"](d)?d:!0,this.ignoreCase=a.is["boolean"](e)?e:!0,this.left=null,this.right=null,this.parts=[],this.operator=null,this.val(b)},val:function(b){if(a.is.emptyString(b))return this._value;if(a.is.emptyString(this._original))this._original=b;else if(this._original==b)return;this._value=b,this._parse()},match:function(b){return a.is.emptyString(this.operator)||"OR"===this.operator?this._left(b,!1)||this._match(b,!1)||this._right(b,!1):"AND"===this.operator?this._left(b,!0)&&this._match(b,!0)&&this._right(b,!0):void 0},_match:function(b,c){var d=this,e=!1,f=a.is.emptyString(b);return a.is.emptyArray(d.parts)&&d.left instanceof a.Query?c:a.is.emptyArray(d.parts)?e:("OR"===d.space?a.arr.each(d.parts,function(c){if(c.empty&&f){if(e=!0,c.negate)return e=!1}else{var g=(c.exact?a.str.containsExact:a.str.contains)(b,c.query,d.ignoreCase);if(g&&!c.negate&&(e=!0),g&&c.negate)return e=!1}}):(e=!0,a.arr.each(d.parts,function(c){if(c.empty)return(!f&&!c.negate||f&&c.negate)&&(e=!1),e;var g=(c.exact?a.str.containsExact:a.str.contains)(b,c.query,d.ignoreCase);return(!g&&!c.negate||g&&c.negate)&&(e=!1),e})),e)},_left:function(b,c){return this.left instanceof a.Query?this.left.match(b):c},_right:function(b,c){return this.right instanceof a.Query?this.right.match(b):c},_parse:function(){if(!a.is.emptyString(this._value))if(/\sOR\s/.test(this._value)){this.operator="OR";var b=this._value.split(/(?:\sOR\s)(.*)?/);this.left=new a.Query(b[0],this.space,this.connectors,this.ignoreCase),this.right=new a.Query(b[1],this.space,this.connectors,this.ignoreCase)}else if(/\sAND\s/.test(this._value)){this.operator="AND";var c=this._value.split(/(?:\sAND\s)(.*)?/);this.left=new a.Query(c[0],this.space,this.connectors,this.ignoreCase),this.right=new a.Query(c[1],this.space,this.connectors,this.ignoreCase)}else{var d=this;this.parts=a.arr.map(this._value.match(/(?:[^\s"]+|"[^"]*")+/g),function(a){return d._part(a)})}},_part:function(b){var c={query:b,negate:!1,phrase:!1,exact:!1,empty:!1};return a.str.startsWith(c.query,"-")&&(c.query=a.str.from(c.query,"-"),c.negate=!0),/^"(.*?)"$/.test(c.query)?(c.query=c.query.replace(/^"(.*?)"$/,"$1"),c.phrase=!0,c.exact=!0):this.connectors&&/(?:\w)+?([-_\+\.])(?:\w)+?/.test(c.query)&&(c.query=c.query.replace(/(?:\w)+?([-_\+\.])(?:\w)+?/g,function(a,b){return a.replace(b," ")}),c.phrase=!0),c.empty=c.phrase&&a.is.emptyString(c.query),c}})}(FooTable),function(a){a.Cell.prototype.filterValue=null,a.Cell.prototype.__filtering_define__=function(a){this.filterValue=this.column.filterValue.call(this.column,a)},a.Cell.prototype.__filtering_val__=function(b){a.is.defined(b)&&(this.filterValue=this.column.filterValue.call(this.column,b))},a.Cell.extend("define",function(a){this._super(a),this.__filtering_define__(a)}),a.Cell.extend("val",function(a,b,c){var d=this._super(a,b,c);return this.__filtering_val__(a),d})}(FooTable),function(a,b){b.Column.prototype.filterable=!0,b.Column.prototype.filterValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("filterValue");return b.is.defined(d)?""+d:a(c).text()}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.filterValue))return c.options.filterValue;b.is.defined(c.value)&&(c=c.value)}return b.is.defined(c)&&null!=c?c+"":""},b.Column.prototype.__filtering_define__=function(a){this.filterable=b.is["boolean"](a.filterable)?a.filterable:this.filterable,this.filterValue=b.checkFnValue(this,a.filterValue,this.filterValue)},b.Column.extend("define",function(a){this._super(a),this.__filtering_define__(a)})}(jQuery,FooTable),function(a){a.Defaults.prototype.filtering={enabled:!1,filters:[],delay:1200,min:1,space:"AND",placeholder:"Search",dropdownTitle:null,position:"right",connectors:!0,ignoreCase:!0,exactMatch:!1,focus:!0,container:null}}(FooTable),function(a){a.Row.prototype.filtered=function(b){var c=!0,d=this;return a.arr.each(b,function(a){return 0==(c=a.matchRow(d))?!1:void 0}),c}}(FooTable),function(a,b){b.Sorter=b.Class.extend({construct:function(a,b){this.column=a,this.direction=b}})}(jQuery,FooTable),function(a,b){b.Sorting=b.Component.extend({construct:function(a){this._super(a,a.o.sorting.enabled),this.o=a.o.sorting,this.column=null,this.allowed=!0,this.initial=null},preinit:function(a){var c=this;this.ft.raise("preinit.ft.sorting",[a]).then(function(){c.ft.$el.hasClass("footable-sorting")&&(c.enabled=!0),c.enabled=b.is["boolean"](a.sorting)?a.sorting:c.enabled,c.enabled&&(c.column=b.arr.first(c.ft.columns.array,function(a){return a.sorted}))},function(){c.enabled=!1})},init:function(){var c=this;this.ft.raise("init.ft.sorting").then(function(){if(!c.initial){var d=!!c.column;c.initial={isset:d,rows:c.ft.rows.all.slice(0),column:d?c.column.name:null,direction:d?c.column.direction:null}}b.arr.each(c.ft.columns.array,function(b){b.sortable&&b.$el.addClass("footable-sortable").append(a("<span/>",{"class":"fooicon fooicon-sort"}))}),c.ft.$el.on("click.footable",".footable-sortable",{self:c},c._onSortClicked)},function(){c.enabled=!1})},destroy:function(){var a=this;this.ft.raise("destroy.ft.paging").then(function(){a.ft.$el.off("click.footable",".footable-sortable",a._onSortClicked),a.ft.$el.children("thead").children("tr.footable-header").children(".footable-sortable").removeClass("footable-sortable footable-asc footable-desc").find("span.fooicon").remove()})},predraw:function(){if(this.column){var a=this,b=a.column;a.ft.rows.array.sort(function(a,c){return"DESC"==b.direction?b.sorter(c.cells[b.index].sortValue,a.cells[b.index].sortValue):b.sorter(a.cells[b.index].sortValue,c.cells[b.index].sortValue)})}},draw:function(){if(this.column){var a=this,b=a.ft.$el.find("thead > tr > .footable-sortable"),c=a.column.$el;b.removeClass("footable-asc footable-desc").children(".fooicon").removeClass("fooicon-sort fooicon-sort-asc fooicon-sort-desc"),b.not(c).children(".fooicon").addClass("fooicon-sort"),c.addClass("DESC"==a.column.direction?"footable-desc":"footable-asc").children(".fooicon").addClass("DESC"==a.column.direction?"fooicon-sort-desc":"fooicon-sort-asc")}},sort:function(a,b){return this._sort(a,b)},toggleAllowed:function(a){a=b.is["boolean"](a)?a:!this.allowed,this.allowed=a,this.ft.$el.toggleClass("footable-sorting-disabled",!this.allowed)},hasChanged:function(){return!(!this.initial||!this.column||this.column.name===this.initial.column&&(this.column.direction===this.initial.direction||null===this.initial.direction&&"ASC"===this.column.direction))},reset:function(){this.initial&&(this.initial.isset?this.sort(this.initial.column,this.initial.direction):(this.column&&(this.column.$el.removeClass("footable-asc footable-desc"),this.column=null),this.ft.rows.all=this.initial.rows,this.ft.draw()))},_sort:function(c,d){if(!this.allowed)return a.Deferred().reject("sorting disabled");var e=this,f=new b.Sorter(e.ft.columns.get(c),b.Sorting.dir(d));return e.ft.raise("before.ft.sorting",[f]).then(function(){return b.arr.each(e.ft.columns.array,function(a){a!=e.column&&(a.direction=null)}),e.column=e.ft.columns.get(f.column),e.column&&(e.column.direction=b.Sorting.dir(f.direction)),e.ft.draw().then(function(){e.ft.raise("after.ft.sorting",[f])})})},_onSortClicked:function(b){var c=b.data.self,d=a(this).closest("th,td"),e=d.is(".footable-asc, .footable-desc")?d.hasClass("footable-desc")?"ASC":"DESC":"ASC";c._sort(d.index(),e)}}),b.Sorting.dir=function(a){return!b.is.string(a)||"ASC"!=a&&"DESC"!=a?"ASC":a},b.components.register("sorting",b.Sorting,600)}(jQuery,FooTable),function(a){a.Cell.prototype.sortValue=null,a.Cell.prototype.__sorting_define__=function(a){this.sortValue=this.column.sortValue.call(this.column,a)},a.Cell.prototype.__sorting_val__=function(b){a.is.defined(b)&&(this.sortValue=this.column.sortValue.call(this.column,b))},a.Cell.extend("define",function(a){this._super(a),this.__sorting_define__(a)}),a.Cell.extend("val",function(a,b,c){var d=this._super(a,b,c);return this.__sorting_val__(a),d})}(FooTable),function(a,b){b.Column.prototype.direction=null,b.Column.prototype.sortable=!0,b.Column.prototype.sorted=!1,b.Column.prototype.sorter=function(a,b){return"string"==typeof a&&(a=a.toLowerCase()),"string"==typeof b&&(b=b.toLowerCase()),a===b?0:b>a?-1:1},b.Column.prototype.sortValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("sortValue");return b.is.defined(d)?d:this.parser(c)}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.sortValue))return c.options.sortValue;b.is.defined(c.value)&&(c=c.value)}return b.is.defined(c)&&null!=c?c:null},b.Column.prototype.__sorting_define__=function(a){this.sorter=b.checkFnValue(this,a.sorter,this.sorter),this.direction=b.is.type(a.direction,"string")?b.Sorting.dir(a.direction):null,this.sortable=b.is["boolean"](a.sortable)?a.sortable:!0,this.sorted=b.is["boolean"](a.sorted)?a.sorted:!1,this.sortValue=b.checkFnValue(this,a.sortValue,this.sortValue)},b.Column.extend("define",function(a){this._super(a),this.__sorting_define__(a)})}(jQuery,FooTable),function(a){a.Defaults.prototype.sorting={enabled:!1}}(FooTable),function(a,b){b.HTMLColumn.extend("__sorting_define__",function(c){this._super(c),this.sortUse=b.is.string(c.sortUse)&&-1!==a.inArray(c.sortUse,["html","text"])?c.sortUse:"html"}),b.HTMLColumn.prototype.sortValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("sortValue");return b.is.defined(d)?d:this.parser(c)}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.sortValue))return c.options.sortValue;b.is.defined(c.value)&&(c=c.value)}return b.is.defined(c)&&null!=c?c:null}}(jQuery,FooTable),function(a,b){b.NumberColumn.prototype.sortValue=function(c){if(b.is.element(c)||b.is.jq(c)){var d=a(c).data("sortValue");return b.is.number(d)?d:this.parser(c)}if(b.is.hash(c)&&b.is.hash(c.options)){if(b.is.string(c.options.sortValue))return this.parser(c);if(b.is.number(c.options.sortValue))return c.options.sortValue;if(b.is.number(c.value))return c.value}return b.is.string(c)?this.parser(c):b.is.number(c)?c:null}}(jQuery,FooTable),function(a){a.Table.prototype.sort=function(b,c){return this.use(a.Sorting).sort(b,c)}}(FooTable),function(a,b){b.Pager=b.Class.extend({construct:function(a,b,c,d,e){this.total=a,this.current=b,this.size=c,this.page=d,this.forward=e}})}(jQuery,FooTable),function(a,b){b.Paging=b.Component.extend({construct:function(a){this._super(a,a.o.paging.enabled),this.strings=a.o.paging.strings,this.current=a.o.paging.current,this.size=a.o.paging.size,this.limit=a.o.paging.limit,this.position=a.o.paging.position,this.countFormat=a.o.paging.countFormat,this.container=a.o.paging.container,this.total=-1,this.totalRows=0,this.previous=-1,this.formattedCount=null,this.$container=null,this.$wrapper=null,this.$row=null,this.$cell=null,this.$pagination=null,this.$count=null,this.detached=!0,this._createdLinks=0},preinit:function(a){var c=this;this.ft.raise("preinit.ft.paging",[a]).then(function(){c.ft.$el.hasClass("footable-paging")&&(c.enabled=!0),c.enabled=b.is["boolean"](a.paging)?a.paging:c.enabled,c.enabled&&(c.size=b.is.number(a.pagingSize)?a.pagingSize:c.size,c.current=b.is.number(a.pagingCurrent)?a.pagingCurrent:c.current,c.limit=b.is.number(a.pagingLimit)?a.pagingLimit:c.limit,c.ft.$el.hasClass("footable-paging-left")&&(c.position="left"),c.ft.$el.hasClass("footable-paging-center")&&(c.position="center"),c.ft.$el.hasClass("footable-paging-right")&&(c.position="right"),c.position=b.is.string(a.pagingPosition)?a.pagingPosition:c.position,c.countFormat=b.is.string(a.pagingCountFormat)?a.pagingCountFormat:c.countFormat,c.container=b.is.string(a.pagingContainer)?a.pagingContainer:c.container,c.total=Math.ceil(c.ft.rows.all.length/c.size))},function(){c.enabled=!1})},init:function(){var a=this;this.ft.raise("init.ft.paging").then(function(){a.$create()},function(){a.enabled=!1})},destroy:function(){var a=this;this.ft.raise("destroy.ft.paging").then(function(){a.ft.$el.removeClass("footable-paging").find("tfoot > tr.footable-paging").remove(),a.detached=!0,a._createdLinks=0})},predraw:function(){this.total=Math.ceil(this.ft.rows.array.length/this.size),this.current=this.current>this.total?this.total:this.current<1?1:this.current,this.totalRows=this.ft.rows.array.length,this.totalRows>this.size&&(this.ft.rows.array=this.ft.rows.array.splice((this.current-1)*this.size,this.size)),this.formattedCount=this.format(this.countFormat)},draw:function(){if(this.total<=1)this.detached||(this.$row?this.$row.detach():this.$wrapper.detach(),this.detached=!0);else{if(this.detached){if(this.$row){var c=this.ft.$el.children("tfoot");0==c.length&&(c=a("<tfoot/>"),this.ft.$el.append(c)),this.$row.appendTo(c)}else this.$wrapper.appendTo(this.$container);this.detached=!1}b.is.jq(this.$cell)&&this.$cell.attr("colspan",this.ft.columns.visibleColspan),this._createLinks(),this._setVisible(this.current,this.current>this.previous),this._setNavigation(!0),this.$count.text(this.formattedCount)}},$create:function(){this._createdLinks=0;var c="footable-paging-center";switch(this.position){case"left":c="footable-paging-left";break;case"right":c="footable-paging-right"}if(this.ft.$el.addClass("footable-paging").addClass(c),this.$container=null===this.container?null:a(this.container).first(),b.is.jq(this.$container))this.$container.addClass("footable-paging-external").addClass(c);else{var d=this.ft.$el.children("tfoot");0==d.length&&(d=a("<tfoot/>"),this.ft.$el.append(d)),this.$row=a("<tr/>",{"class":"footable-paging"}).prependTo(d),this.$container=this.$cell=a("<td/>").attr("colspan",this.ft.columns.visibleColspan).appendTo(this.$row)}this.$wrapper=a("<div/>",{"class":"footable-pagination-wrapper"}).appendTo(this.$container),this.$pagination=a("<ul/>",{"class":"pagination"}).on("click.footable","a.footable-page-link",{self:this},this._onPageClicked),this.$count=a("<span/>",{"class":"label label-default"}),this.$wrapper.append(this.$pagination,a("<div/>",{"class":"divider"}),this.$count),this.detached=!1},format:function(a){var b=this.size*(this.current-1)+1,c=this.size*this.current;return 0==this.ft.rows.array.length?(b=0,c=0):c=c>this.totalRows?this.totalRows:c,a.replace(/\{CP}/g,this.current).replace(/\{TP}/g,this.total).replace(/\{PF}/g,b).replace(/\{PL}/g,c).replace(/\{TR}/g,this.totalRows)},first:function(){return this._set(1)},prev:function(){return this._set(this.current-1>0?this.current-1:1)},next:function(){return this._set(this.current+1<this.total?this.current+1:this.total)},last:function(){return this._set(this.total)},"goto":function(a){return this._set(a>this.total?this.total:1>a?1:a)},prevPages:function(){var a=this.$pagination.children("li.footable-page.visible:first").data("page")-1;this._setVisible(a,!0),this._setNavigation(!1)},nextPages:function(){var a=this.$pagination.children("li.footable-page.visible:last").data("page")+1;this._setVisible(a,!1),this._setNavigation(!1)},pageSize:function(a){return a=parseInt(a),isNaN(a)?this.size:(this.size=a,this.total=Math.ceil(this.ft.rows.all.length/this.size),b.is.jq(this.$wrapper)&&(this.$container.is("td")?this.$row.remove():this.$wrapper.remove()),this.$create(),void this.ft.draw())},_set:function(c){var d=this,e=new b.Pager(d.total,d.current,d.size,c,c>d.current);return d.ft.raise("before.ft.paging",[e]).then(function(){return e.page=e.page>e.total?e.total:e.page,e.page=e.page<1?1:e.page,d.current==c?a.when():(d.previous=d.current,d.current=e.page,d.ft.draw().then(function(){d.ft.raise("after.ft.paging",[e])}))})},_createLinks:function(){if(this._createdLinks!==this.total){var b=this,c=b.total>1,d=function(b,c,d){return a("<li/>",{"class":d}).attr("data-page",b).append(a("<a/>",{"class":"footable-page-link",href:"#"}).data("page",b).html(c))};b.$pagination.empty(),c&&(b.$pagination.append(d("first",b.strings.first,"footable-page-nav")),b.$pagination.append(d("prev",b.strings.prev,"footable-page-nav")),b.limit>0&&b.limit<b.total&&b.$pagination.append(d("prev-limit",b.strings.prevPages,"footable-page-nav")));for(var e,f=0;f<b.total;f++)e=d(f+1,f+1,"footable-page"),b.$pagination.append(e);c&&(b.limit>0&&b.limit<b.total&&b.$pagination.append(d("next-limit",b.strings.nextPages,"footable-page-nav")),b.$pagination.append(d("next",b.strings.next,"footable-page-nav")),b.$pagination.append(d("last",b.strings.last,"footable-page-nav"))),b._createdLinks=b.total}},_setNavigation:function(a){1==this.current?this.$pagination.children('li[data-page="first"],li[data-page="prev"]').addClass("disabled"):this.$pagination.children('li[data-page="first"],li[data-page="prev"]').removeClass("disabled"),this.current==this.total?this.$pagination.children('li[data-page="next"],li[data-page="last"]').addClass("disabled"):this.$pagination.children('li[data-page="next"],li[data-page="last"]').removeClass("disabled"),1==(this.$pagination.children("li.footable-page.visible:first").data("page")||1)?this.$pagination.children('li[data-page="prev-limit"]').addClass("disabled"):this.$pagination.children('li[data-page="prev-limit"]').removeClass("disabled"),(this.$pagination.children("li.footable-page.visible:last").data("page")||this.limit)==this.total?this.$pagination.children('li[data-page="next-limit"]').addClass("disabled"):this.$pagination.children('li[data-page="next-limit"]').removeClass("disabled"),this.limit>0&&this.total<this.limit?this.$pagination.children('li[data-page="prev-limit"],li[data-page="next-limit"]').css("display","none"):this.$pagination.children('li[data-page="prev-limit"],li[data-page="next-limit"]').css("display",""),
+a&&this.$pagination.children("li.footable-page").removeClass("active").filter('li[data-page="'+this.current+'"]').addClass("active")},_setVisible:function(a,b){if(this.limit>0&&this.total>this.limit){if(!this.$pagination.children('li.footable-page[data-page="'+a+'"]').hasClass("visible")){var c=0,d=0;1==b?(d=a>this.total?this.total:a,c=d-this.limit):(c=1>a?0:a-1,d=c+this.limit),0>c&&(c=0,d=this.limit>this.total?this.total:this.limit),d>this.total&&(d=this.total,c=this.total-this.limit<0?0:this.total-this.limit),this.$pagination.children("li.footable-page").removeClass("visible").slice(c,d).addClass("visible")}}else this.$pagination.children("li.footable-page").removeClass("visible").slice(0,this.total).addClass("visible")},_onPageClicked:function(b){if(b.preventDefault(),!a(b.target).closest("li").is(".active,.disabled")){var c=b.data.self,d=a(this).data("page");switch(d){case"first":return void c.first();case"prev":return void c.prev();case"next":return void c.next();case"last":return void c.last();case"prev-limit":return void c.prevPages();case"next-limit":return void c.nextPages();default:return void c._set(d)}}}}),b.components.register("paging",b.Paging,400)}(jQuery,FooTable),function(a){a.Defaults.prototype.paging={enabled:!1,countFormat:"{CP} of {TP}",current:1,limit:5,position:"center",size:10,container:null,strings:{first:"&laquo;",prev:"&lsaquo;",next:"&rsaquo;",last:"&raquo;",prevPages:"...",nextPages:"..."}}}(FooTable),function(a){a.Table.prototype.gotoPage=function(b){return this.use(a.Paging)["goto"](b)},a.Table.prototype.nextPage=function(){return this.use(a.Paging).next()},a.Table.prototype.prevPage=function(){return this.use(a.Paging).prev()},a.Table.prototype.firstPage=function(){return this.use(a.Paging).first()},a.Table.prototype.lastPage=function(){return this.use(a.Paging).last()},a.Table.prototype.nextPages=function(){return this.use(a.Paging).nextPages()},a.Table.prototype.prevPages=function(){return this.use(a.Paging).prevPages()},a.Table.prototype.pageSize=function(b){return this.use(a.Paging).pageSize(b)}}(FooTable),function(a,b){b.Editing=b.Component.extend({construct:function(c){this._super(c,c.o.editing.enabled),this.pageToNew=c.o.editing.pageToNew,this.alwaysShow=c.o.editing.alwaysShow,this.column=a.extend(!0,{},c.o.editing.column,{visible:this.alwaysShow}),this.position=c.o.editing.position,this.showText=c.o.editing.showText,this.hideText=c.o.editing.hideText,this.addText=c.o.editing.addText,this.editText=c.o.editing.editText,this.deleteText=c.o.editing.deleteText,this.viewText=c.o.editing.viewText,this.allowAdd=c.o.editing.allowAdd,this.allowEdit=c.o.editing.allowEdit,this.allowDelete=c.o.editing.allowDelete,this.allowView=c.o.editing.allowView,this._$buttons=null,this.callbacks={addRow:b.checkFnValue(this,c.o.editing.addRow),editRow:b.checkFnValue(this,c.o.editing.editRow),deleteRow:b.checkFnValue(this,c.o.editing.deleteRow),viewRow:b.checkFnValue(this,c.o.editing.viewRow)}},preinit:function(c){var d=this;this.ft.raise("preinit.ft.editing",[c]).then(function(){if(d.ft.$el.hasClass("footable-editing")&&(d.enabled=!0),d.enabled=b.is["boolean"](c.editing)?c.editing:d.enabled,d.enabled){if(d.pageToNew=b.is["boolean"](c.editingPageToNew)?c.editingPageToNew:d.pageToNew,d.alwaysShow=b.is["boolean"](c.editingAlwaysShow)?c.editingAlwaysShow:d.alwaysShow,d.position=b.is.string(c.editingPosition)?c.editingPosition:d.position,d.showText=b.is.string(c.editingShowText)?c.editingShowText:d.showText,d.hideText=b.is.string(c.editingHideText)?c.editingHideText:d.hideText,d.addText=b.is.string(c.editingAddText)?c.editingAddText:d.addText,d.editText=b.is.string(c.editingEditText)?c.editingEditText:d.editText,d.deleteText=b.is.string(c.editingDeleteText)?c.editingDeleteText:d.deleteText,d.viewText=b.is.string(c.editingViewText)?c.editingViewText:d.viewText,d.allowAdd=b.is["boolean"](c.editingAllowAdd)?c.editingAllowAdd:d.allowAdd,d.allowEdit=b.is["boolean"](c.editingAllowEdit)?c.editingAllowEdit:d.allowEdit,d.allowDelete=b.is["boolean"](c.editingAllowDelete)?c.editingAllowDelete:d.allowDelete,d.allowView=b.is["boolean"](c.editingAllowView)?c.editingAllowView:d.allowView,d.column=new b.EditingColumn(d.ft,d,a.extend(!0,{},d.column,c.editingColumn,{visible:d.alwaysShow})),d.ft.$el.hasClass("footable-editing-left")&&(d.position="left"),d.ft.$el.hasClass("footable-editing-right")&&(d.position="right"),"right"===d.position)d.column.index=d.ft.columns.array.length;else{d.column.index=0;for(var e=0,f=d.ft.columns.array.length;f>e;e++)d.ft.columns.array[e].index+=1}d.ft.columns.array.push(d.column),d.ft.columns.array.sort(function(a,b){return a.index-b.index}),d.callbacks.addRow=b.checkFnValue(d,c.editingAddRow,d.callbacks.addRow),d.callbacks.editRow=b.checkFnValue(d,c.editingEditRow,d.callbacks.editRow),d.callbacks.deleteRow=b.checkFnValue(d,c.editingDeleteRow,d.callbacks.deleteRow),d.callbacks.viewRow=b.checkFnValue(d,c.editingViewRow,d.callbacks.viewRow)}},function(){d.enabled=!1})},init:function(){var a=this;this.ft.raise("init.ft.editing").then(function(){a.$create()},function(){a.enabled=!1})},destroy:function(){var a=this;this.ft.raise("destroy.ft.editing").then(function(){a.ft.$el.removeClass("footable-editing footable-editing-always-show footable-editing-no-add footable-editing-no-edit footable-editing-no-delete footable-editing-no-view").off("click.ft.editing").find("tfoot > tr.footable-editing").remove()})},$create:function(){var b=this,c="right"===b.position?"footable-editing-right":"footable-editing-left";b.ft.$el.addClass("footable-editing").addClass(c).on("click.ft.editing",".footable-show",{self:b},b._onShowClick).on("click.ft.editing",".footable-hide",{self:b},b._onHideClick).on("click.ft.editing",".footable-edit",{self:b},b._onEditClick).on("click.ft.editing",".footable-delete",{self:b},b._onDeleteClick).on("click.ft.editing",".footable-view",{self:b},b._onViewClick).on("click.ft.editing",".footable-add",{self:b},b._onAddClick),b.$cell=a("<td/>").attr("colspan",b.ft.columns.visibleColspan).append(b.$buttonShow()),b.allowAdd&&b.$cell.append(b.$buttonAdd()),b.$cell.append(b.$buttonHide()),b.alwaysShow&&b.ft.$el.addClass("footable-editing-always-show"),b.allowAdd||b.ft.$el.addClass("footable-editing-no-add"),b.allowEdit||b.ft.$el.addClass("footable-editing-no-edit"),b.allowDelete||b.ft.$el.addClass("footable-editing-no-delete"),b.allowView||b.ft.$el.addClass("footable-editing-no-view");var d=b.ft.$el.children("tfoot");0==d.length&&(d=a("<tfoot/>"),b.ft.$el.append(d)),b.$row=a("<tr/>",{"class":"footable-editing"}).append(b.$cell).appendTo(d)},$buttonShow:function(){return'<button type="button" class="btn btn-primary footable-show">'+this.showText+"</button>"},$buttonHide:function(){return'<button type="button" class="btn btn-default footable-hide">'+this.hideText+"</button>"},$buttonAdd:function(){return'<button type="button" class="btn btn-primary footable-add">'+this.addText+"</button> "},$buttonEdit:function(){return'<button type="button" class="btn btn-default footable-edit">'+this.editText+"</button> "},$buttonDelete:function(){return'<button type="button" class="btn btn-default footable-delete">'+this.deleteText+"</button>"},$buttonView:function(){return'<button type="button" class="btn btn-default footable-view">'+this.viewText+"</button> "},$rowButtons:function(){return b.is.jq(this._$buttons)?this._$buttons.clone():(this._$buttons=a('<div class="btn-group btn-group-xs" role="group"></div>'),this.allowView&&this._$buttons.append(this.$buttonView()),this.allowEdit&&this._$buttons.append(this.$buttonEdit()),this.allowDelete&&this._$buttons.append(this.$buttonDelete()),this._$buttons)},draw:function(){this.$cell.attr("colspan",this.ft.columns.visibleColspan)},_onEditClick:function(c){c.preventDefault();var d=c.data.self,e=a(this).closest("tr").data("__FooTableRow__");e instanceof b.Row&&d.ft.raise("edit.ft.editing",[e]).then(function(){d.callbacks.editRow.call(d.ft,e)})},_onDeleteClick:function(c){c.preventDefault();var d=c.data.self,e=a(this).closest("tr").data("__FooTableRow__");e instanceof b.Row&&d.ft.raise("delete.ft.editing",[e]).then(function(){d.callbacks.deleteRow.call(d.ft,e)})},_onViewClick:function(c){c.preventDefault();var d=c.data.self,e=a(this).closest("tr").data("__FooTableRow__");e instanceof b.Row&&d.ft.raise("view.ft.editing",[e]).then(function(){d.callbacks.viewRow.call(d.ft,e)})},_onAddClick:function(a){a.preventDefault();var b=a.data.self;b.ft.raise("add.ft.editing").then(function(){b.callbacks.addRow.call(b.ft)})},_onShowClick:function(a){a.preventDefault();var b=a.data.self;b.ft.raise("show.ft.editing").then(function(){b.ft.$el.addClass("footable-editing-show"),b.column.visible=!0,b.ft.draw()})},_onHideClick:function(a){a.preventDefault();var b=a.data.self;b.ft.raise("hide.ft.editing").then(function(){b.ft.$el.removeClass("footable-editing-show"),b.column.visible=!1,b.ft.draw()})}}),b.components.register("editing",b.Editing,850)}(jQuery,FooTable),function(a,b){b.EditingColumn=b.Column.extend({construct:function(a,b,c){this._super(a,c,"editing"),this.editing=b,this.internal=!0},$create:function(){(this.$el=!this.virtual&&b.is.jq(this.$el)?this.$el:a("<th/>",{"class":"footable-editing"})).html(this.title)},parser:function(c){if(b.is.string(c)&&(c=a(a.trim(c))),b.is.element(c)&&(c=a(c)),b.is.jq(c)){var d=c.prop("tagName").toLowerCase();return"td"==d||"th"==d?c.data("value")||c.contents():c}return null},createCell:function(c){var d=this.editing.$rowButtons(),e=a("<td/>").append(d);return b.is.jq(c.$el)&&(0===this.index?e.prependTo(c.$el):e.insertAfter(c.$el.children().eq(this.index-1))),new b.Cell(this.ft,c,this,e||e.html())}}),b.columns.register("editing",b.EditingColumn)}(jQuery,FooTable),function(a,b){b.Defaults.prototype.editing={enabled:!1,pageToNew:!0,position:"right",alwaysShow:!1,addRow:function(){},editRow:function(a){},deleteRow:function(a){},viewRow:function(a){},showText:'<span class="fooicon fooicon-pencil" aria-hidden="true"></span> Edit rows',hideText:"Cancel",addText:"New row",editText:'<span class="fooicon fooicon-pencil" aria-hidden="true"></span>',deleteText:'<span class="fooicon fooicon-trash" aria-hidden="true"></span>',viewText:'<span class="fooicon fooicon-stats" aria-hidden="true"></span>',allowAdd:!0,allowEdit:!0,allowDelete:!0,allowView:!1,column:{classes:"footable-editing",name:"editing",title:"",filterable:!1,sortable:!1}}}(jQuery,FooTable),function(a,b){b.is.defined(b.Paging)&&(b.Paging.prototype.unpaged=[],b.Paging.extend("predraw",function(){this.unpaged=this.ft.rows.array.slice(0),this._super()}))}(jQuery,FooTable),function(a,b){b.Row.prototype.add=function(c){c=b.is["boolean"](c)?c:!0;var d=this;return a.Deferred(function(a){var b=d.ft.rows.all.push(d)-1;return c?d.ft.draw().then(function(){a.resolve(b)}):void a.resolve(b)})},b.Row.prototype["delete"]=function(c){c=b.is["boolean"](c)?c:!0;var d=this;return a.Deferred(function(a){var e=d.ft.rows.all.indexOf(d);return b.is.number(e)&&e>=0&&e<d.ft.rows.all.length&&(d.ft.rows.all.splice(e,1),c)?d.ft.draw().then(function(){a.resolve(d)}):void a.resolve(d)})},b.is.defined(b.Paging)&&b.Row.extend("add",function(a){a=b.is["boolean"](a)?a:!0;var c,d=this,e=this._super(a),f=d.ft.use(b.Editing);return f&&f.pageToNew&&(c=d.ft.use(b.Paging))&&a?e.then(function(){var a=c.unpaged.indexOf(d),b=Math.ceil((a+1)/c.size);return c.current!==b?c["goto"](b):void 0}):e}),b.is.defined(b.Sorting)&&b.Row.extend("val",function(a,c){c=b.is["boolean"](c)?c:!0;var d=this._super(a);if(!b.is.hash(a))return d;var e=this;return c&&e.ft.draw().then(function(){var a,c=e.ft.use(b.Editing);if(b.is.defined(b.Paging)&&c&&c.pageToNew&&(a=e.ft.use(b.Paging))){var d=a.unpaged.indexOf(e),f=Math.ceil((d+1)/a.size);if(a.current!==f)return a["goto"](f)}}),d})}(jQuery,FooTable),function(a){a.Rows.prototype.add=function(b,c){var d=b;a.is.hash(b)&&(d=new FooTable.Row(this.ft,this.ft.columns.array,b)),d instanceof FooTable.Row&&d.add(c)},a.Rows.prototype.update=function(b,c,d){var e=this.ft.rows.all.length,f=b;a.is.number(b)&&b>=0&&e>b&&(f=this.ft.rows.all[b]),f instanceof FooTable.Row&&a.is.hash(c)&&f.val(c,d)},a.Rows.prototype["delete"]=function(b,c){var d=this.ft.rows.all.length,e=b;a.is.number(b)&&b>=0&&d>b&&(e=this.ft.rows.all[b]),e instanceof FooTable.Row&&e["delete"](c)}}(FooTable),function(a,b){var c=0,d=function(a){var b,c,d=2166136261;for(b=0,c=a.length;c>b;b++)d^=a.charCodeAt(b),d+=(d<<1)+(d<<4)+(d<<7)+(d<<8)+(d<<24);return d>>>0}(location.origin+location.pathname);b.State=b.Component.extend({construct:function(a){this._super(a,a.o.state.enabled),this._key="1",this.key=this._key+(b.is.string(a.o.state.key)?a.o.state.key:this._uid()),this.filtering=b.is["boolean"](a.o.state.filtering)?a.o.state.filtering:!0,this.paging=b.is["boolean"](a.o.state.paging)?a.o.state.paging:!0,this.sorting=b.is["boolean"](a.o.state.sorting)?a.o.state.sorting:!0},preinit:function(a){var c=this;this.ft.raise("preinit.ft.state",[a]).then(function(){c.enabled=b.is["boolean"](a.state)?a.state:c.enabled,c.enabled&&(c.key=c._key+(b.is.string(a.stateKey)?a.stateKey:c.key),c.filtering=b.is["boolean"](a.stateFiltering)?a.stateFiltering:c.filtering,c.paging=b.is["boolean"](a.statePaging)?a.statePaging:c.paging,c.sorting=b.is["boolean"](a.stateSorting)?a.stateSorting:c.sorting)},function(){c.enabled=!1})},get:function(a){return JSON.parse(localStorage.getItem(this.key+":"+a))},set:function(a,b){localStorage.setItem(this.key+":"+a,JSON.stringify(b))},remove:function(a){localStorage.removeItem(this.key+":"+a)},read:function(){this.ft.execute(!1,!0,"readState")},write:function(){this.ft.execute(!1,!0,"writeState")},clear:function(){this.ft.execute(!1,!0,"clearState")},_uid:function(){var a=this.ft.$el.attr("id");return d+"_"+(b.is.string(a)?a:++c)}}),b.components.register("state",b.State,700)}(jQuery,FooTable),function(a){a.Component.prototype.readState=function(){},a.Component.prototype.writeState=function(){},a.Component.prototype.clearState=function(){}}(FooTable),function(a){a.Defaults.prototype.state={enabled:!1,filtering:!0,paging:!0,sorting:!0,key:null}}(FooTable),function(a){a.Filtering&&(a.Filtering.prototype.readState=function(){if(this.ft.state.filtering){var b=this.ft.state.get("filtering");a.is.hash(b)&&!a.is.emptyArray(b.filters)&&(this.filters=this.ensure(b.filters))}},a.Filtering.prototype.writeState=function(){if(this.ft.state.filtering){var b=a.arr.map(this.filters,function(b){return{name:b.name,query:b.query instanceof a.Query?b.query.val():b.query,columns:a.arr.map(b.columns,function(a){return a.name}),hidden:b.hidden,space:b.space,connectors:b.connectors,ignoreCase:b.ignoreCase}});this.ft.state.set("filtering",{filters:b})}},a.Filtering.prototype.clearState=function(){this.ft.state.filtering&&this.ft.state.remove("filtering")})}(FooTable),function(a){a.Paging&&(a.Paging.prototype.readState=function(){if(this.ft.state.paging){var b=this.ft.state.get("paging");a.is.hash(b)&&(this.current=b.current,this.size=b.size)}},a.Paging.prototype.writeState=function(){this.ft.state.paging&&this.ft.state.set("paging",{current:this.current,size:this.size})},a.Paging.prototype.clearState=function(){this.ft.state.paging&&this.ft.state.remove("paging")})}(FooTable),function(a){a.Sorting&&(a.Sorting.prototype.readState=function(){if(this.ft.state.sorting){var b=this.ft.state.get("sorting");if(a.is.hash(b)){var c=this.ft.columns.get(b.column);c instanceof a.Column&&(this.column=c,this.column.direction=b.direction)}}},a.Sorting.prototype.writeState=function(){this.ft.state.sorting&&this.column instanceof a.Column&&this.ft.state.set("sorting",{column:this.column.name,direction:this.column.direction})},a.Sorting.prototype.clearState=function(){this.ft.state.sorting&&this.ft.state.remove("sorting")})}(FooTable),function(a){a.Table.extend("_construct",function(a){return this.state=this.use(FooTable.State),this._super(a)}),a.Table.extend("_preinit",function(){var a=this;return a._super().then(function(){a.state.enabled&&a.state.read()})}),a.Table.extend("draw",function(){var a=this;return a._super().then(function(){a.state.enabled&&a.state.write()})})}(FooTable),function(a,b){b.Export=b.Component.extend({construct:function(a){this._super(a,!0),this.snapshot=[]},predraw:function(){this.snapshot=this.ft.rows.array.slice(0)},columns:function(){var a=[];return b.arr.each(this.ft.columns.array,function(b){b.internal||a.push({type:b.type,name:b.name,title:b.title,visible:b.visible,hidden:b.hidden,classes:b.classes,style:b.style})}),a},rows:function(a){a=b.is["boolean"](a)?a:!1;var c=a?this.ft.rows.all:this.snapshot,d=[];return b.arr.each(c,function(a){d.push(a.val())}),d},json:function(a){return JSON.parse(JSON.stringify({columns:this.columns(),rows:this.rows(a)}))},csv:function(a){var c,d,e="",f=this.columns();b.arr.each(f,function(a,b){d='"'+a.title.replace(/"/g,'""')+'"',e+=0===b?d:","+d}),e+="\n";var g=a?this.ft.rows.all:this.snapshot;return b.arr.each(g,function(a){b.arr.each(a.cells,function(a,b){a.column.internal||(c=a.column.stringify.call(a.column,a.value,a.ft.o,a.row.value),d='"'+c.replace(/"/g,'""')+'"',e+=0===b?d:","+d)}),e+="\n"}),e}}),b.components.register("export",b.Export,490)}(jQuery,FooTable),function(a){a.Column.prototype.__export_define__=function(b){this.stringify=a.checkFnValue(this,b.stringify,this.stringify)},a.Column.extend("define",function(a){this._super(a),this.__export_define__(a)}),a.Column.prototype.stringify=function(a,b,c){return a+""},a.DateColumn.prototype.stringify=function(b,c,d){return a.is.object(b)&&a.is["boolean"](b._isAMomentObject)&&b.isValid()?b.format(this.formatString):""},a.ObjectColumn.prototype.stringify=function(b,c,d){return a.is.object(b)?JSON.stringify(b):""},a.ArrayColumn.prototype.stringify=function(b,c,d){return a.is.array(b)?JSON.stringify(b):""}}(FooTable),function(a){a.Table.prototype.toJSON=function(b){return this.use(a.Export).json(b)},a.Table.prototype.toCSV=function(b){return this.use(a.Export).csv(b)}}(FooTable);
\ No newline at end of file
diff --git a/js/third-party/momentjs/moment.js b/js/third-party/momentjs/moment.js
new file mode 100644
index 0000000..9428c66
--- /dev/null
+++ b/js/third-party/momentjs/moment.js
@@ -0,0 +1,4535 @@
+//! moment.js
+//! version : 2.20.1
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+;(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    global.moment = factory()
+}(this, (function () { 'use strict';
+
+var hookCallback;
+
+function hooks () {
+    return hookCallback.apply(null, arguments);
+}
+
+// This is done to register the method called with moment()
+// without creating circular dependencies.
+function setHookCallback (callback) {
+    hookCallback = callback;
+}
+
+function isArray(input) {
+    return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';
+}
+
+function isObject(input) {
+    // IE8 will treat undefined and null as object if it wasn't for
+    // input != null
+    return input != null && Object.prototype.toString.call(input) === '[object Object]';
+}
+
+function isObjectEmpty(obj) {
+    if (Object.getOwnPropertyNames) {
+        return (Object.getOwnPropertyNames(obj).length === 0);
+    } else {
+        var k;
+        for (k in obj) {
+            if (obj.hasOwnProperty(k)) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
+
+function isUndefined(input) {
+    return input === void 0;
+}
+
+function isNumber(input) {
+    return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';
+}
+
+function isDate(input) {
+    return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';
+}
+
+function map(arr, fn) {
+    var res = [], i;
+    for (i = 0; i < arr.length; ++i) {
+        res.push(fn(arr[i], i));
+    }
+    return res;
+}
+
+function hasOwnProp(a, b) {
+    return Object.prototype.hasOwnProperty.call(a, b);
+}
+
+function extend(a, b) {
+    for (var i in b) {
+        if (hasOwnProp(b, i)) {
+            a[i] = b[i];
+        }
+    }
+
+    if (hasOwnProp(b, 'toString')) {
+        a.toString = b.toString;
+    }
+
+    if (hasOwnProp(b, 'valueOf')) {
+        a.valueOf = b.valueOf;
+    }
+
+    return a;
+}
+
+function createUTC (input, format, locale, strict) {
+    return createLocalOrUTC(input, format, locale, strict, true).utc();
+}
+
+function defaultParsingFlags() {
+    // We need to deep clone this object.
+    return {
+        empty           : false,
+        unusedTokens    : [],
+        unusedInput     : [],
+        overflow        : -2,
+        charsLeftOver   : 0,
+        nullInput       : false,
+        invalidMonth    : null,
+        invalidFormat   : false,
+        userInvalidated : false,
+        iso             : false,
+        parsedDateParts : [],
+        meridiem        : null,
+        rfc2822         : false,
+        weekdayMismatch : false
+    };
+}
+
+function getParsingFlags(m) {
+    if (m._pf == null) {
+        m._pf = defaultParsingFlags();
+    }
+    return m._pf;
+}
+
+var some;
+if (Array.prototype.some) {
+    some = Array.prototype.some;
+} else {
+    some = function (fun) {
+        var t = Object(this);
+        var len = t.length >>> 0;
+
+        for (var i = 0; i < len; i++) {
+            if (i in t && fun.call(this, t[i], i, t)) {
+                return true;
+            }
+        }
+
+        return false;
+    };
+}
+
+function isValid(m) {
+    if (m._isValid == null) {
+        var flags = getParsingFlags(m);
+        var parsedParts = some.call(flags.parsedDateParts, function (i) {
+            return i != null;
+        });
+        var isNowValid = !isNaN(m._d.getTime()) &&
+            flags.overflow < 0 &&
+            !flags.empty &&
+            !flags.invalidMonth &&
+            !flags.invalidWeekday &&
+            !flags.weekdayMismatch &&
+            !flags.nullInput &&
+            !flags.invalidFormat &&
+            !flags.userInvalidated &&
+            (!flags.meridiem || (flags.meridiem && parsedParts));
+
+        if (m._strict) {
+            isNowValid = isNowValid &&
+                flags.charsLeftOver === 0 &&
+                flags.unusedTokens.length === 0 &&
+                flags.bigHour === undefined;
+        }
+
+        if (Object.isFrozen == null || !Object.isFrozen(m)) {
+            m._isValid = isNowValid;
+        }
+        else {
+            return isNowValid;
+        }
+    }
+    return m._isValid;
+}
+
+function createInvalid (flags) {
+    var m = createUTC(NaN);
+    if (flags != null) {
+        extend(getParsingFlags(m), flags);
+    }
+    else {
+        getParsingFlags(m).userInvalidated = true;
+    }
+
+    return m;
+}
+
+// Plugins that add properties should also add the key here (null value),
+// so we can properly clone ourselves.
+var momentProperties = hooks.momentProperties = [];
+
+function copyConfig(to, from) {
+    var i, prop, val;
+
+    if (!isUndefined(from._isAMomentObject)) {
+        to._isAMomentObject = from._isAMomentObject;
+    }
+    if (!isUndefined(from._i)) {
+        to._i = from._i;
+    }
+    if (!isUndefined(from._f)) {
+        to._f = from._f;
+    }
+    if (!isUndefined(from._l)) {
+        to._l = from._l;
+    }
+    if (!isUndefined(from._strict)) {
+        to._strict = from._strict;
+    }
+    if (!isUndefined(from._tzm)) {
+        to._tzm = from._tzm;
+    }
+    if (!isUndefined(from._isUTC)) {
+        to._isUTC = from._isUTC;
+    }
+    if (!isUndefined(from._offset)) {
+        to._offset = from._offset;
+    }
+    if (!isUndefined(from._pf)) {
+        to._pf = getParsingFlags(from);
+    }
+    if (!isUndefined(from._locale)) {
+        to._locale = from._locale;
+    }
+
+    if (momentProperties.length > 0) {
+        for (i = 0; i < momentProperties.length; i++) {
+            prop = momentProperties[i];
+            val = from[prop];
+            if (!isUndefined(val)) {
+                to[prop] = val;
+            }
+        }
+    }
+
+    return to;
+}
+
+var updateInProgress = false;
+
+// Moment prototype object
+function Moment(config) {
+    copyConfig(this, config);
+    this._d = new Date(config._d != null ? config._d.getTime() : NaN);
+    if (!this.isValid()) {
+        this._d = new Date(NaN);
+    }
+    // Prevent infinite loop in case updateOffset creates new moment
+    // objects.
+    if (updateInProgress === false) {
+        updateInProgress = true;
+        hooks.updateOffset(this);
+        updateInProgress = false;
+    }
+}
+
+function isMoment (obj) {
+    return obj instanceof Moment || (obj != null && obj._isAMomentObject != null);
+}
+
+function absFloor (number) {
+    if (number < 0) {
+        // -0 -> 0
+        return Math.ceil(number) || 0;
+    } else {
+        return Math.floor(number);
+    }
+}
+
+function toInt(argumentForCoercion) {
+    var coercedNumber = +argumentForCoercion,
+        value = 0;
+
+    if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+        value = absFloor(coercedNumber);
+    }
+
+    return value;
+}
+
+// compare two arrays, return the number of differences
+function compareArrays(array1, array2, dontConvert) {
+    var len = Math.min(array1.length, array2.length),
+        lengthDiff = Math.abs(array1.length - array2.length),
+        diffs = 0,
+        i;
+    for (i = 0; i < len; i++) {
+        if ((dontConvert && array1[i] !== array2[i]) ||
+            (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+            diffs++;
+        }
+    }
+    return diffs + lengthDiff;
+}
+
+function warn(msg) {
+    if (hooks.suppressDeprecationWarnings === false &&
+            (typeof console !==  'undefined') && console.warn) {
+        console.warn('Deprecation warning: ' + msg);
+    }
+}
+
+function deprecate(msg, fn) {
+    var firstTime = true;
+
+    return extend(function () {
+        if (hooks.deprecationHandler != null) {
+            hooks.deprecationHandler(null, msg);
+        }
+        if (firstTime) {
+            var args = [];
+            var arg;
+            for (var i = 0; i < arguments.length; i++) {
+                arg = '';
+                if (typeof arguments[i] === 'object') {
+                    arg += '\n[' + i + '] ';
+                    for (var key in arguments[0]) {
+                        arg += key + ': ' + arguments[0][key] + ', ';
+                    }
+                    arg = arg.slice(0, -2); // Remove trailing comma and space
+                } else {
+                    arg = arguments[i];
+                }
+                args.push(arg);
+            }
+            warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack);
+            firstTime = false;
+        }
+        return fn.apply(this, arguments);
+    }, fn);
+}
+
+var deprecations = {};
+
+function deprecateSimple(name, msg) {
+    if (hooks.deprecationHandler != null) {
+        hooks.deprecationHandler(name, msg);
+    }
+    if (!deprecations[name]) {
+        warn(msg);
+        deprecations[name] = true;
+    }
+}
+
+hooks.suppressDeprecationWarnings = false;
+hooks.deprecationHandler = null;
+
+function isFunction(input) {
+    return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';
+}
+
+function set (config) {
+    var prop, i;
+    for (i in config) {
+        prop = config[i];
+        if (isFunction(prop)) {
+            this[i] = prop;
+        } else {
+            this['_' + i] = prop;
+        }
+    }
+    this._config = config;
+    // Lenient ordinal parsing accepts just a number in addition to
+    // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.
+    // TODO: Remove "ordinalParse" fallback in next major release.
+    this._dayOfMonthOrdinalParseLenient = new RegExp(
+        (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +
+            '|' + (/\d{1,2}/).source);
+}
+
+function mergeConfigs(parentConfig, childConfig) {
+    var res = extend({}, parentConfig), prop;
+    for (prop in childConfig) {
+        if (hasOwnProp(childConfig, prop)) {
+            if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {
+                res[prop] = {};
+                extend(res[prop], parentConfig[prop]);
+                extend(res[prop], childConfig[prop]);
+            } else if (childConfig[prop] != null) {
+                res[prop] = childConfig[prop];
+            } else {
+                delete res[prop];
+            }
+        }
+    }
+    for (prop in parentConfig) {
+        if (hasOwnProp(parentConfig, prop) &&
+                !hasOwnProp(childConfig, prop) &&
+                isObject(parentConfig[prop])) {
+            // make sure changes to properties don't modify parent config
+            res[prop] = extend({}, res[prop]);
+        }
+    }
+    return res;
+}
+
+function Locale(config) {
+    if (config != null) {
+        this.set(config);
+    }
+}
+
+var keys;
+
+if (Object.keys) {
+    keys = Object.keys;
+} else {
+    keys = function (obj) {
+        var i, res = [];
+        for (i in obj) {
+            if (hasOwnProp(obj, i)) {
+                res.push(i);
+            }
+        }
+        return res;
+    };
+}
+
+var defaultCalendar = {
+    sameDay : '[Today at] LT',
+    nextDay : '[Tomorrow at] LT',
+    nextWeek : 'dddd [at] LT',
+    lastDay : '[Yesterday at] LT',
+    lastWeek : '[Last] dddd [at] LT',
+    sameElse : 'L'
+};
+
+function calendar (key, mom, now) {
+    var output = this._calendar[key] || this._calendar['sameElse'];
+    return isFunction(output) ? output.call(mom, now) : output;
+}
+
+var defaultLongDateFormat = {
+    LTS  : 'h:mm:ss A',
+    LT   : 'h:mm A',
+    L    : 'MM/DD/YYYY',
+    LL   : 'MMMM D, YYYY',
+    LLL  : 'MMMM D, YYYY h:mm A',
+    LLLL : 'dddd, MMMM D, YYYY h:mm A'
+};
+
+function longDateFormat (key) {
+    var format = this._longDateFormat[key],
+        formatUpper = this._longDateFormat[key.toUpperCase()];
+
+    if (format || !formatUpper) {
+        return format;
+    }
+
+    this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) {
+        return val.slice(1);
+    });
+
+    return this._longDateFormat[key];
+}
+
+var defaultInvalidDate = 'Invalid date';
+
+function invalidDate () {
+    return this._invalidDate;
+}
+
+var defaultOrdinal = '%d';
+var defaultDayOfMonthOrdinalParse = /\d{1,2}/;
+
+function ordinal (number) {
+    return this._ordinal.replace('%d', number);
+}
+
+var defaultRelativeTime = {
+    future : 'in %s',
+    past   : '%s ago',
+    s  : 'a few seconds',
+    ss : '%d seconds',
+    m  : 'a minute',
+    mm : '%d minutes',
+    h  : 'an hour',
+    hh : '%d hours',
+    d  : 'a day',
+    dd : '%d days',
+    M  : 'a month',
+    MM : '%d months',
+    y  : 'a year',
+    yy : '%d years'
+};
+
+function relativeTime (number, withoutSuffix, string, isFuture) {
+    var output = this._relativeTime[string];
+    return (isFunction(output)) ?
+        output(number, withoutSuffix, string, isFuture) :
+        output.replace(/%d/i, number);
+}
+
+function pastFuture (diff, output) {
+    var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+    return isFunction(format) ? format(output) : format.replace(/%s/i, output);
+}
+
+var aliases = {};
+
+function addUnitAlias (unit, shorthand) {
+    var lowerCase = unit.toLowerCase();
+    aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;
+}
+
+function normalizeUnits(units) {
+    return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;
+}
+
+function normalizeObjectUnits(inputObject) {
+    var normalizedInput = {},
+        normalizedProp,
+        prop;
+
+    for (prop in inputObject) {
+        if (hasOwnProp(inputObject, prop)) {
+            normalizedProp = normalizeUnits(prop);
+            if (normalizedProp) {
+                normalizedInput[normalizedProp] = inputObject[prop];
+            }
+        }
+    }
+
+    return normalizedInput;
+}
+
+var priorities = {};
+
+function addUnitPriority(unit, priority) {
+    priorities[unit] = priority;
+}
+
+function getPrioritizedUnits(unitsObj) {
+    var units = [];
+    for (var u in unitsObj) {
+        units.push({unit: u, priority: priorities[u]});
+    }
+    units.sort(function (a, b) {
+        return a.priority - b.priority;
+    });
+    return units;
+}
+
+function zeroFill(number, targetLength, forceSign) {
+    var absNumber = '' + Math.abs(number),
+        zerosToFill = targetLength - absNumber.length,
+        sign = number >= 0;
+    return (sign ? (forceSign ? '+' : '') : '-') +
+        Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;
+}
+
+var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g;
+
+var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g;
+
+var formatFunctions = {};
+
+var formatTokenFunctions = {};
+
+// token:    'M'
+// padded:   ['MM', 2]
+// ordinal:  'Mo'
+// callback: function () { this.month() + 1 }
+function addFormatToken (token, padded, ordinal, callback) {
+    var func = callback;
+    if (typeof callback === 'string') {
+        func = function () {
+            return this[callback]();
+        };
+    }
+    if (token) {
+        formatTokenFunctions[token] = func;
+    }
+    if (padded) {
+        formatTokenFunctions[padded[0]] = function () {
+            return zeroFill(func.apply(this, arguments), padded[1], padded[2]);
+        };
+    }
+    if (ordinal) {
+        formatTokenFunctions[ordinal] = function () {
+            return this.localeData().ordinal(func.apply(this, arguments), token);
+        };
+    }
+}
+
+function removeFormattingTokens(input) {
+    if (input.match(/\[[\s\S]/)) {
+        return input.replace(/^\[|\]$/g, '');
+    }
+    return input.replace(/\\/g, '');
+}
+
+function makeFormatFunction(format) {
+    var array = format.match(formattingTokens), i, length;
+
+    for (i = 0, length = array.length; i < length; i++) {
+        if (formatTokenFunctions[array[i]]) {
+            array[i] = formatTokenFunctions[array[i]];
+        } else {
+            array[i] = removeFormattingTokens(array[i]);
+        }
+    }
+
+    return function (mom) {
+        var output = '', i;
+        for (i = 0; i < length; i++) {
+            output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];
+        }
+        return output;
+    };
+}
+
+// format date using native date object
+function formatMoment(m, format) {
+    if (!m.isValid()) {
+        return m.localeData().invalidDate();
+    }
+
+    format = expandFormat(format, m.localeData());
+    formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);
+
+    return formatFunctions[format](m);
+}
+
+function expandFormat(format, locale) {
+    var i = 5;
+
+    function replaceLongDateFormatTokens(input) {
+        return locale.longDateFormat(input) || input;
+    }
+
+    localFormattingTokens.lastIndex = 0;
+    while (i >= 0 && localFormattingTokens.test(format)) {
+        format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+        localFormattingTokens.lastIndex = 0;
+        i -= 1;
+    }
+
+    return format;
+}
+
+var match1         = /\d/;            //       0 - 9
+var match2         = /\d\d/;          //      00 - 99
+var match3         = /\d{3}/;         //     000 - 999
+var match4         = /\d{4}/;         //    0000 - 9999
+var match6         = /[+-]?\d{6}/;    // -999999 - 999999
+var match1to2      = /\d\d?/;         //       0 - 99
+var match3to4      = /\d\d\d\d?/;     //     999 - 9999
+var match5to6      = /\d\d\d\d\d\d?/; //   99999 - 999999
+var match1to3      = /\d{1,3}/;       //       0 - 999
+var match1to4      = /\d{1,4}/;       //       0 - 9999
+var match1to6      = /[+-]?\d{1,6}/;  // -999999 - 999999
+
+var matchUnsigned  = /\d+/;           //       0 - inf
+var matchSigned    = /[+-]?\d+/;      //    -inf - inf
+
+var matchOffset    = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z
+var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z
+
+var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123
+
+// any word (or two) characters or numbers including two/three word month in arabic.
+// includes scottish gaelic two word and hyphenated months
+var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i;
+
+
+var regexes = {};
+
+function addRegexToken (token, regex, strictRegex) {
+    regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {
+        return (isStrict && strictRegex) ? strictRegex : regex;
+    };
+}
+
+function getParseRegexForToken (token, config) {
+    if (!hasOwnProp(regexes, token)) {
+        return new RegExp(unescapeFormat(token));
+    }
+
+    return regexes[token](config._strict, config._locale);
+}
+
+// Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+function unescapeFormat(s) {
+    return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+        return p1 || p2 || p3 || p4;
+    }));
+}
+
+function regexEscape(s) {
+    return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
+
+var tokens = {};
+
+function addParseToken (token, callback) {
+    var i, func = callback;
+    if (typeof token === 'string') {
+        token = [token];
+    }
+    if (isNumber(callback)) {
+        func = function (input, array) {
+            array[callback] = toInt(input);
+        };
+    }
+    for (i = 0; i < token.length; i++) {
+        tokens[token[i]] = func;
+    }
+}
+
+function addWeekParseToken (token, callback) {
+    addParseToken(token, function (input, array, config, token) {
+        config._w = config._w || {};
+        callback(input, config._w, config, token);
+    });
+}
+
+function addTimeToArrayFromToken(token, input, config) {
+    if (input != null && hasOwnProp(tokens, token)) {
+        tokens[token](input, config._a, config, token);
+    }
+}
+
+var YEAR = 0;
+var MONTH = 1;
+var DATE = 2;
+var HOUR = 3;
+var MINUTE = 4;
+var SECOND = 5;
+var MILLISECOND = 6;
+var WEEK = 7;
+var WEEKDAY = 8;
+
+// FORMATTING
+
+addFormatToken('Y', 0, 0, function () {
+    var y = this.year();
+    return y <= 9999 ? '' + y : '+' + y;
+});
+
+addFormatToken(0, ['YY', 2], 0, function () {
+    return this.year() % 100;
+});
+
+addFormatToken(0, ['YYYY',   4],       0, 'year');
+addFormatToken(0, ['YYYYY',  5],       0, 'year');
+addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
+
+// ALIASES
+
+addUnitAlias('year', 'y');
+
+// PRIORITIES
+
+addUnitPriority('year', 1);
+
+// PARSING
+
+addRegexToken('Y',      matchSigned);
+addRegexToken('YY',     match1to2, match2);
+addRegexToken('YYYY',   match1to4, match4);
+addRegexToken('YYYYY',  match1to6, match6);
+addRegexToken('YYYYYY', match1to6, match6);
+
+addParseToken(['YYYYY', 'YYYYYY'], YEAR);
+addParseToken('YYYY', function (input, array) {
+    array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);
+});
+addParseToken('YY', function (input, array) {
+    array[YEAR] = hooks.parseTwoDigitYear(input);
+});
+addParseToken('Y', function (input, array) {
+    array[YEAR] = parseInt(input, 10);
+});
+
+// HELPERS
+
+function daysInYear(year) {
+    return isLeapYear(year) ? 366 : 365;
+}
+
+function isLeapYear(year) {
+    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+}
+
+// HOOKS
+
+hooks.parseTwoDigitYear = function (input) {
+    return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+};
+
+// MOMENTS
+
+var getSetYear = makeGetSet('FullYear', true);
+
+function getIsLeapYear () {
+    return isLeapYear(this.year());
+}
+
+function makeGetSet (unit, keepTime) {
+    return function (value) {
+        if (value != null) {
+            set$1(this, unit, value);
+            hooks.updateOffset(this, keepTime);
+            return this;
+        } else {
+            return get(this, unit);
+        }
+    };
+}
+
+function get (mom, unit) {
+    return mom.isValid() ?
+        mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN;
+}
+
+function set$1 (mom, unit, value) {
+    if (mom.isValid() && !isNaN(value)) {
+        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
+            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
+        }
+        else {
+            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
+        }
+    }
+}
+
+// MOMENTS
+
+function stringGet (units) {
+    units = normalizeUnits(units);
+    if (isFunction(this[units])) {
+        return this[units]();
+    }
+    return this;
+}
+
+
+function stringSet (units, value) {
+    if (typeof units === 'object') {
+        units = normalizeObjectUnits(units);
+        var prioritized = getPrioritizedUnits(units);
+        for (var i = 0; i < prioritized.length; i++) {
+            this[prioritized[i].unit](units[prioritized[i].unit]);
+        }
+    } else {
+        units = normalizeUnits(units);
+        if (isFunction(this[units])) {
+            return this[units](value);
+        }
+    }
+    return this;
+}
+
+function mod(n, x) {
+    return ((n % x) + x) % x;
+}
+
+var indexOf;
+
+if (Array.prototype.indexOf) {
+    indexOf = Array.prototype.indexOf;
+} else {
+    indexOf = function (o) {
+        // I know
+        var i;
+        for (i = 0; i < this.length; ++i) {
+            if (this[i] === o) {
+                return i;
+            }
+        }
+        return -1;
+    };
+}
+
+function daysInMonth(year, month) {
+    if (isNaN(year) || isNaN(month)) {
+        return NaN;
+    }
+    var modMonth = mod(month, 12);
+    year += (month - modMonth) / 12;
+    return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2);
+}
+
+// FORMATTING
+
+addFormatToken('M', ['MM', 2], 'Mo', function () {
+    return this.month() + 1;
+});
+
+addFormatToken('MMM', 0, 0, function (format) {
+    return this.localeData().monthsShort(this, format);
+});
+
+addFormatToken('MMMM', 0, 0, function (format) {
+    return this.localeData().months(this, format);
+});
+
+// ALIASES
+
+addUnitAlias('month', 'M');
+
+// PRIORITY
+
+addUnitPriority('month', 8);
+
+// PARSING
+
+addRegexToken('M',    match1to2);
+addRegexToken('MM',   match1to2, match2);
+addRegexToken('MMM',  function (isStrict, locale) {
+    return locale.monthsShortRegex(isStrict);
+});
+addRegexToken('MMMM', function (isStrict, locale) {
+    return locale.monthsRegex(isStrict);
+});
+
+addParseToken(['M', 'MM'], function (input, array) {
+    array[MONTH] = toInt(input) - 1;
+});
+
+addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {
+    var month = config._locale.monthsParse(input, token, config._strict);
+    // if we didn't find a month name, mark the date as invalid.
+    if (month != null) {
+        array[MONTH] = month;
+    } else {
+        getParsingFlags(config).invalidMonth = input;
+    }
+});
+
+// LOCALES
+
+var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/;
+var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+function localeMonths (m, format) {
+    if (!m) {
+        return isArray(this._months) ? this._months :
+            this._months['standalone'];
+    }
+    return isArray(this._months) ? this._months[m.month()] :
+        this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+function localeMonthsShort (m, format) {
+    if (!m) {
+        return isArray(this._monthsShort) ? this._monthsShort :
+            this._monthsShort['standalone'];
+    }
+    return isArray(this._monthsShort) ? this._monthsShort[m.month()] :
+        this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];
+}
+
+function handleStrictParse(monthName, format, strict) {
+    var i, ii, mom, llc = monthName.toLocaleLowerCase();
+    if (!this._monthsParse) {
+        // this is not used
+        this._monthsParse = [];
+        this._longMonthsParse = [];
+        this._shortMonthsParse = [];
+        for (i = 0; i < 12; ++i) {
+            mom = createUTC([2000, i]);
+            this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();
+            this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();
+        }
+    }
+
+    if (strict) {
+        if (format === 'MMM') {
+            ii = indexOf.call(this._shortMonthsParse, llc);
+            return ii !== -1 ? ii : null;
+        } else {
+            ii = indexOf.call(this._longMonthsParse, llc);
+            return ii !== -1 ? ii : null;
+        }
+    } else {
+        if (format === 'MMM') {
+            ii = indexOf.call(this._shortMonthsParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._longMonthsParse, llc);
+            return ii !== -1 ? ii : null;
+        } else {
+            ii = indexOf.call(this._longMonthsParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._shortMonthsParse, llc);
+            return ii !== -1 ? ii : null;
+        }
+    }
+}
+
+function localeMonthsParse (monthName, format, strict) {
+    var i, mom, regex;
+
+    if (this._monthsParseExact) {
+        return handleStrictParse.call(this, monthName, format, strict);
+    }
+
+    if (!this._monthsParse) {
+        this._monthsParse = [];
+        this._longMonthsParse = [];
+        this._shortMonthsParse = [];
+    }
+
+    // TODO: add sorting
+    // Sorting makes sure if one month (or abbr) is a prefix of another
+    // see sorting in computeMonthsParse
+    for (i = 0; i < 12; i++) {
+        // make the regex if we don't have it already
+        mom = createUTC([2000, i]);
+        if (strict && !this._longMonthsParse[i]) {
+            this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');
+            this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');
+        }
+        if (!strict && !this._monthsParse[i]) {
+            regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+            this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+        }
+        // test the regex
+        if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {
+            return i;
+        } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {
+            return i;
+        } else if (!strict && this._monthsParse[i].test(monthName)) {
+            return i;
+        }
+    }
+}
+
+// MOMENTS
+
+function setMonth (mom, value) {
+    var dayOfMonth;
+
+    if (!mom.isValid()) {
+        // No op
+        return mom;
+    }
+
+    if (typeof value === 'string') {
+        if (/^\d+$/.test(value)) {
+            value = toInt(value);
+        } else {
+            value = mom.localeData().monthsParse(value);
+            // TODO: Another silent failure?
+            if (!isNumber(value)) {
+                return mom;
+            }
+        }
+    }
+
+    dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));
+    mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
+    return mom;
+}
+
+function getSetMonth (value) {
+    if (value != null) {
+        setMonth(this, value);
+        hooks.updateOffset(this, true);
+        return this;
+    } else {
+        return get(this, 'Month');
+    }
+}
+
+function getDaysInMonth () {
+    return daysInMonth(this.year(), this.month());
+}
+
+var defaultMonthsShortRegex = matchWord;
+function monthsShortRegex (isStrict) {
+    if (this._monthsParseExact) {
+        if (!hasOwnProp(this, '_monthsRegex')) {
+            computeMonthsParse.call(this);
+        }
+        if (isStrict) {
+            return this._monthsShortStrictRegex;
+        } else {
+            return this._monthsShortRegex;
+        }
+    } else {
+        if (!hasOwnProp(this, '_monthsShortRegex')) {
+            this._monthsShortRegex = defaultMonthsShortRegex;
+        }
+        return this._monthsShortStrictRegex && isStrict ?
+            this._monthsShortStrictRegex : this._monthsShortRegex;
+    }
+}
+
+var defaultMonthsRegex = matchWord;
+function monthsRegex (isStrict) {
+    if (this._monthsParseExact) {
+        if (!hasOwnProp(this, '_monthsRegex')) {
+            computeMonthsParse.call(this);
+        }
+        if (isStrict) {
+            return this._monthsStrictRegex;
+        } else {
+            return this._monthsRegex;
+        }
+    } else {
+        if (!hasOwnProp(this, '_monthsRegex')) {
+            this._monthsRegex = defaultMonthsRegex;
+        }
+        return this._monthsStrictRegex && isStrict ?
+            this._monthsStrictRegex : this._monthsRegex;
+    }
+}
+
+function computeMonthsParse () {
+    function cmpLenRev(a, b) {
+        return b.length - a.length;
+    }
+
+    var shortPieces = [], longPieces = [], mixedPieces = [],
+        i, mom;
+    for (i = 0; i < 12; i++) {
+        // make the regex if we don't have it already
+        mom = createUTC([2000, i]);
+        shortPieces.push(this.monthsShort(mom, ''));
+        longPieces.push(this.months(mom, ''));
+        mixedPieces.push(this.months(mom, ''));
+        mixedPieces.push(this.monthsShort(mom, ''));
+    }
+    // Sorting makes sure if one month (or abbr) is a prefix of another it
+    // will match the longer piece.
+    shortPieces.sort(cmpLenRev);
+    longPieces.sort(cmpLenRev);
+    mixedPieces.sort(cmpLenRev);
+    for (i = 0; i < 12; i++) {
+        shortPieces[i] = regexEscape(shortPieces[i]);
+        longPieces[i] = regexEscape(longPieces[i]);
+    }
+    for (i = 0; i < 24; i++) {
+        mixedPieces[i] = regexEscape(mixedPieces[i]);
+    }
+
+    this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+    this._monthsShortRegex = this._monthsRegex;
+    this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+    this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+}
+
+function createDate (y, m, d, h, M, s, ms) {
+    // can't just apply() to create a date:
+    // https://stackoverflow.com/q/181348
+    var date = new Date(y, m, d, h, M, s, ms);
+
+    // the date constructor remaps years 0-99 to 1900-1999
+    if (y < 100 && y >= 0 && isFinite(date.getFullYear())) {
+        date.setFullYear(y);
+    }
+    return date;
+}
+
+function createUTCDate (y) {
+    var date = new Date(Date.UTC.apply(null, arguments));
+
+    // the Date.UTC function remaps years 0-99 to 1900-1999
+    if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) {
+        date.setUTCFullYear(y);
+    }
+    return date;
+}
+
+// start-of-first-week - start-of-year
+function firstWeekOffset(year, dow, doy) {
+    var // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+        fwd = 7 + dow - doy,
+        // first-week day local weekday -- which local weekday is fwd
+        fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;
+
+    return -fwdlw + fwd - 1;
+}
+
+// https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
+    var localWeekday = (7 + weekday - dow) % 7,
+        weekOffset = firstWeekOffset(year, dow, doy),
+        dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,
+        resYear, resDayOfYear;
+
+    if (dayOfYear <= 0) {
+        resYear = year - 1;
+        resDayOfYear = daysInYear(resYear) + dayOfYear;
+    } else if (dayOfYear > daysInYear(year)) {
+        resYear = year + 1;
+        resDayOfYear = dayOfYear - daysInYear(year);
+    } else {
+        resYear = year;
+        resDayOfYear = dayOfYear;
+    }
+
+    return {
+        year: resYear,
+        dayOfYear: resDayOfYear
+    };
+}
+
+function weekOfYear(mom, dow, doy) {
+    var weekOffset = firstWeekOffset(mom.year(), dow, doy),
+        week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,
+        resWeek, resYear;
+
+    if (week < 1) {
+        resYear = mom.year() - 1;
+        resWeek = week + weeksInYear(resYear, dow, doy);
+    } else if (week > weeksInYear(mom.year(), dow, doy)) {
+        resWeek = week - weeksInYear(mom.year(), dow, doy);
+        resYear = mom.year() + 1;
+    } else {
+        resYear = mom.year();
+        resWeek = week;
+    }
+
+    return {
+        week: resWeek,
+        year: resYear
+    };
+}
+
+function weeksInYear(year, dow, doy) {
+    var weekOffset = firstWeekOffset(year, dow, doy),
+        weekOffsetNext = firstWeekOffset(year + 1, dow, doy);
+    return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;
+}
+
+// FORMATTING
+
+addFormatToken('w', ['ww', 2], 'wo', 'week');
+addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
+
+// ALIASES
+
+addUnitAlias('week', 'w');
+addUnitAlias('isoWeek', 'W');
+
+// PRIORITIES
+
+addUnitPriority('week', 5);
+addUnitPriority('isoWeek', 5);
+
+// PARSING
+
+addRegexToken('w',  match1to2);
+addRegexToken('ww', match1to2, match2);
+addRegexToken('W',  match1to2);
+addRegexToken('WW', match1to2, match2);
+
+addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {
+    week[token.substr(0, 1)] = toInt(input);
+});
+
+// HELPERS
+
+// LOCALES
+
+function localeWeek (mom) {
+    return weekOfYear(mom, this._week.dow, this._week.doy).week;
+}
+
+var defaultLocaleWeek = {
+    dow : 0, // Sunday is the first day of the week.
+    doy : 6  // The week that contains Jan 1st is the first week of the year.
+};
+
+function localeFirstDayOfWeek () {
+    return this._week.dow;
+}
+
+function localeFirstDayOfYear () {
+    return this._week.doy;
+}
+
+// MOMENTS
+
+function getSetWeek (input) {
+    var week = this.localeData().week(this);
+    return input == null ? week : this.add((input - week) * 7, 'd');
+}
+
+function getSetISOWeek (input) {
+    var week = weekOfYear(this, 1, 4).week;
+    return input == null ? week : this.add((input - week) * 7, 'd');
+}
+
+// FORMATTING
+
+addFormatToken('d', 0, 'do', 'day');
+
+addFormatToken('dd', 0, 0, function (format) {
+    return this.localeData().weekdaysMin(this, format);
+});
+
+addFormatToken('ddd', 0, 0, function (format) {
+    return this.localeData().weekdaysShort(this, format);
+});
+
+addFormatToken('dddd', 0, 0, function (format) {
+    return this.localeData().weekdays(this, format);
+});
+
+addFormatToken('e', 0, 0, 'weekday');
+addFormatToken('E', 0, 0, 'isoWeekday');
+
+// ALIASES
+
+addUnitAlias('day', 'd');
+addUnitAlias('weekday', 'e');
+addUnitAlias('isoWeekday', 'E');
+
+// PRIORITY
+addUnitPriority('day', 11);
+addUnitPriority('weekday', 11);
+addUnitPriority('isoWeekday', 11);
+
+// PARSING
+
+addRegexToken('d',    match1to2);
+addRegexToken('e',    match1to2);
+addRegexToken('E',    match1to2);
+addRegexToken('dd',   function (isStrict, locale) {
+    return locale.weekdaysMinRegex(isStrict);
+});
+addRegexToken('ddd',   function (isStrict, locale) {
+    return locale.weekdaysShortRegex(isStrict);
+});
+addRegexToken('dddd',   function (isStrict, locale) {
+    return locale.weekdaysRegex(isStrict);
+});
+
+addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {
+    var weekday = config._locale.weekdaysParse(input, token, config._strict);
+    // if we didn't get a weekday name, mark the date as invalid
+    if (weekday != null) {
+        week.d = weekday;
+    } else {
+        getParsingFlags(config).invalidWeekday = input;
+    }
+});
+
+addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {
+    week[token] = toInt(input);
+});
+
+// HELPERS
+
+function parseWeekday(input, locale) {
+    if (typeof input !== 'string') {
+        return input;
+    }
+
+    if (!isNaN(input)) {
+        return parseInt(input, 10);
+    }
+
+    input = locale.weekdaysParse(input);
+    if (typeof input === 'number') {
+        return input;
+    }
+
+    return null;
+}
+
+function parseIsoWeekday(input, locale) {
+    if (typeof input === 'string') {
+        return locale.weekdaysParse(input) % 7 || 7;
+    }
+    return isNaN(input) ? null : input;
+}
+
+// LOCALES
+
+var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+function localeWeekdays (m, format) {
+    if (!m) {
+        return isArray(this._weekdays) ? this._weekdays :
+            this._weekdays['standalone'];
+    }
+    return isArray(this._weekdays) ? this._weekdays[m.day()] :
+        this._weekdays[this._weekdays.isFormat.test(format) ? 'format' : 'standalone'][m.day()];
+}
+
+var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+function localeWeekdaysShort (m) {
+    return (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort;
+}
+
+var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+function localeWeekdaysMin (m) {
+    return (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin;
+}
+
+function handleStrictParse$1(weekdayName, format, strict) {
+    var i, ii, mom, llc = weekdayName.toLocaleLowerCase();
+    if (!this._weekdaysParse) {
+        this._weekdaysParse = [];
+        this._shortWeekdaysParse = [];
+        this._minWeekdaysParse = [];
+
+        for (i = 0; i < 7; ++i) {
+            mom = createUTC([2000, 1]).day(i);
+            this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();
+            this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();
+            this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();
+        }
+    }
+
+    if (strict) {
+        if (format === 'dddd') {
+            ii = indexOf.call(this._weekdaysParse, llc);
+            return ii !== -1 ? ii : null;
+        } else if (format === 'ddd') {
+            ii = indexOf.call(this._shortWeekdaysParse, llc);
+            return ii !== -1 ? ii : null;
+        } else {
+            ii = indexOf.call(this._minWeekdaysParse, llc);
+            return ii !== -1 ? ii : null;
+        }
+    } else {
+        if (format === 'dddd') {
+            ii = indexOf.call(this._weekdaysParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._shortWeekdaysParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._minWeekdaysParse, llc);
+            return ii !== -1 ? ii : null;
+        } else if (format === 'ddd') {
+            ii = indexOf.call(this._shortWeekdaysParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._weekdaysParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._minWeekdaysParse, llc);
+            return ii !== -1 ? ii : null;
+        } else {
+            ii = indexOf.call(this._minWeekdaysParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._weekdaysParse, llc);
+            if (ii !== -1) {
+                return ii;
+            }
+            ii = indexOf.call(this._shortWeekdaysParse, llc);
+            return ii !== -1 ? ii : null;
+        }
+    }
+}
+
+function localeWeekdaysParse (weekdayName, format, strict) {
+    var i, mom, regex;
+
+    if (this._weekdaysParseExact) {
+        return handleStrictParse$1.call(this, weekdayName, format, strict);
+    }
+
+    if (!this._weekdaysParse) {
+        this._weekdaysParse = [];
+        this._minWeekdaysParse = [];
+        this._shortWeekdaysParse = [];
+        this._fullWeekdaysParse = [];
+    }
+
+    for (i = 0; i < 7; i++) {
+        // make the regex if we don't have it already
+
+        mom = createUTC([2000, 1]).day(i);
+        if (strict && !this._fullWeekdaysParse[i]) {
+            this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\.?') + '$', 'i');
+            this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\.?') + '$', 'i');
+            this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\.?') + '$', 'i');
+        }
+        if (!this._weekdaysParse[i]) {
+            regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+            this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+        }
+        // test the regex
+        if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {
+            return i;
+        } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {
+            return i;
+        } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {
+            return i;
+        } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {
+            return i;
+        }
+    }
+}
+
+// MOMENTS
+
+function getSetDayOfWeek (input) {
+    if (!this.isValid()) {
+        return input != null ? this : NaN;
+    }
+    var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+    if (input != null) {
+        input = parseWeekday(input, this.localeData());
+        return this.add(input - day, 'd');
+    } else {
+        return day;
+    }
+}
+
+function getSetLocaleDayOfWeek (input) {
+    if (!this.isValid()) {
+        return input != null ? this : NaN;
+    }
+    var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
+    return input == null ? weekday : this.add(input - weekday, 'd');
+}
+
+function getSetISODayOfWeek (input) {
+    if (!this.isValid()) {
+        return input != null ? this : NaN;
+    }
+
+    // behaves the same as moment#day except
+    // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+    // as a setter, sunday should belong to the previous week.
+
+    if (input != null) {
+        var weekday = parseIsoWeekday(input, this.localeData());
+        return this.day(this.day() % 7 ? weekday : weekday - 7);
+    } else {
+        return this.day() || 7;
+    }
+}
+
+var defaultWeekdaysRegex = matchWord;
+function weekdaysRegex (isStrict) {
+    if (this._weekdaysParseExact) {
+        if (!hasOwnProp(this, '_weekdaysRegex')) {
+            computeWeekdaysParse.call(this);
+        }
+        if (isStrict) {
+            return this._weekdaysStrictRegex;
+        } else {
+            return this._weekdaysRegex;
+        }
+    } else {
+        if (!hasOwnProp(this, '_weekdaysRegex')) {
+            this._weekdaysRegex = defaultWeekdaysRegex;
+        }
+        return this._weekdaysStrictRegex && isStrict ?
+            this._weekdaysStrictRegex : this._weekdaysRegex;
+    }
+}
+
+var defaultWeekdaysShortRegex = matchWord;
+function weekdaysShortRegex (isStrict) {
+    if (this._weekdaysParseExact) {
+        if (!hasOwnProp(this, '_weekdaysRegex')) {
+            computeWeekdaysParse.call(this);
+        }
+        if (isStrict) {
+            return this._weekdaysShortStrictRegex;
+        } else {
+            return this._weekdaysShortRegex;
+        }
+    } else {
+        if (!hasOwnProp(this, '_weekdaysShortRegex')) {
+            this._weekdaysShortRegex = defaultWeekdaysShortRegex;
+        }
+        return this._weekdaysShortStrictRegex && isStrict ?
+            this._weekdaysShortStrictRegex : this._weekdaysShortRegex;
+    }
+}
+
+var defaultWeekdaysMinRegex = matchWord;
+function weekdaysMinRegex (isStrict) {
+    if (this._weekdaysParseExact) {
+        if (!hasOwnProp(this, '_weekdaysRegex')) {
+            computeWeekdaysParse.call(this);
+        }
+        if (isStrict) {
+            return this._weekdaysMinStrictRegex;
+        } else {
+            return this._weekdaysMinRegex;
+        }
+    } else {
+        if (!hasOwnProp(this, '_weekdaysMinRegex')) {
+            this._weekdaysMinRegex = defaultWeekdaysMinRegex;
+        }
+        return this._weekdaysMinStrictRegex && isStrict ?
+            this._weekdaysMinStrictRegex : this._weekdaysMinRegex;
+    }
+}
+
+
+function computeWeekdaysParse () {
+    function cmpLenRev(a, b) {
+        return b.length - a.length;
+    }
+
+    var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [],
+        i, mom, minp, shortp, longp;
+    for (i = 0; i < 7; i++) {
+        // make the regex if we don't have it already
+        mom = createUTC([2000, 1]).day(i);
+        minp = this.weekdaysMin(mom, '');
+        shortp = this.weekdaysShort(mom, '');
+        longp = this.weekdays(mom, '');
+        minPieces.push(minp);
+        shortPieces.push(shortp);
+        longPieces.push(longp);
+        mixedPieces.push(minp);
+        mixedPieces.push(shortp);
+        mixedPieces.push(longp);
+    }
+    // Sorting makes sure if one weekday (or abbr) is a prefix of another it
+    // will match the longer piece.
+    minPieces.sort(cmpLenRev);
+    shortPieces.sort(cmpLenRev);
+    longPieces.sort(cmpLenRev);
+    mixedPieces.sort(cmpLenRev);
+    for (i = 0; i < 7; i++) {
+        shortPieces[i] = regexEscape(shortPieces[i]);
+        longPieces[i] = regexEscape(longPieces[i]);
+        mixedPieces[i] = regexEscape(mixedPieces[i]);
+    }
+
+    this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');
+    this._weekdaysShortRegex = this._weekdaysRegex;
+    this._weekdaysMinRegex = this._weekdaysRegex;
+
+    this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');
+    this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');
+    this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');
+}
+
+// FORMATTING
+
+function hFormat() {
+    return this.hours() % 12 || 12;
+}
+
+function kFormat() {
+    return this.hours() || 24;
+}
+
+addFormatToken('H', ['HH', 2], 0, 'hour');
+addFormatToken('h', ['hh', 2], 0, hFormat);
+addFormatToken('k', ['kk', 2], 0, kFormat);
+
+addFormatToken('hmm', 0, 0, function () {
+    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('hmmss', 0, 0, function () {
+    return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) +
+        zeroFill(this.seconds(), 2);
+});
+
+addFormatToken('Hmm', 0, 0, function () {
+    return '' + this.hours() + zeroFill(this.minutes(), 2);
+});
+
+addFormatToken('Hmmss', 0, 0, function () {
+    return '' + this.hours() + zeroFill(this.minutes(), 2) +
+        zeroFill(this.seconds(), 2);
+});
+
+function meridiem (token, lowercase) {
+    addFormatToken(token, 0, 0, function () {
+        return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);
+    });
+}
+
+meridiem('a', true);
+meridiem('A', false);
+
+// ALIASES
+
+addUnitAlias('hour', 'h');
+
+// PRIORITY
+addUnitPriority('hour', 13);
+
+// PARSING
+
+function matchMeridiem (isStrict, locale) {
+    return locale._meridiemParse;
+}
+
+addRegexToken('a',  matchMeridiem);
+addRegexToken('A',  matchMeridiem);
+addRegexToken('H',  match1to2);
+addRegexToken('h',  match1to2);
+addRegexToken('k',  match1to2);
+addRegexToken('HH', match1to2, match2);
+addRegexToken('hh', match1to2, match2);
+addRegexToken('kk', match1to2, match2);
+
+addRegexToken('hmm', match3to4);
+addRegexToken('hmmss', match5to6);
+addRegexToken('Hmm', match3to4);
+addRegexToken('Hmmss', match5to6);
+
+addParseToken(['H', 'HH'], HOUR);
+addParseToken(['k', 'kk'], function (input, array, config) {
+    var kInput = toInt(input);
+    array[HOUR] = kInput === 24 ? 0 : kInput;
+});
+addParseToken(['a', 'A'], function (input, array, config) {
+    config._isPm = config._locale.isPM(input);
+    config._meridiem = input;
+});
+addParseToken(['h', 'hh'], function (input, array, config) {
+    array[HOUR] = toInt(input);
+    getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmm', function (input, array, config) {
+    var pos = input.length - 2;
+    array[HOUR] = toInt(input.substr(0, pos));
+    array[MINUTE] = toInt(input.substr(pos));
+    getParsingFlags(config).bigHour = true;
+});
+addParseToken('hmmss', function (input, array, config) {
+    var pos1 = input.length - 4;
+    var pos2 = input.length - 2;
+    array[HOUR] = toInt(input.substr(0, pos1));
+    array[MINUTE] = toInt(input.substr(pos1, 2));
+    array[SECOND] = toInt(input.substr(pos2));
+    getParsingFlags(config).bigHour = true;
+});
+addParseToken('Hmm', function (input, array, config) {
+    var pos = input.length - 2;
+    array[HOUR] = toInt(input.substr(0, pos));
+    array[MINUTE] = toInt(input.substr(pos));
+});
+addParseToken('Hmmss', function (input, array, config) {
+    var pos1 = input.length - 4;
+    var pos2 = input.length - 2;
+    array[HOUR] = toInt(input.substr(0, pos1));
+    array[MINUTE] = toInt(input.substr(pos1, 2));
+    array[SECOND] = toInt(input.substr(pos2));
+});
+
+// LOCALES
+
+function localeIsPM (input) {
+    // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+    // Using charAt should be more compatible.
+    return ((input + '').toLowerCase().charAt(0) === 'p');
+}
+
+var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i;
+function localeMeridiem (hours, minutes, isLower) {
+    if (hours > 11) {
+        return isLower ? 'pm' : 'PM';
+    } else {
+        return isLower ? 'am' : 'AM';
+    }
+}
+
+
+// MOMENTS
+
+// Setting the hour should keep the time, because the user explicitly
+// specified which hour he wants. So trying to maintain the same hour (in
+// a new timezone) makes sense. Adding/subtracting hours does not follow
+// this rule.
+var getSetHour = makeGetSet('Hours', true);
+
+// months
+// week
+// weekdays
+// meridiem
+var baseConfig = {
+    calendar: defaultCalendar,
+    longDateFormat: defaultLongDateFormat,
+    invalidDate: defaultInvalidDate,
+    ordinal: defaultOrdinal,
+    dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,
+    relativeTime: defaultRelativeTime,
+
+    months: defaultLocaleMonths,
+    monthsShort: defaultLocaleMonthsShort,
+
+    week: defaultLocaleWeek,
+
+    weekdays: defaultLocaleWeekdays,
+    weekdaysMin: defaultLocaleWeekdaysMin,
+    weekdaysShort: defaultLocaleWeekdaysShort,
+
+    meridiemParse: defaultLocaleMeridiemParse
+};
+
+// internal storage for locale config files
+var locales = {};
+var localeFamilies = {};
+var globalLocale;
+
+function normalizeLocale(key) {
+    return key ? key.toLowerCase().replace('_', '-') : key;
+}
+
+// pick the locale from the array
+// try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+// substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+function chooseLocale(names) {
+    var i = 0, j, next, locale, split;
+
+    while (i < names.length) {
+        split = normalizeLocale(names[i]).split('-');
+        j = split.length;
+        next = normalizeLocale(names[i + 1]);
+        next = next ? next.split('-') : null;
+        while (j > 0) {
+            locale = loadLocale(split.slice(0, j).join('-'));
+            if (locale) {
+                return locale;
+            }
+            if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+                //the next array item is better than a shallower substring of this one
+                break;
+            }
+            j--;
+        }
+        i++;
+    }
+    return null;
+}
+
+function loadLocale(name) {
+    var oldLocale = null;
+    // TODO: Find a better way to register and load all the locales in Node
+    if (!locales[name] && (typeof module !== 'undefined') &&
+            module && module.exports) {
+        try {
+            oldLocale = globalLocale._abbr;
+            var aliasedRequire = require;
+            aliasedRequire('./locale/' + name);
+            getSetGlobalLocale(oldLocale);
+        } catch (e) {}
+    }
+    return locales[name];
+}
+
+// This function will load locale and then set the global locale.  If
+// no arguments are passed in, it will simply return the current global
+// locale key.
+function getSetGlobalLocale (key, values) {
+    var data;
+    if (key) {
+        if (isUndefined(values)) {
+            data = getLocale(key);
+        }
+        else {
+            data = defineLocale(key, values);
+        }
+
+        if (data) {
+            // moment.duration._locale = moment._locale = data;
+            globalLocale = data;
+        }
+    }
+
+    return globalLocale._abbr;
+}
+
+function defineLocale (name, config) {
+    if (config !== null) {
+        var parentConfig = baseConfig;
+        config.abbr = name;
+        if (locales[name] != null) {
+            deprecateSimple('defineLocaleOverride',
+                    'use moment.updateLocale(localeName, config) to change ' +
+                    'an existing locale. moment.defineLocale(localeName, ' +
+                    'config) should only be used for creating a new locale ' +
+                    'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');
+            parentConfig = locales[name]._config;
+        } else if (config.parentLocale != null) {
+            if (locales[config.parentLocale] != null) {
+                parentConfig = locales[config.parentLocale]._config;
+            } else {
+                if (!localeFamilies[config.parentLocale]) {
+                    localeFamilies[config.parentLocale] = [];
+                }
+                localeFamilies[config.parentLocale].push({
+                    name: name,
+                    config: config
+                });
+                return null;
+            }
+        }
+        locales[name] = new Locale(mergeConfigs(parentConfig, config));
+
+        if (localeFamilies[name]) {
+            localeFamilies[name].forEach(function (x) {
+                defineLocale(x.name, x.config);
+            });
+        }
+
+        // backwards compat for now: also set the locale
+        // make sure we set the locale AFTER all child locales have been
+        // created, so we won't end up with the child locale set.
+        getSetGlobalLocale(name);
+
+
+        return locales[name];
+    } else {
+        // useful for testing
+        delete locales[name];
+        return null;
+    }
+}
+
+function updateLocale(name, config) {
+    if (config != null) {
+        var locale, tmpLocale, parentConfig = baseConfig;
+        // MERGE
+        tmpLocale = loadLocale(name);
+        if (tmpLocale != null) {
+            parentConfig = tmpLocale._config;
+        }
+        config = mergeConfigs(parentConfig, config);
+        locale = new Locale(config);
+        locale.parentLocale = locales[name];
+        locales[name] = locale;
+
+        // backwards compat for now: also set the locale
+        getSetGlobalLocale(name);
+    } else {
+        // pass null for config to unupdate, useful for tests
+        if (locales[name] != null) {
+            if (locales[name].parentLocale != null) {
+                locales[name] = locales[name].parentLocale;
+            } else if (locales[name] != null) {
+                delete locales[name];
+            }
+        }
+    }
+    return locales[name];
+}
+
+// returns locale data
+function getLocale (key) {
+    var locale;
+
+    if (key && key._locale && key._locale._abbr) {
+        key = key._locale._abbr;
+    }
+
+    if (!key) {
+        return globalLocale;
+    }
+
+    if (!isArray(key)) {
+        //short-circuit everything else
+        locale = loadLocale(key);
+        if (locale) {
+            return locale;
+        }
+        key = [key];
+    }
+
+    return chooseLocale(key);
+}
+
+function listLocales() {
+    return keys(locales);
+}
+
+function checkOverflow (m) {
+    var overflow;
+    var a = m._a;
+
+    if (a && getParsingFlags(m).overflow === -2) {
+        overflow =
+            a[MONTH]       < 0 || a[MONTH]       > 11  ? MONTH :
+            a[DATE]        < 1 || a[DATE]        > daysInMonth(a[YEAR], a[MONTH]) ? DATE :
+            a[HOUR]        < 0 || a[HOUR]        > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR :
+            a[MINUTE]      < 0 || a[MINUTE]      > 59  ? MINUTE :
+            a[SECOND]      < 0 || a[SECOND]      > 59  ? SECOND :
+            a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND :
+            -1;
+
+        if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+            overflow = DATE;
+        }
+        if (getParsingFlags(m)._overflowWeeks && overflow === -1) {
+            overflow = WEEK;
+        }
+        if (getParsingFlags(m)._overflowWeekday && overflow === -1) {
+            overflow = WEEKDAY;
+        }
+
+        getParsingFlags(m).overflow = overflow;
+    }
+
+    return m;
+}
+
+// Pick the first defined of two or three arguments.
+function defaults(a, b, c) {
+    if (a != null) {
+        return a;
+    }
+    if (b != null) {
+        return b;
+    }
+    return c;
+}
+
+function currentDateArray(config) {
+    // hooks is actually the exported moment object
+    var nowValue = new Date(hooks.now());
+    if (config._useUTC) {
+        return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];
+    }
+    return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];
+}
+
+// convert an array to a date.
+// the array should mirror the parameters below
+// note: all values past the year are optional and will default to the lowest possible value.
+// [year, month, day , hour, minute, second, millisecond]
+function configFromArray (config) {
+    var i, date, input = [], currentDate, expectedWeekday, yearToUse;
+
+    if (config._d) {
+        return;
+    }
+
+    currentDate = currentDateArray(config);
+
+    //compute day of the year from weeks and weekdays
+    if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+        dayOfYearFromWeekInfo(config);
+    }
+
+    //if the day of the year is set, figure out what it is
+    if (config._dayOfYear != null) {
+        yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);
+
+        if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {
+            getParsingFlags(config)._overflowDayOfYear = true;
+        }
+
+        date = createUTCDate(yearToUse, 0, config._dayOfYear);
+        config._a[MONTH] = date.getUTCMonth();
+        config._a[DATE] = date.getUTCDate();
+    }
+
+    // Default to current date.
+    // * if no year, month, day of month are given, default to today
+    // * if day of month is given, default month and year
+    // * if month is given, default only year
+    // * if year is given, don't default anything
+    for (i = 0; i < 3 && config._a[i] == null; ++i) {
+        config._a[i] = input[i] = currentDate[i];
+    }
+
+    // Zero out whatever was not defaulted, including time
+    for (; i < 7; i++) {
+        config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+    }
+
+    // Check for 24:00:00.000
+    if (config._a[HOUR] === 24 &&
+            config._a[MINUTE] === 0 &&
+            config._a[SECOND] === 0 &&
+            config._a[MILLISECOND] === 0) {
+        config._nextDay = true;
+        config._a[HOUR] = 0;
+    }
+
+    config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);
+    expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();
+
+    // Apply timezone offset from input. The actual utcOffset can be changed
+    // with parseZone.
+    if (config._tzm != null) {
+        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+    }
+
+    if (config._nextDay) {
+        config._a[HOUR] = 24;
+    }
+
+    // check for mismatching day of week
+    if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {
+        getParsingFlags(config).weekdayMismatch = true;
+    }
+}
+
+function dayOfYearFromWeekInfo(config) {
+    var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow;
+
+    w = config._w;
+    if (w.GG != null || w.W != null || w.E != null) {
+        dow = 1;
+        doy = 4;
+
+        // TODO: We need to take the current isoWeekYear, but that depends on
+        // how we interpret now (local, utc, fixed offset). So create
+        // a now version of current config (take local/utc/offset flags, and
+        // create now).
+        weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);
+        week = defaults(w.W, 1);
+        weekday = defaults(w.E, 1);
+        if (weekday < 1 || weekday > 7) {
+            weekdayOverflow = true;
+        }
+    } else {
+        dow = config._locale._week.dow;
+        doy = config._locale._week.doy;
+
+        var curWeek = weekOfYear(createLocal(), dow, doy);
+
+        weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);
+
+        // Default to current week.
+        week = defaults(w.w, curWeek.week);
+
+        if (w.d != null) {
+            // weekday -- low day numbers are considered next week
+            weekday = w.d;
+            if (weekday < 0 || weekday > 6) {
+                weekdayOverflow = true;
+            }
+        } else if (w.e != null) {
+            // local weekday -- counting starts from begining of week
+            weekday = w.e + dow;
+            if (w.e < 0 || w.e > 6) {
+                weekdayOverflow = true;
+            }
+        } else {
+            // default to begining of week
+            weekday = dow;
+        }
+    }
+    if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {
+        getParsingFlags(config)._overflowWeeks = true;
+    } else if (weekdayOverflow != null) {
+        getParsingFlags(config)._overflowWeekday = true;
+    } else {
+        temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);
+        config._a[YEAR] = temp.year;
+        config._dayOfYear = temp.dayOfYear;
+    }
+}
+
+// iso 8601 regex
+// 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)
+var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/;
+
+var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/;
+
+var isoDates = [
+    ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
+    ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
+    ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
+    ['GGGG-[W]WW', /\d{4}-W\d\d/, false],
+    ['YYYY-DDD', /\d{4}-\d{3}/],
+    ['YYYY-MM', /\d{4}-\d\d/, false],
+    ['YYYYYYMMDD', /[+-]\d{10}/],
+    ['YYYYMMDD', /\d{8}/],
+    // YYYYMM is NOT allowed by the standard
+    ['GGGG[W]WWE', /\d{4}W\d{3}/],
+    ['GGGG[W]WW', /\d{4}W\d{2}/, false],
+    ['YYYYDDD', /\d{7}/]
+];
+
+// iso time formats and regexes
+var isoTimes = [
+    ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
+    ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
+    ['HH:mm:ss', /\d\d:\d\d:\d\d/],
+    ['HH:mm', /\d\d:\d\d/],
+    ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
+    ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
+    ['HHmmss', /\d\d\d\d\d\d/],
+    ['HHmm', /\d\d\d\d/],
+    ['HH', /\d\d/]
+];
+
+var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i;
+
+// date from iso format
+function configFromISO(config) {
+    var i, l,
+        string = config._i,
+        match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),
+        allowTime, dateFormat, timeFormat, tzFormat;
+
+    if (match) {
+        getParsingFlags(config).iso = true;
+
+        for (i = 0, l = isoDates.length; i < l; i++) {
+            if (isoDates[i][1].exec(match[1])) {
+                dateFormat = isoDates[i][0];
+                allowTime = isoDates[i][2] !== false;
+                break;
+            }
+        }
+        if (dateFormat == null) {
+            config._isValid = false;
+            return;
+        }
+        if (match[3]) {
+            for (i = 0, l = isoTimes.length; i < l; i++) {
+                if (isoTimes[i][1].exec(match[3])) {
+                    // match[2] should be 'T' or space
+                    timeFormat = (match[2] || ' ') + isoTimes[i][0];
+                    break;
+                }
+            }
+            if (timeFormat == null) {
+                config._isValid = false;
+                return;
+            }
+        }
+        if (!allowTime && timeFormat != null) {
+            config._isValid = false;
+            return;
+        }
+        if (match[4]) {
+            if (tzRegex.exec(match[4])) {
+                tzFormat = 'Z';
+            } else {
+                config._isValid = false;
+                return;
+            }
+        }
+        config._f = dateFormat + (timeFormat || '') + (tzFormat || '');
+        configFromStringAndFormat(config);
+    } else {
+        config._isValid = false;
+    }
+}
+
+// RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3
+var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;
+
+function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {
+    var result = [
+        untruncateYear(yearStr),
+        defaultLocaleMonthsShort.indexOf(monthStr),
+        parseInt(dayStr, 10),
+        parseInt(hourStr, 10),
+        parseInt(minuteStr, 10)
+    ];
+
+    if (secondStr) {
+        result.push(parseInt(secondStr, 10));
+    }
+
+    return result;
+}
+
+function untruncateYear(yearStr) {
+    var year = parseInt(yearStr, 10);
+    if (year <= 49) {
+        return 2000 + year;
+    } else if (year <= 999) {
+        return 1900 + year;
+    }
+    return year;
+}
+
+function preprocessRFC2822(s) {
+    // Remove comments and folding whitespace and replace multiple-spaces with a single space
+    return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').trim();
+}
+
+function checkWeekday(weekdayStr, parsedInput, config) {
+    if (weekdayStr) {
+        // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check.
+        var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),
+            weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();
+        if (weekdayProvided !== weekdayActual) {
+            getParsingFlags(config).weekdayMismatch = true;
+            config._isValid = false;
+            return false;
+        }
+    }
+    return true;
+}
+
+var obsOffsets = {
+    UT: 0,
+    GMT: 0,
+    EDT: -4 * 60,
+    EST: -5 * 60,
+    CDT: -5 * 60,
+    CST: -6 * 60,
+    MDT: -6 * 60,
+    MST: -7 * 60,
+    PDT: -7 * 60,
+    PST: -8 * 60
+};
+
+function calculateOffset(obsOffset, militaryOffset, numOffset) {
+    if (obsOffset) {
+        return obsOffsets[obsOffset];
+    } else if (militaryOffset) {
+        // the only allowed military tz is Z
+        return 0;
+    } else {
+        var hm = parseInt(numOffset, 10);
+        var m = hm % 100, h = (hm - m) / 100;
+        return h * 60 + m;
+    }
+}
+
+// date and time from ref 2822 format
+function configFromRFC2822(config) {
+    var match = rfc2822.exec(preprocessRFC2822(config._i));
+    if (match) {
+        var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);
+        if (!checkWeekday(match[1], parsedArray, config)) {
+            return;
+        }
+
+        config._a = parsedArray;
+        config._tzm = calculateOffset(match[8], match[9], match[10]);
+
+        config._d = createUTCDate.apply(null, config._a);
+        config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);
+
+        getParsingFlags(config).rfc2822 = true;
+    } else {
+        config._isValid = false;
+    }
+}
+
+// date from iso format or fallback
+function configFromString(config) {
+    var matched = aspNetJsonRegex.exec(config._i);
+
+    if (matched !== null) {
+        config._d = new Date(+matched[1]);
+        return;
+    }
+
+    configFromISO(config);
+    if (config._isValid === false) {
+        delete config._isValid;
+    } else {
+        return;
+    }
+
+    configFromRFC2822(config);
+    if (config._isValid === false) {
+        delete config._isValid;
+    } else {
+        return;
+    }
+
+    // Final attempt, use Input Fallback
+    hooks.createFromInputFallback(config);
+}
+
+hooks.createFromInputFallback = deprecate(
+    'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +
+    'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +
+    'discouraged and will be removed in an upcoming major release. Please refer to ' +
+    'http://momentjs.com/guides/#/warnings/js-date/ for more info.',
+    function (config) {
+        config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));
+    }
+);
+
+// constant that refers to the ISO standard
+hooks.ISO_8601 = function () {};
+
+// constant that refers to the RFC 2822 form
+hooks.RFC_2822 = function () {};
+
+// date from string and format string
+function configFromStringAndFormat(config) {
+    // TODO: Move this to another part of the creation flow to prevent circular deps
+    if (config._f === hooks.ISO_8601) {
+        configFromISO(config);
+        return;
+    }
+    if (config._f === hooks.RFC_2822) {
+        configFromRFC2822(config);
+        return;
+    }
+    config._a = [];
+    getParsingFlags(config).empty = true;
+
+    // This array is used to make a Date, either with `new Date` or `Date.UTC`
+    var string = '' + config._i,
+        i, parsedInput, tokens, token, skipped,
+        stringLength = string.length,
+        totalParsedInputLength = 0;
+
+    tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
+
+    for (i = 0; i < tokens.length; i++) {
+        token = tokens[i];
+        parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
+        // console.log('token', token, 'parsedInput', parsedInput,
+        //         'regex', getParseRegexForToken(token, config));
+        if (parsedInput) {
+            skipped = string.substr(0, string.indexOf(parsedInput));
+            if (skipped.length > 0) {
+                getParsingFlags(config).unusedInput.push(skipped);
+            }
+            string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+            totalParsedInputLength += parsedInput.length;
+        }
+        // don't parse if it's not a known token
+        if (formatTokenFunctions[token]) {
+            if (parsedInput) {
+                getParsingFlags(config).empty = false;
+            }
+            else {
+                getParsingFlags(config).unusedTokens.push(token);
+            }
+            addTimeToArrayFromToken(token, parsedInput, config);
+        }
+        else if (config._strict && !parsedInput) {
+            getParsingFlags(config).unusedTokens.push(token);
+        }
+    }
+
+    // add remaining unparsed input length to the string
+    getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;
+    if (string.length > 0) {
+        getParsingFlags(config).unusedInput.push(string);
+    }
+
+    // clear _12h flag if hour is <= 12
+    if (config._a[HOUR] <= 12 &&
+        getParsingFlags(config).bigHour === true &&
+        config._a[HOUR] > 0) {
+        getParsingFlags(config).bigHour = undefined;
+    }
+
+    getParsingFlags(config).parsedDateParts = config._a.slice(0);
+    getParsingFlags(config).meridiem = config._meridiem;
+    // handle meridiem
+    config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);
+
+    configFromArray(config);
+    checkOverflow(config);
+}
+
+
+function meridiemFixWrap (locale, hour, meridiem) {
+    var isPm;
+
+    if (meridiem == null) {
+        // nothing to do
+        return hour;
+    }
+    if (locale.meridiemHour != null) {
+        return locale.meridiemHour(hour, meridiem);
+    } else if (locale.isPM != null) {
+        // Fallback
+        isPm = locale.isPM(meridiem);
+        if (isPm && hour < 12) {
+            hour += 12;
+        }
+        if (!isPm && hour === 12) {
+            hour = 0;
+        }
+        return hour;
+    } else {
+        // this is not supposed to happen
+        return hour;
+    }
+}
+
+// date from string and array of format strings
+function configFromStringAndArray(config) {
+    var tempConfig,
+        bestMoment,
+
+        scoreToBeat,
+        i,
+        currentScore;
+
+    if (config._f.length === 0) {
+        getParsingFlags(config).invalidFormat = true;
+        config._d = new Date(NaN);
+        return;
+    }
+
+    for (i = 0; i < config._f.length; i++) {
+        currentScore = 0;
+        tempConfig = copyConfig({}, config);
+        if (config._useUTC != null) {
+            tempConfig._useUTC = config._useUTC;
+        }
+        tempConfig._f = config._f[i];
+        configFromStringAndFormat(tempConfig);
+
+        if (!isValid(tempConfig)) {
+            continue;
+        }
+
+        // if there is any input that was not parsed add a penalty for that format
+        currentScore += getParsingFlags(tempConfig).charsLeftOver;
+
+        //or tokens
+        currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;
+
+        getParsingFlags(tempConfig).score = currentScore;
+
+        if (scoreToBeat == null || currentScore < scoreToBeat) {
+            scoreToBeat = currentScore;
+            bestMoment = tempConfig;
+        }
+    }
+
+    extend(config, bestMoment || tempConfig);
+}
+
+function configFromObject(config) {
+    if (config._d) {
+        return;
+    }
+
+    var i = normalizeObjectUnits(config._i);
+    config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) {
+        return obj && parseInt(obj, 10);
+    });
+
+    configFromArray(config);
+}
+
+function createFromConfig (config) {
+    var res = new Moment(checkOverflow(prepareConfig(config)));
+    if (res._nextDay) {
+        // Adding is smart enough around DST
+        res.add(1, 'd');
+        res._nextDay = undefined;
+    }
+
+    return res;
+}
+
+function prepareConfig (config) {
+    var input = config._i,
+        format = config._f;
+
+    config._locale = config._locale || getLocale(config._l);
+
+    if (input === null || (format === undefined && input === '')) {
+        return createInvalid({nullInput: true});
+    }
+
+    if (typeof input === 'string') {
+        config._i = input = config._locale.preparse(input);
+    }
+
+    if (isMoment(input)) {
+        return new Moment(checkOverflow(input));
+    } else if (isDate(input)) {
+        config._d = input;
+    } else if (isArray(format)) {
+        configFromStringAndArray(config);
+    } else if (format) {
+        configFromStringAndFormat(config);
+    }  else {
+        configFromInput(config);
+    }
+
+    if (!isValid(config)) {
+        config._d = null;
+    }
+
+    return config;
+}
+
+function configFromInput(config) {
+    var input = config._i;
+    if (isUndefined(input)) {
+        config._d = new Date(hooks.now());
+    } else if (isDate(input)) {
+        config._d = new Date(input.valueOf());
+    } else if (typeof input === 'string') {
+        configFromString(config);
+    } else if (isArray(input)) {
+        config._a = map(input.slice(0), function (obj) {
+            return parseInt(obj, 10);
+        });
+        configFromArray(config);
+    } else if (isObject(input)) {
+        configFromObject(config);
+    } else if (isNumber(input)) {
+        // from milliseconds
+        config._d = new Date(input);
+    } else {
+        hooks.createFromInputFallback(config);
+    }
+}
+
+function createLocalOrUTC (input, format, locale, strict, isUTC) {
+    var c = {};
+
+    if (locale === true || locale === false) {
+        strict = locale;
+        locale = undefined;
+    }
+
+    if ((isObject(input) && isObjectEmpty(input)) ||
+            (isArray(input) && input.length === 0)) {
+        input = undefined;
+    }
+    // object construction must be done this way.
+    // https://github.com/moment/moment/issues/1423
+    c._isAMomentObject = true;
+    c._useUTC = c._isUTC = isUTC;
+    c._l = locale;
+    c._i = input;
+    c._f = format;
+    c._strict = strict;
+
+    return createFromConfig(c);
+}
+
+function createLocal (input, format, locale, strict) {
+    return createLocalOrUTC(input, format, locale, strict, false);
+}
+
+var prototypeMin = deprecate(
+    'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
+    function () {
+        var other = createLocal.apply(null, arguments);
+        if (this.isValid() && other.isValid()) {
+            return other < this ? this : other;
+        } else {
+            return createInvalid();
+        }
+    }
+);
+
+var prototypeMax = deprecate(
+    'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
+    function () {
+        var other = createLocal.apply(null, arguments);
+        if (this.isValid() && other.isValid()) {
+            return other > this ? this : other;
+        } else {
+            return createInvalid();
+        }
+    }
+);
+
+// Pick a moment m from moments so that m[fn](other) is true for all
+// other. This relies on the function fn to be transitive.
+//
+// moments should either be an array of moment objects or an array, whose
+// first element is an array of moment objects.
+function pickBy(fn, moments) {
+    var res, i;
+    if (moments.length === 1 && isArray(moments[0])) {
+        moments = moments[0];
+    }
+    if (!moments.length) {
+        return createLocal();
+    }
+    res = moments[0];
+    for (i = 1; i < moments.length; ++i) {
+        if (!moments[i].isValid() || moments[i][fn](res)) {
+            res = moments[i];
+        }
+    }
+    return res;
+}
+
+// TODO: Use [].sort instead?
+function min () {
+    var args = [].slice.call(arguments, 0);
+
+    return pickBy('isBefore', args);
+}
+
+function max () {
+    var args = [].slice.call(arguments, 0);
+
+    return pickBy('isAfter', args);
+}
+
+var now = function () {
+    return Date.now ? Date.now() : +(new Date());
+};
+
+var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];
+
+function isDurationValid(m) {
+    for (var key in m) {
+        if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {
+            return false;
+        }
+    }
+
+    var unitHasDecimal = false;
+    for (var i = 0; i < ordering.length; ++i) {
+        if (m[ordering[i]]) {
+            if (unitHasDecimal) {
+                return false; // only allow non-integers for smallest unit
+            }
+            if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {
+                unitHasDecimal = true;
+            }
+        }
+    }
+
+    return true;
+}
+
+function isValid$1() {
+    return this._isValid;
+}
+
+function createInvalid$1() {
+    return createDuration(NaN);
+}
+
+function Duration (duration) {
+    var normalizedInput = normalizeObjectUnits(duration),
+        years = normalizedInput.year || 0,
+        quarters = normalizedInput.quarter || 0,
+        months = normalizedInput.month || 0,
+        weeks = normalizedInput.week || 0,
+        days = normalizedInput.day || 0,
+        hours = normalizedInput.hour || 0,
+        minutes = normalizedInput.minute || 0,
+        seconds = normalizedInput.second || 0,
+        milliseconds = normalizedInput.millisecond || 0;
+
+    this._isValid = isDurationValid(normalizedInput);
+
+    // representation for dateAddRemove
+    this._milliseconds = +milliseconds +
+        seconds * 1e3 + // 1000
+        minutes * 6e4 + // 1000 * 60
+        hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978
+    // Because of dateAddRemove treats 24 hours as different from a
+    // day when working around DST, we need to store them separately
+    this._days = +days +
+        weeks * 7;
+    // It is impossible to translate months into days without knowing
+    // which months you are are talking about, so we have to store
+    // it separately.
+    this._months = +months +
+        quarters * 3 +
+        years * 12;
+
+    this._data = {};
+
+    this._locale = getLocale();
+
+    this._bubble();
+}
+
+function isDuration (obj) {
+    return obj instanceof Duration;
+}
+
+function absRound (number) {
+    if (number < 0) {
+        return Math.round(-1 * number) * -1;
+    } else {
+        return Math.round(number);
+    }
+}
+
+// FORMATTING
+
+function offset (token, separator) {
+    addFormatToken(token, 0, 0, function () {
+        var offset = this.utcOffset();
+        var sign = '+';
+        if (offset < 0) {
+            offset = -offset;
+            sign = '-';
+        }
+        return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2);
+    });
+}
+
+offset('Z', ':');
+offset('ZZ', '');
+
+// PARSING
+
+addRegexToken('Z',  matchShortOffset);
+addRegexToken('ZZ', matchShortOffset);
+addParseToken(['Z', 'ZZ'], function (input, array, config) {
+    config._useUTC = true;
+    config._tzm = offsetFromString(matchShortOffset, input);
+});
+
+// HELPERS
+
+// timezone chunker
+// '+10:00' > ['10',  '00']
+// '-1530'  > ['-15', '30']
+var chunkOffset = /([\+\-]|\d\d)/gi;
+
+function offsetFromString(matcher, string) {
+    var matches = (string || '').match(matcher);
+
+    if (matches === null) {
+        return null;
+    }
+
+    var chunk   = matches[matches.length - 1] || [];
+    var parts   = (chunk + '').match(chunkOffset) || ['-', 0, 0];
+    var minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+    return minutes === 0 ?
+      0 :
+      parts[0] === '+' ? minutes : -minutes;
+}
+
+// Return a moment from input, that is local/utc/zone equivalent to model.
+function cloneWithOffset(input, model) {
+    var res, diff;
+    if (model._isUTC) {
+        res = model.clone();
+        diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();
+        // Use low-level api, because this fn is low-level api.
+        res._d.setTime(res._d.valueOf() + diff);
+        hooks.updateOffset(res, false);
+        return res;
+    } else {
+        return createLocal(input).local();
+    }
+}
+
+function getDateOffset (m) {
+    // On Firefox.24 Date#getTimezoneOffset returns a floating point.
+    // https://github.com/moment/moment/pull/1871
+    return -Math.round(m._d.getTimezoneOffset() / 15) * 15;
+}
+
+// HOOKS
+
+// This function will be called whenever a moment is mutated.
+// It is intended to keep the offset in sync with the timezone.
+hooks.updateOffset = function () {};
+
+// MOMENTS
+
+// keepLocalTime = true means only change the timezone, without
+// affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->
+// 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset
+// +0200, so we adjust the time as needed, to be valid.
+//
+// Keeping the time actually adds/subtracts (one hour)
+// from the actual represented time. That is why we call updateOffset
+// a second time. In case it wants us to change the offset again
+// _changeInProgress == true case, then we have to adjust, because
+// there is no such time in the given timezone.
+function getSetOffset (input, keepLocalTime, keepMinutes) {
+    var offset = this._offset || 0,
+        localAdjust;
+    if (!this.isValid()) {
+        return input != null ? this : NaN;
+    }
+    if (input != null) {
+        if (typeof input === 'string') {
+            input = offsetFromString(matchShortOffset, input);
+            if (input === null) {
+                return this;
+            }
+        } else if (Math.abs(input) < 16 && !keepMinutes) {
+            input = input * 60;
+        }
+        if (!this._isUTC && keepLocalTime) {
+            localAdjust = getDateOffset(this);
+        }
+        this._offset = input;
+        this._isUTC = true;
+        if (localAdjust != null) {
+            this.add(localAdjust, 'm');
+        }
+        if (offset !== input) {
+            if (!keepLocalTime || this._changeInProgress) {
+                addSubtract(this, createDuration(input - offset, 'm'), 1, false);
+            } else if (!this._changeInProgress) {
+                this._changeInProgress = true;
+                hooks.updateOffset(this, true);
+                this._changeInProgress = null;
+            }
+        }
+        return this;
+    } else {
+        return this._isUTC ? offset : getDateOffset(this);
+    }
+}
+
+function getSetZone (input, keepLocalTime) {
+    if (input != null) {
+        if (typeof input !== 'string') {
+            input = -input;
+        }
+
+        this.utcOffset(input, keepLocalTime);
+
+        return this;
+    } else {
+        return -this.utcOffset();
+    }
+}
+
+function setOffsetToUTC (keepLocalTime) {
+    return this.utcOffset(0, keepLocalTime);
+}
+
+function setOffsetToLocal (keepLocalTime) {
+    if (this._isUTC) {
+        this.utcOffset(0, keepLocalTime);
+        this._isUTC = false;
+
+        if (keepLocalTime) {
+            this.subtract(getDateOffset(this), 'm');
+        }
+    }
+    return this;
+}
+
+function setOffsetToParsedOffset () {
+    if (this._tzm != null) {
+        this.utcOffset(this._tzm, false, true);
+    } else if (typeof this._i === 'string') {
+        var tZone = offsetFromString(matchOffset, this._i);
+        if (tZone != null) {
+            this.utcOffset(tZone);
+        }
+        else {
+            this.utcOffset(0, true);
+        }
+    }
+    return this;
+}
+
+function hasAlignedHourOffset (input) {
+    if (!this.isValid()) {
+        return false;
+    }
+    input = input ? createLocal(input).utcOffset() : 0;
+
+    return (this.utcOffset() - input) % 60 === 0;
+}
+
+function isDaylightSavingTime () {
+    return (
+        this.utcOffset() > this.clone().month(0).utcOffset() ||
+        this.utcOffset() > this.clone().month(5).utcOffset()
+    );
+}
+
+function isDaylightSavingTimeShifted () {
+    if (!isUndefined(this._isDSTShifted)) {
+        return this._isDSTShifted;
+    }
+
+    var c = {};
+
+    copyConfig(c, this);
+    c = prepareConfig(c);
+
+    if (c._a) {
+        var other = c._isUTC ? createUTC(c._a) : createLocal(c._a);
+        this._isDSTShifted = this.isValid() &&
+            compareArrays(c._a, other.toArray()) > 0;
+    } else {
+        this._isDSTShifted = false;
+    }
+
+    return this._isDSTShifted;
+}
+
+function isLocal () {
+    return this.isValid() ? !this._isUTC : false;
+}
+
+function isUtcOffset () {
+    return this.isValid() ? this._isUTC : false;
+}
+
+function isUtc () {
+    return this.isValid() ? this._isUTC && this._offset === 0 : false;
+}
+
+// ASP.NET json date format regex
+var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/;
+
+// from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+// somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+// and further modified to allow for strings containing both week and day
+var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
+
+function createDuration (input, key) {
+    var duration = input,
+        // matching against regexp is expensive, do it on demand
+        match = null,
+        sign,
+        ret,
+        diffRes;
+
+    if (isDuration(input)) {
+        duration = {
+            ms : input._milliseconds,
+            d  : input._days,
+            M  : input._months
+        };
+    } else if (isNumber(input)) {
+        duration = {};
+        if (key) {
+            duration[key] = input;
+        } else {
+            duration.milliseconds = input;
+        }
+    } else if (!!(match = aspNetRegex.exec(input))) {
+        sign = (match[1] === '-') ? -1 : 1;
+        duration = {
+            y  : 0,
+            d  : toInt(match[DATE])                         * sign,
+            h  : toInt(match[HOUR])                         * sign,
+            m  : toInt(match[MINUTE])                       * sign,
+            s  : toInt(match[SECOND])                       * sign,
+            ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match
+        };
+    } else if (!!(match = isoRegex.exec(input))) {
+        sign = (match[1] === '-') ? -1 : (match[1] === '+') ? 1 : 1;
+        duration = {
+            y : parseIso(match[2], sign),
+            M : parseIso(match[3], sign),
+            w : parseIso(match[4], sign),
+            d : parseIso(match[5], sign),
+            h : parseIso(match[6], sign),
+            m : parseIso(match[7], sign),
+            s : parseIso(match[8], sign)
+        };
+    } else if (duration == null) {// checks for null or undefined
+        duration = {};
+    } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {
+        diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));
+
+        duration = {};
+        duration.ms = diffRes.milliseconds;
+        duration.M = diffRes.months;
+    }
+
+    ret = new Duration(duration);
+
+    if (isDuration(input) && hasOwnProp(input, '_locale')) {
+        ret._locale = input._locale;
+    }
+
+    return ret;
+}
+
+createDuration.fn = Duration.prototype;
+createDuration.invalid = createInvalid$1;
+
+function parseIso (inp, sign) {
+    // We'd normally use ~~inp for this, but unfortunately it also
+    // converts floats to ints.
+    // inp may be undefined, so careful calling replace on it.
+    var res = inp && parseFloat(inp.replace(',', '.'));
+    // apply sign while we're at it
+    return (isNaN(res) ? 0 : res) * sign;
+}
+
+function positiveMomentsDifference(base, other) {
+    var res = {milliseconds: 0, months: 0};
+
+    res.months = other.month() - base.month() +
+        (other.year() - base.year()) * 12;
+    if (base.clone().add(res.months, 'M').isAfter(other)) {
+        --res.months;
+    }
+
+    res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
+
+    return res;
+}
+
+function momentsDifference(base, other) {
+    var res;
+    if (!(base.isValid() && other.isValid())) {
+        return {milliseconds: 0, months: 0};
+    }
+
+    other = cloneWithOffset(other, base);
+    if (base.isBefore(other)) {
+        res = positiveMomentsDifference(base, other);
+    } else {
+        res = positiveMomentsDifference(other, base);
+        res.milliseconds = -res.milliseconds;
+        res.months = -res.months;
+    }
+
+    return res;
+}
+
+// TODO: remove 'name' arg after deprecation is removed
+function createAdder(direction, name) {
+    return function (val, period) {
+        var dur, tmp;
+        //invert the arguments, but complain about it
+        if (period !== null && !isNaN(+period)) {
+            deprecateSimple(name, 'moment().' + name  + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' +
+            'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');
+            tmp = val; val = period; period = tmp;
+        }
+
+        val = typeof val === 'string' ? +val : val;
+        dur = createDuration(val, period);
+        addSubtract(this, dur, direction);
+        return this;
+    };
+}
+
+function addSubtract (mom, duration, isAdding, updateOffset) {
+    var milliseconds = duration._milliseconds,
+        days = absRound(duration._days),
+        months = absRound(duration._months);
+
+    if (!mom.isValid()) {
+        // No op
+        return;
+    }
+
+    updateOffset = updateOffset == null ? true : updateOffset;
+
+    if (months) {
+        setMonth(mom, get(mom, 'Month') + months * isAdding);
+    }
+    if (days) {
+        set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);
+    }
+    if (milliseconds) {
+        mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);
+    }
+    if (updateOffset) {
+        hooks.updateOffset(mom, days || months);
+    }
+}
+
+var add      = createAdder(1, 'add');
+var subtract = createAdder(-1, 'subtract');
+
+function getCalendarFormat(myMoment, now) {
+    var diff = myMoment.diff(now, 'days', true);
+    return diff < -6 ? 'sameElse' :
+            diff < -1 ? 'lastWeek' :
+            diff < 0 ? 'lastDay' :
+            diff < 1 ? 'sameDay' :
+            diff < 2 ? 'nextDay' :
+            diff < 7 ? 'nextWeek' : 'sameElse';
+}
+
+function calendar$1 (time, formats) {
+    // We want to compare the start of today, vs this.
+    // Getting start-of-today depends on whether we're local/utc/offset or not.
+    var now = time || createLocal(),
+        sod = cloneWithOffset(now, this).startOf('day'),
+        format = hooks.calendarFormat(this, sod) || 'sameElse';
+
+    var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);
+
+    return this.format(output || this.localeData().calendar(format, this, createLocal(now)));
+}
+
+function clone () {
+    return new Moment(this);
+}
+
+function isAfter (input, units) {
+    var localInput = isMoment(input) ? input : createLocal(input);
+    if (!(this.isValid() && localInput.isValid())) {
+        return false;
+    }
+    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+    if (units === 'millisecond') {
+        return this.valueOf() > localInput.valueOf();
+    } else {
+        return localInput.valueOf() < this.clone().startOf(units).valueOf();
+    }
+}
+
+function isBefore (input, units) {
+    var localInput = isMoment(input) ? input : createLocal(input);
+    if (!(this.isValid() && localInput.isValid())) {
+        return false;
+    }
+    units = normalizeUnits(!isUndefined(units) ? units : 'millisecond');
+    if (units === 'millisecond') {
+        return this.valueOf() < localInput.valueOf();
+    } else {
+        return this.clone().endOf(units).valueOf() < localInput.valueOf();
+    }
+}
+
+function isBetween (from, to, units, inclusivity) {
+    inclusivity = inclusivity || '()';
+    return (inclusivity[0] === '(' ? this.isAfter(from, units) : !this.isBefore(from, units)) &&
+        (inclusivity[1] === ')' ? this.isBefore(to, units) : !this.isAfter(to, units));
+}
+
+function isSame (input, units) {
+    var localInput = isMoment(input) ? input : createLocal(input),
+        inputMs;
+    if (!(this.isValid() && localInput.isValid())) {
+        return false;
+    }
+    units = normalizeUnits(units || 'millisecond');
+    if (units === 'millisecond') {
+        return this.valueOf() === localInput.valueOf();
+    } else {
+        inputMs = localInput.valueOf();
+        return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();
+    }
+}
+
+function isSameOrAfter (input, units) {
+    return this.isSame(input, units) || this.isAfter(input,units);
+}
+
+function isSameOrBefore (input, units) {
+    return this.isSame(input, units) || this.isBefore(input,units);
+}
+
+function diff (input, units, asFloat) {
+    var that,
+        zoneDelta,
+        delta, output;
+
+    if (!this.isValid()) {
+        return NaN;
+    }
+
+    that = cloneWithOffset(input, this);
+
+    if (!that.isValid()) {
+        return NaN;
+    }
+
+    zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;
+
+    units = normalizeUnits(units);
+
+    switch (units) {
+        case 'year': output = monthDiff(this, that) / 12; break;
+        case 'month': output = monthDiff(this, that); break;
+        case 'quarter': output = monthDiff(this, that) / 3; break;
+        case 'second': output = (this - that) / 1e3; break; // 1000
+        case 'minute': output = (this - that) / 6e4; break; // 1000 * 60
+        case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60
+        case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst
+        case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst
+        default: output = this - that;
+    }
+
+    return asFloat ? output : absFloor(output);
+}
+
+function monthDiff (a, b) {
+    // difference in months
+    var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()),
+        // b is in (anchor - 1 month, anchor + 1 month)
+        anchor = a.clone().add(wholeMonthDiff, 'months'),
+        anchor2, adjust;
+
+    if (b - anchor < 0) {
+        anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');
+        // linear across the month
+        adjust = (b - anchor) / (anchor - anchor2);
+    } else {
+        anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');
+        // linear across the month
+        adjust = (b - anchor) / (anchor2 - anchor);
+    }
+
+    //check for negative zero, return zero if negative zero
+    return -(wholeMonthDiff + adjust) || 0;
+}
+
+hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';
+hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
+
+function toString () {
+    return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
+}
+
+function toISOString(keepOffset) {
+    if (!this.isValid()) {
+        return null;
+    }
+    var utc = keepOffset !== true;
+    var m = utc ? this.clone().utc() : this;
+    if (m.year() < 0 || m.year() > 9999) {
+        return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');
+    }
+    if (isFunction(Date.prototype.toISOString)) {
+        // native implementation is ~50x faster, use it when we can
+        if (utc) {
+            return this.toDate().toISOString();
+        } else {
+            return new Date(this._d.valueOf()).toISOString().replace('Z', formatMoment(m, 'Z'));
+        }
+    }
+    return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');
+}
+
+/**
+ * Return a human readable representation of a moment that can
+ * also be evaluated to get a new moment which is the same
+ *
+ * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects
+ */
+function inspect () {
+    if (!this.isValid()) {
+        return 'moment.invalid(/* ' + this._i + ' */)';
+    }
+    var func = 'moment';
+    var zone = '';
+    if (!this.isLocal()) {
+        func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';
+        zone = 'Z';
+    }
+    var prefix = '[' + func + '("]';
+    var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY';
+    var datetime = '-MM-DD[T]HH:mm:ss.SSS';
+    var suffix = zone + '[")]';
+
+    return this.format(prefix + year + datetime + suffix);
+}
+
+function format (inputString) {
+    if (!inputString) {
+        inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;
+    }
+    var output = formatMoment(this, inputString);
+    return this.localeData().postformat(output);
+}
+
+function from (time, withoutSuffix) {
+    if (this.isValid() &&
+            ((isMoment(time) && time.isValid()) ||
+             createLocal(time).isValid())) {
+        return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
+    } else {
+        return this.localeData().invalidDate();
+    }
+}
+
+function fromNow (withoutSuffix) {
+    return this.from(createLocal(), withoutSuffix);
+}
+
+function to (time, withoutSuffix) {
+    if (this.isValid() &&
+            ((isMoment(time) && time.isValid()) ||
+             createLocal(time).isValid())) {
+        return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix);
+    } else {
+        return this.localeData().invalidDate();
+    }
+}
+
+function toNow (withoutSuffix) {
+    return this.to(createLocal(), withoutSuffix);
+}
+
+// If passed a locale key, it will set the locale for this
+// instance.  Otherwise, it will return the locale configuration
+// variables for this instance.
+function locale (key) {
+    var newLocaleData;
+
+    if (key === undefined) {
+        return this._locale._abbr;
+    } else {
+        newLocaleData = getLocale(key);
+        if (newLocaleData != null) {
+            this._locale = newLocaleData;
+        }
+        return this;
+    }
+}
+
+var lang = deprecate(
+    'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+    function (key) {
+        if (key === undefined) {
+            return this.localeData();
+        } else {
+            return this.locale(key);
+        }
+    }
+);
+
+function localeData () {
+    return this._locale;
+}
+
+function startOf (units) {
+    units = normalizeUnits(units);
+    // the following switch intentionally omits break keywords
+    // to utilize falling through the cases.
+    switch (units) {
+        case 'year':
+            this.month(0);
+            /* falls through */
+        case 'quarter':
+        case 'month':
+            this.date(1);
+            /* falls through */
+        case 'week':
+        case 'isoWeek':
+        case 'day':
+        case 'date':
+            this.hours(0);
+            /* falls through */
+        case 'hour':
+            this.minutes(0);
+            /* falls through */
+        case 'minute':
+            this.seconds(0);
+            /* falls through */
+        case 'second':
+            this.milliseconds(0);
+    }
+
+    // weeks are a special case
+    if (units === 'week') {
+        this.weekday(0);
+    }
+    if (units === 'isoWeek') {
+        this.isoWeekday(1);
+    }
+
+    // quarters are also special
+    if (units === 'quarter') {
+        this.month(Math.floor(this.month() / 3) * 3);
+    }
+
+    return this;
+}
+
+function endOf (units) {
+    units = normalizeUnits(units);
+    if (units === undefined || units === 'millisecond') {
+        return this;
+    }
+
+    // 'date' is an alias for 'day', so it should be considered as such.
+    if (units === 'date') {
+        units = 'day';
+    }
+
+    return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
+}
+
+function valueOf () {
+    return this._d.valueOf() - ((this._offset || 0) * 60000);
+}
+
+function unix () {
+    return Math.floor(this.valueOf() / 1000);
+}
+
+function toDate () {
+    return new Date(this.valueOf());
+}
+
+function toArray () {
+    var m = this;
+    return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];
+}
+
+function toObject () {
+    var m = this;
+    return {
+        years: m.year(),
+        months: m.month(),
+        date: m.date(),
+        hours: m.hours(),
+        minutes: m.minutes(),
+        seconds: m.seconds(),
+        milliseconds: m.milliseconds()
+    };
+}
+
+function toJSON () {
+    // new Date(NaN).toJSON() === null
+    return this.isValid() ? this.toISOString() : null;
+}
+
+function isValid$2 () {
+    return isValid(this);
+}
+
+function parsingFlags () {
+    return extend({}, getParsingFlags(this));
+}
+
+function invalidAt () {
+    return getParsingFlags(this).overflow;
+}
+
+function creationData() {
+    return {
+        input: this._i,
+        format: this._f,
+        locale: this._locale,
+        isUTC: this._isUTC,
+        strict: this._strict
+    };
+}
+
+// FORMATTING
+
+addFormatToken(0, ['gg', 2], 0, function () {
+    return this.weekYear() % 100;
+});
+
+addFormatToken(0, ['GG', 2], 0, function () {
+    return this.isoWeekYear() % 100;
+});
+
+function addWeekYearFormatToken (token, getter) {
+    addFormatToken(0, [token, token.length], 0, getter);
+}
+
+addWeekYearFormatToken('gggg',     'weekYear');
+addWeekYearFormatToken('ggggg',    'weekYear');
+addWeekYearFormatToken('GGGG',  'isoWeekYear');
+addWeekYearFormatToken('GGGGG', 'isoWeekYear');
+
+// ALIASES
+
+addUnitAlias('weekYear', 'gg');
+addUnitAlias('isoWeekYear', 'GG');
+
+// PRIORITY
+
+addUnitPriority('weekYear', 1);
+addUnitPriority('isoWeekYear', 1);
+
+
+// PARSING
+
+addRegexToken('G',      matchSigned);
+addRegexToken('g',      matchSigned);
+addRegexToken('GG',     match1to2, match2);
+addRegexToken('gg',     match1to2, match2);
+addRegexToken('GGGG',   match1to4, match4);
+addRegexToken('gggg',   match1to4, match4);
+addRegexToken('GGGGG',  match1to6, match6);
+addRegexToken('ggggg',  match1to6, match6);
+
+addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {
+    week[token.substr(0, 2)] = toInt(input);
+});
+
+addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {
+    week[token] = hooks.parseTwoDigitYear(input);
+});
+
+// MOMENTS
+
+function getSetWeekYear (input) {
+    return getSetWeekYearHelper.call(this,
+            input,
+            this.week(),
+            this.weekday(),
+            this.localeData()._week.dow,
+            this.localeData()._week.doy);
+}
+
+function getSetISOWeekYear (input) {
+    return getSetWeekYearHelper.call(this,
+            input, this.isoWeek(), this.isoWeekday(), 1, 4);
+}
+
+function getISOWeeksInYear () {
+    return weeksInYear(this.year(), 1, 4);
+}
+
+function getWeeksInYear () {
+    var weekInfo = this.localeData()._week;
+    return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
+}
+
+function getSetWeekYearHelper(input, week, weekday, dow, doy) {
+    var weeksTarget;
+    if (input == null) {
+        return weekOfYear(this, dow, doy).year;
+    } else {
+        weeksTarget = weeksInYear(input, dow, doy);
+        if (week > weeksTarget) {
+            week = weeksTarget;
+        }
+        return setWeekAll.call(this, input, week, weekday, dow, doy);
+    }
+}
+
+function setWeekAll(weekYear, week, weekday, dow, doy) {
+    var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),
+        date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);
+
+    this.year(date.getUTCFullYear());
+    this.month(date.getUTCMonth());
+    this.date(date.getUTCDate());
+    return this;
+}
+
+// FORMATTING
+
+addFormatToken('Q', 0, 'Qo', 'quarter');
+
+// ALIASES
+
+addUnitAlias('quarter', 'Q');
+
+// PRIORITY
+
+addUnitPriority('quarter', 7);
+
+// PARSING
+
+addRegexToken('Q', match1);
+addParseToken('Q', function (input, array) {
+    array[MONTH] = (toInt(input) - 1) * 3;
+});
+
+// MOMENTS
+
+function getSetQuarter (input) {
+    return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
+}
+
+// FORMATTING
+
+addFormatToken('D', ['DD', 2], 'Do', 'date');
+
+// ALIASES
+
+addUnitAlias('date', 'D');
+
+// PRIOROITY
+addUnitPriority('date', 9);
+
+// PARSING
+
+addRegexToken('D',  match1to2);
+addRegexToken('DD', match1to2, match2);
+addRegexToken('Do', function (isStrict, locale) {
+    // TODO: Remove "ordinalParse" fallback in next major release.
+    return isStrict ?
+      (locale._dayOfMonthOrdinalParse || locale._ordinalParse) :
+      locale._dayOfMonthOrdinalParseLenient;
+});
+
+addParseToken(['D', 'DD'], DATE);
+addParseToken('Do', function (input, array) {
+    array[DATE] = toInt(input.match(match1to2)[0]);
+});
+
+// MOMENTS
+
+var getSetDayOfMonth = makeGetSet('Date', true);
+
+// FORMATTING
+
+addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
+
+// ALIASES
+
+addUnitAlias('dayOfYear', 'DDD');
+
+// PRIORITY
+addUnitPriority('dayOfYear', 4);
+
+// PARSING
+
+addRegexToken('DDD',  match1to3);
+addRegexToken('DDDD', match3);
+addParseToken(['DDD', 'DDDD'], function (input, array, config) {
+    config._dayOfYear = toInt(input);
+});
+
+// HELPERS
+
+// MOMENTS
+
+function getSetDayOfYear (input) {
+    var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+    return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
+}
+
+// FORMATTING
+
+addFormatToken('m', ['mm', 2], 0, 'minute');
+
+// ALIASES
+
+addUnitAlias('minute', 'm');
+
+// PRIORITY
+
+addUnitPriority('minute', 14);
+
+// PARSING
+
+addRegexToken('m',  match1to2);
+addRegexToken('mm', match1to2, match2);
+addParseToken(['m', 'mm'], MINUTE);
+
+// MOMENTS
+
+var getSetMinute = makeGetSet('Minutes', false);
+
+// FORMATTING
+
+addFormatToken('s', ['ss', 2], 0, 'second');
+
+// ALIASES
+
+addUnitAlias('second', 's');
+
+// PRIORITY
+
+addUnitPriority('second', 15);
+
+// PARSING
+
+addRegexToken('s',  match1to2);
+addRegexToken('ss', match1to2, match2);
+addParseToken(['s', 'ss'], SECOND);
+
+// MOMENTS
+
+var getSetSecond = makeGetSet('Seconds', false);
+
+// FORMATTING
+
+addFormatToken('S', 0, 0, function () {
+    return ~~(this.millisecond() / 100);
+});
+
+addFormatToken(0, ['SS', 2], 0, function () {
+    return ~~(this.millisecond() / 10);
+});
+
+addFormatToken(0, ['SSS', 3], 0, 'millisecond');
+addFormatToken(0, ['SSSS', 4], 0, function () {
+    return this.millisecond() * 10;
+});
+addFormatToken(0, ['SSSSS', 5], 0, function () {
+    return this.millisecond() * 100;
+});
+addFormatToken(0, ['SSSSSS', 6], 0, function () {
+    return this.millisecond() * 1000;
+});
+addFormatToken(0, ['SSSSSSS', 7], 0, function () {
+    return this.millisecond() * 10000;
+});
+addFormatToken(0, ['SSSSSSSS', 8], 0, function () {
+    return this.millisecond() * 100000;
+});
+addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
+    return this.millisecond() * 1000000;
+});
+
+
+// ALIASES
+
+addUnitAlias('millisecond', 'ms');
+
+// PRIORITY
+
+addUnitPriority('millisecond', 16);
+
+// PARSING
+
+addRegexToken('S',    match1to3, match1);
+addRegexToken('SS',   match1to3, match2);
+addRegexToken('SSS',  match1to3, match3);
+
+var token;
+for (token = 'SSSS'; token.length <= 9; token += 'S') {
+    addRegexToken(token, matchUnsigned);
+}
+
+function parseMs(input, array) {
+    array[MILLISECOND] = toInt(('0.' + input) * 1000);
+}
+
+for (token = 'S'; token.length <= 9; token += 'S') {
+    addParseToken(token, parseMs);
+}
+// MOMENTS
+
+var getSetMillisecond = makeGetSet('Milliseconds', false);
+
+// FORMATTING
+
+addFormatToken('z',  0, 0, 'zoneAbbr');
+addFormatToken('zz', 0, 0, 'zoneName');
+
+// MOMENTS
+
+function getZoneAbbr () {
+    return this._isUTC ? 'UTC' : '';
+}
+
+function getZoneName () {
+    return this._isUTC ? 'Coordinated Universal Time' : '';
+}
+
+var proto = Moment.prototype;
+
+proto.add               = add;
+proto.calendar          = calendar$1;
+proto.clone             = clone;
+proto.diff              = diff;
+proto.endOf             = endOf;
+proto.format            = format;
+proto.from              = from;
+proto.fromNow           = fromNow;
+proto.to                = to;
+proto.toNow             = toNow;
+proto.get               = stringGet;
+proto.invalidAt         = invalidAt;
+proto.isAfter           = isAfter;
+proto.isBefore          = isBefore;
+proto.isBetween         = isBetween;
+proto.isSame            = isSame;
+proto.isSameOrAfter     = isSameOrAfter;
+proto.isSameOrBefore    = isSameOrBefore;
+proto.isValid           = isValid$2;
+proto.lang              = lang;
+proto.locale            = locale;
+proto.localeData        = localeData;
+proto.max               = prototypeMax;
+proto.min               = prototypeMin;
+proto.parsingFlags      = parsingFlags;
+proto.set               = stringSet;
+proto.startOf           = startOf;
+proto.subtract          = subtract;
+proto.toArray           = toArray;
+proto.toObject          = toObject;
+proto.toDate            = toDate;
+proto.toISOString       = toISOString;
+proto.inspect           = inspect;
+proto.toJSON            = toJSON;
+proto.toString          = toString;
+proto.unix              = unix;
+proto.valueOf           = valueOf;
+proto.creationData      = creationData;
+
+// Year
+proto.year       = getSetYear;
+proto.isLeapYear = getIsLeapYear;
+
+// Week Year
+proto.weekYear    = getSetWeekYear;
+proto.isoWeekYear = getSetISOWeekYear;
+
+// Quarter
+proto.quarter = proto.quarters = getSetQuarter;
+
+// Month
+proto.month       = getSetMonth;
+proto.daysInMonth = getDaysInMonth;
+
+// Week
+proto.week           = proto.weeks        = getSetWeek;
+proto.isoWeek        = proto.isoWeeks     = getSetISOWeek;
+proto.weeksInYear    = getWeeksInYear;
+proto.isoWeeksInYear = getISOWeeksInYear;
+
+// Day
+proto.date       = getSetDayOfMonth;
+proto.day        = proto.days             = getSetDayOfWeek;
+proto.weekday    = getSetLocaleDayOfWeek;
+proto.isoWeekday = getSetISODayOfWeek;
+proto.dayOfYear  = getSetDayOfYear;
+
+// Hour
+proto.hour = proto.hours = getSetHour;
+
+// Minute
+proto.minute = proto.minutes = getSetMinute;
+
+// Second
+proto.second = proto.seconds = getSetSecond;
+
+// Millisecond
+proto.millisecond = proto.milliseconds = getSetMillisecond;
+
+// Offset
+proto.utcOffset            = getSetOffset;
+proto.utc                  = setOffsetToUTC;
+proto.local                = setOffsetToLocal;
+proto.parseZone            = setOffsetToParsedOffset;
+proto.hasAlignedHourOffset = hasAlignedHourOffset;
+proto.isDST                = isDaylightSavingTime;
+proto.isLocal              = isLocal;
+proto.isUtcOffset          = isUtcOffset;
+proto.isUtc                = isUtc;
+proto.isUTC                = isUtc;
+
+// Timezone
+proto.zoneAbbr = getZoneAbbr;
+proto.zoneName = getZoneName;
+
+// Deprecations
+proto.dates  = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);
+proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);
+proto.years  = deprecate('years accessor is deprecated. Use year instead', getSetYear);
+proto.zone   = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);
+proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);
+
+function createUnix (input) {
+    return createLocal(input * 1000);
+}
+
+function createInZone () {
+    return createLocal.apply(null, arguments).parseZone();
+}
+
+function preParsePostFormat (string) {
+    return string;
+}
+
+var proto$1 = Locale.prototype;
+
+proto$1.calendar        = calendar;
+proto$1.longDateFormat  = longDateFormat;
+proto$1.invalidDate     = invalidDate;
+proto$1.ordinal         = ordinal;
+proto$1.preparse        = preParsePostFormat;
+proto$1.postformat      = preParsePostFormat;
+proto$1.relativeTime    = relativeTime;
+proto$1.pastFuture      = pastFuture;
+proto$1.set             = set;
+
+// Month
+proto$1.months            =        localeMonths;
+proto$1.monthsShort       =        localeMonthsShort;
+proto$1.monthsParse       =        localeMonthsParse;
+proto$1.monthsRegex       = monthsRegex;
+proto$1.monthsShortRegex  = monthsShortRegex;
+
+// Week
+proto$1.week = localeWeek;
+proto$1.firstDayOfYear = localeFirstDayOfYear;
+proto$1.firstDayOfWeek = localeFirstDayOfWeek;
+
+// Day of Week
+proto$1.weekdays       =        localeWeekdays;
+proto$1.weekdaysMin    =        localeWeekdaysMin;
+proto$1.weekdaysShort  =        localeWeekdaysShort;
+proto$1.weekdaysParse  =        localeWeekdaysParse;
+
+proto$1.weekdaysRegex       =        weekdaysRegex;
+proto$1.weekdaysShortRegex  =        weekdaysShortRegex;
+proto$1.weekdaysMinRegex    =        weekdaysMinRegex;
+
+// Hours
+proto$1.isPM = localeIsPM;
+proto$1.meridiem = localeMeridiem;
+
+function get$1 (format, index, field, setter) {
+    var locale = getLocale();
+    var utc = createUTC().set(setter, index);
+    return locale[field](utc, format);
+}
+
+function listMonthsImpl (format, index, field) {
+    if (isNumber(format)) {
+        index = format;
+        format = undefined;
+    }
+
+    format = format || '';
+
+    if (index != null) {
+        return get$1(format, index, field, 'month');
+    }
+
+    var i;
+    var out = [];
+    for (i = 0; i < 12; i++) {
+        out[i] = get$1(format, i, field, 'month');
+    }
+    return out;
+}
+
+// ()
+// (5)
+// (fmt, 5)
+// (fmt)
+// (true)
+// (true, 5)
+// (true, fmt, 5)
+// (true, fmt)
+function listWeekdaysImpl (localeSorted, format, index, field) {
+    if (typeof localeSorted === 'boolean') {
+        if (isNumber(format)) {
+            index = format;
+            format = undefined;
+        }
+
+        format = format || '';
+    } else {
+        format = localeSorted;
+        index = format;
+        localeSorted = false;
+
+        if (isNumber(format)) {
+            index = format;
+            format = undefined;
+        }
+
+        format = format || '';
+    }
+
+    var locale = getLocale(),
+        shift = localeSorted ? locale._week.dow : 0;
+
+    if (index != null) {
+        return get$1(format, (index + shift) % 7, field, 'day');
+    }
+
+    var i;
+    var out = [];
+    for (i = 0; i < 7; i++) {
+        out[i] = get$1(format, (i + shift) % 7, field, 'day');
+    }
+    return out;
+}
+
+function listMonths (format, index) {
+    return listMonthsImpl(format, index, 'months');
+}
+
+function listMonthsShort (format, index) {
+    return listMonthsImpl(format, index, 'monthsShort');
+}
+
+function listWeekdays (localeSorted, format, index) {
+    return listWeekdaysImpl(localeSorted, format, index, 'weekdays');
+}
+
+function listWeekdaysShort (localeSorted, format, index) {
+    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');
+}
+
+function listWeekdaysMin (localeSorted, format, index) {
+    return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');
+}
+
+getSetGlobalLocale('en', {
+    dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
+    ordinal : function (number) {
+        var b = number % 10,
+            output = (toInt(number % 100 / 10) === 1) ? 'th' :
+            (b === 1) ? 'st' :
+            (b === 2) ? 'nd' :
+            (b === 3) ? 'rd' : 'th';
+        return number + output;
+    }
+});
+
+// Side effect imports
+hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);
+hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);
+
+var mathAbs = Math.abs;
+
+function abs () {
+    var data           = this._data;
+
+    this._milliseconds = mathAbs(this._milliseconds);
+    this._days         = mathAbs(this._days);
+    this._months       = mathAbs(this._months);
+
+    data.milliseconds  = mathAbs(data.milliseconds);
+    data.seconds       = mathAbs(data.seconds);
+    data.minutes       = mathAbs(data.minutes);
+    data.hours         = mathAbs(data.hours);
+    data.months        = mathAbs(data.months);
+    data.years         = mathAbs(data.years);
+
+    return this;
+}
+
+function addSubtract$1 (duration, input, value, direction) {
+    var other = createDuration(input, value);
+
+    duration._milliseconds += direction * other._milliseconds;
+    duration._days         += direction * other._days;
+    duration._months       += direction * other._months;
+
+    return duration._bubble();
+}
+
+// supports only 2.0-style add(1, 's') or add(duration)
+function add$1 (input, value) {
+    return addSubtract$1(this, input, value, 1);
+}
+
+// supports only 2.0-style subtract(1, 's') or subtract(duration)
+function subtract$1 (input, value) {
+    return addSubtract$1(this, input, value, -1);
+}
+
+function absCeil (number) {
+    if (number < 0) {
+        return Math.floor(number);
+    } else {
+        return Math.ceil(number);
+    }
+}
+
+function bubble () {
+    var milliseconds = this._milliseconds;
+    var days         = this._days;
+    var months       = this._months;
+    var data         = this._data;
+    var seconds, minutes, hours, years, monthsFromDays;
+
+    // if we have a mix of positive and negative values, bubble down first
+    // check: https://github.com/moment/moment/issues/2166
+    if (!((milliseconds >= 0 && days >= 0 && months >= 0) ||
+            (milliseconds <= 0 && days <= 0 && months <= 0))) {
+        milliseconds += absCeil(monthsToDays(months) + days) * 864e5;
+        days = 0;
+        months = 0;
+    }
+
+    // The following code bubbles up values, see the tests for
+    // examples of what that means.
+    data.milliseconds = milliseconds % 1000;
+
+    seconds           = absFloor(milliseconds / 1000);
+    data.seconds      = seconds % 60;
+
+    minutes           = absFloor(seconds / 60);
+    data.minutes      = minutes % 60;
+
+    hours             = absFloor(minutes / 60);
+    data.hours        = hours % 24;
+
+    days += absFloor(hours / 24);
+
+    // convert days to months
+    monthsFromDays = absFloor(daysToMonths(days));
+    months += monthsFromDays;
+    days -= absCeil(monthsToDays(monthsFromDays));
+
+    // 12 months -> 1 year
+    years = absFloor(months / 12);
+    months %= 12;
+
+    data.days   = days;
+    data.months = months;
+    data.years  = years;
+
+    return this;
+}
+
+function daysToMonths (days) {
+    // 400 years have 146097 days (taking into account leap year rules)
+    // 400 years have 12 months === 4800
+    return days * 4800 / 146097;
+}
+
+function monthsToDays (months) {
+    // the reverse of daysToMonths
+    return months * 146097 / 4800;
+}
+
+function as (units) {
+    if (!this.isValid()) {
+        return NaN;
+    }
+    var days;
+    var months;
+    var milliseconds = this._milliseconds;
+
+    units = normalizeUnits(units);
+
+    if (units === 'month' || units === 'year') {
+        days   = this._days   + milliseconds / 864e5;
+        months = this._months + daysToMonths(days);
+        return units === 'month' ? months : months / 12;
+    } else {
+        // handle milliseconds separately because of floating point math errors (issue #1867)
+        days = this._days + Math.round(monthsToDays(this._months));
+        switch (units) {
+            case 'week'   : return days / 7     + milliseconds / 6048e5;
+            case 'day'    : return days         + milliseconds / 864e5;
+            case 'hour'   : return days * 24    + milliseconds / 36e5;
+            case 'minute' : return days * 1440  + milliseconds / 6e4;
+            case 'second' : return days * 86400 + milliseconds / 1000;
+            // Math.floor prevents floating point math errors here
+            case 'millisecond': return Math.floor(days * 864e5) + milliseconds;
+            default: throw new Error('Unknown unit ' + units);
+        }
+    }
+}
+
+// TODO: Use this.as('ms')?
+function valueOf$1 () {
+    if (!this.isValid()) {
+        return NaN;
+    }
+    return (
+        this._milliseconds +
+        this._days * 864e5 +
+        (this._months % 12) * 2592e6 +
+        toInt(this._months / 12) * 31536e6
+    );
+}
+
+function makeAs (alias) {
+    return function () {
+        return this.as(alias);
+    };
+}
+
+var asMilliseconds = makeAs('ms');
+var asSeconds      = makeAs('s');
+var asMinutes      = makeAs('m');
+var asHours        = makeAs('h');
+var asDays         = makeAs('d');
+var asWeeks        = makeAs('w');
+var asMonths       = makeAs('M');
+var asYears        = makeAs('y');
+
+function clone$1 () {
+    return createDuration(this);
+}
+
+function get$2 (units) {
+    units = normalizeUnits(units);
+    return this.isValid() ? this[units + 's']() : NaN;
+}
+
+function makeGetter(name) {
+    return function () {
+        return this.isValid() ? this._data[name] : NaN;
+    };
+}
+
+var milliseconds = makeGetter('milliseconds');
+var seconds      = makeGetter('seconds');
+var minutes      = makeGetter('minutes');
+var hours        = makeGetter('hours');
+var days         = makeGetter('days');
+var months       = makeGetter('months');
+var years        = makeGetter('years');
+
+function weeks () {
+    return absFloor(this.days() / 7);
+}
+
+var round = Math.round;
+var thresholds = {
+    ss: 44,         // a few seconds to seconds
+    s : 45,         // seconds to minute
+    m : 45,         // minutes to hour
+    h : 22,         // hours to day
+    d : 26,         // days to month
+    M : 11          // months to year
+};
+
+// helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
+    return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+}
+
+function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
+    var duration = createDuration(posNegDuration).abs();
+    var seconds  = round(duration.as('s'));
+    var minutes  = round(duration.as('m'));
+    var hours    = round(duration.as('h'));
+    var days     = round(duration.as('d'));
+    var months   = round(duration.as('M'));
+    var years    = round(duration.as('y'));
+
+    var a = seconds <= thresholds.ss && ['s', seconds]  ||
+            seconds < thresholds.s   && ['ss', seconds] ||
+            minutes <= 1             && ['m']           ||
+            minutes < thresholds.m   && ['mm', minutes] ||
+            hours   <= 1             && ['h']           ||
+            hours   < thresholds.h   && ['hh', hours]   ||
+            days    <= 1             && ['d']           ||
+            days    < thresholds.d   && ['dd', days]    ||
+            months  <= 1             && ['M']           ||
+            months  < thresholds.M   && ['MM', months]  ||
+            years   <= 1             && ['y']           || ['yy', years];
+
+    a[2] = withoutSuffix;
+    a[3] = +posNegDuration > 0;
+    a[4] = locale;
+    return substituteTimeAgo.apply(null, a);
+}
+
+// This function allows you to set the rounding function for relative time strings
+function getSetRelativeTimeRounding (roundingFunction) {
+    if (roundingFunction === undefined) {
+        return round;
+    }
+    if (typeof(roundingFunction) === 'function') {
+        round = roundingFunction;
+        return true;
+    }
+    return false;
+}
+
+// This function allows you to set a threshold for relative time strings
+function getSetRelativeTimeThreshold (threshold, limit) {
+    if (thresholds[threshold] === undefined) {
+        return false;
+    }
+    if (limit === undefined) {
+        return thresholds[threshold];
+    }
+    thresholds[threshold] = limit;
+    if (threshold === 's') {
+        thresholds.ss = limit - 1;
+    }
+    return true;
+}
+
+function humanize (withSuffix) {
+    if (!this.isValid()) {
+        return this.localeData().invalidDate();
+    }
+
+    var locale = this.localeData();
+    var output = relativeTime$1(this, !withSuffix, locale);
+
+    if (withSuffix) {
+        output = locale.pastFuture(+this, output);
+    }
+
+    return locale.postformat(output);
+}
+
+var abs$1 = Math.abs;
+
+function sign(x) {
+    return ((x > 0) - (x < 0)) || +x;
+}
+
+function toISOString$1() {
+    // for ISO strings we do not use the normal bubbling rules:
+    //  * milliseconds bubble up until they become hours
+    //  * days do not bubble at all
+    //  * months bubble up until they become years
+    // This is because there is no context-free conversion between hours and days
+    // (think of clock changes)
+    // and also not between days and months (28-31 days per month)
+    if (!this.isValid()) {
+        return this.localeData().invalidDate();
+    }
+
+    var seconds = abs$1(this._milliseconds) / 1000;
+    var days         = abs$1(this._days);
+    var months       = abs$1(this._months);
+    var minutes, hours, years;
+
+    // 3600 seconds -> 60 minutes -> 1 hour
+    minutes           = absFloor(seconds / 60);
+    hours             = absFloor(minutes / 60);
+    seconds %= 60;
+    minutes %= 60;
+
+    // 12 months -> 1 year
+    years  = absFloor(months / 12);
+    months %= 12;
+
+
+    // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+    var Y = years;
+    var M = months;
+    var D = days;
+    var h = hours;
+    var m = minutes;
+    var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : '';
+    var total = this.asSeconds();
+
+    if (!total) {
+        // this is the same as C#'s (Noda) and python (isodate)...
+        // but not other JS (goog.date)
+        return 'P0D';
+    }
+
+    var totalSign = total < 0 ? '-' : '';
+    var ymSign = sign(this._months) !== sign(total) ? '-' : '';
+    var daysSign = sign(this._days) !== sign(total) ? '-' : '';
+    var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';
+
+    return totalSign + 'P' +
+        (Y ? ymSign + Y + 'Y' : '') +
+        (M ? ymSign + M + 'M' : '') +
+        (D ? daysSign + D + 'D' : '') +
+        ((h || m || s) ? 'T' : '') +
+        (h ? hmsSign + h + 'H' : '') +
+        (m ? hmsSign + m + 'M' : '') +
+        (s ? hmsSign + s + 'S' : '');
+}
+
+var proto$2 = Duration.prototype;
+
+proto$2.isValid        = isValid$1;
+proto$2.abs            = abs;
+proto$2.add            = add$1;
+proto$2.subtract       = subtract$1;
+proto$2.as             = as;
+proto$2.asMilliseconds = asMilliseconds;
+proto$2.asSeconds      = asSeconds;
+proto$2.asMinutes      = asMinutes;
+proto$2.asHours        = asHours;
+proto$2.asDays         = asDays;
+proto$2.asWeeks        = asWeeks;
+proto$2.asMonths       = asMonths;
+proto$2.asYears        = asYears;
+proto$2.valueOf        = valueOf$1;
+proto$2._bubble        = bubble;
+proto$2.clone          = clone$1;
+proto$2.get            = get$2;
+proto$2.milliseconds   = milliseconds;
+proto$2.seconds        = seconds;
+proto$2.minutes        = minutes;
+proto$2.hours          = hours;
+proto$2.days           = days;
+proto$2.weeks          = weeks;
+proto$2.months         = months;
+proto$2.years          = years;
+proto$2.humanize       = humanize;
+proto$2.toISOString    = toISOString$1;
+proto$2.toString       = toISOString$1;
+proto$2.toJSON         = toISOString$1;
+proto$2.locale         = locale;
+proto$2.localeData     = localeData;
+
+// Deprecations
+proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);
+proto$2.lang = lang;
+
+// Side effect imports
+
+// FORMATTING
+
+addFormatToken('X', 0, 0, 'unix');
+addFormatToken('x', 0, 0, 'valueOf');
+
+// PARSING
+
+addRegexToken('x', matchSigned);
+addRegexToken('X', matchTimestamp);
+addParseToken('X', function (input, array, config) {
+    config._d = new Date(parseFloat(input, 10) * 1000);
+});
+addParseToken('x', function (input, array, config) {
+    config._d = new Date(toInt(input));
+});
+
+// Side effect imports
+
+
+hooks.version = '2.20.1';
+
+setHookCallback(createLocal);
+
+hooks.fn                    = proto;
+hooks.min                   = min;
+hooks.max                   = max;
+hooks.now                   = now;
+hooks.utc                   = createUTC;
+hooks.unix                  = createUnix;
+hooks.months                = listMonths;
+hooks.isDate                = isDate;
+hooks.locale                = getSetGlobalLocale;
+hooks.invalid               = createInvalid;
+hooks.duration              = createDuration;
+hooks.isMoment              = isMoment;
+hooks.weekdays              = listWeekdays;
+hooks.parseZone             = createInZone;
+hooks.localeData            = getLocale;
+hooks.isDuration            = isDuration;
+hooks.monthsShort           = listMonthsShort;
+hooks.weekdaysMin           = listWeekdaysMin;
+hooks.defineLocale          = defineLocale;
+hooks.updateLocale          = updateLocale;
+hooks.locales               = listLocales;
+hooks.weekdaysShort         = listWeekdaysShort;
+hooks.normalizeUnits        = normalizeUnits;
+hooks.relativeTimeRounding  = getSetRelativeTimeRounding;
+hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;
+hooks.calendarFormat        = getCalendarFormat;
+hooks.prototype             = proto;
+
+// currently HTML5 input type only supports 24-hour formats
+hooks.HTML5_FMT = {
+    DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',             // <input type="datetime-local" />
+    DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',  // <input type="datetime-local" step="1" />
+    DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',   // <input type="datetime-local" step="0.001" />
+    DATE: 'YYYY-MM-DD',                             // <input type="date" />
+    TIME: 'HH:mm',                                  // <input type="time" />
+    TIME_SECONDS: 'HH:mm:ss',                       // <input type="time" step="1" />
+    TIME_MS: 'HH:mm:ss.SSS',                        // <input type="time" step="0.001" />
+    WEEK: 'YYYY-[W]WW',                             // <input type="week" />
+    MONTH: 'YYYY-MM'                                // <input type="month" />
+};
+
+return hooks;
+
+})));
diff --git a/js/third-party/selectize/selectize.default.css b/js/third-party/selectize/selectize.default.css
new file mode 100644
index 0000000..ab53095
--- /dev/null
+++ b/js/third-party/selectize/selectize.default.css
@@ -0,0 +1,394 @@
+/**
+ * selectize.default.css (v0.12.4) - Default Theme
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at:
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ *
+ * @author Brian Reavis <brian@thirdroute.com>
+ */
+.selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
+  visibility: visible !important;
+  background: #f2f2f2 !important;
+  background: rgba(0, 0, 0, 0.06) !important;
+  border: 0 none !important;
+  -webkit-box-shadow: inset 0 0 12px 4px #ffffff;
+  box-shadow: inset 0 0 12px 4px #ffffff;
+}
+.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
+  content: '!';
+  visibility: hidden;
+}
+.selectize-control.plugin-drag_drop .ui-sortable-helper {
+  -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+}
+.selectize-dropdown-header {
+  position: relative;
+  padding: 5px 8px;
+  border-bottom: 1px solid #d0d0d0;
+  background: #f8f8f8;
+  -webkit-border-radius: 3px 3px 0 0;
+  -moz-border-radius: 3px 3px 0 0;
+  border-radius: 3px 3px 0 0;
+}
+.selectize-dropdown-header-close {
+  position: absolute;
+  right: 8px;
+  top: 50%;
+  color: #303030;
+  opacity: 0.4;
+  margin-top: -12px;
+  line-height: 20px;
+  font-size: 20px !important;
+}
+.selectize-dropdown-header-close:hover {
+  color: #000000;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup {
+  border-right: 1px solid #f2f2f2;
+  border-top: 0 none;
+  float: left;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
+  border-right: 0 none;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup:before {
+  display: none;
+}
+.selectize-dropdown.plugin-optgroup_columns .optgroup-header {
+  border-top: 0 none;
+}
+.selectize-control.plugin-remove_button [data-value] {
+  position: relative;
+  padding-right: 24px !important;
+}
+.selectize-control.plugin-remove_button [data-value] .remove {
+  z-index: 1;
+  /* fixes ie bug (see #392) */
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  width: 17px;
+  text-align: center;
+  font-weight: bold;
+  font-size: 12px;
+  color: inherit;
+  text-decoration: none;
+  vertical-align: middle;
+  display: inline-block;
+  padding: 2px 0 0 0;
+  border-left: 1px solid #0073bb;
+  -webkit-border-radius: 0 2px 2px 0;
+  -moz-border-radius: 0 2px 2px 0;
+  border-radius: 0 2px 2px 0;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.selectize-control.plugin-remove_button [data-value] .remove:hover {
+  background: rgba(0, 0, 0, 0.05);
+}
+.selectize-control.plugin-remove_button [data-value].active .remove {
+  border-left-color: #00578d;
+}
+.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
+  background: none;
+}
+.selectize-control.plugin-remove_button .disabled [data-value] .remove {
+  border-left-color: #aaaaaa;
+}
+.selectize-control.plugin-remove_button .remove-single {
+  position: absolute;
+  right: 28px;
+  top: 6px;
+  font-size: 23px;
+}
+.selectize-control {
+  position: relative;
+}
+.selectize-dropdown,
+.selectize-input,
+.selectize-input input {
+  color: #303030;
+  font-family: inherit;
+  font-size: 13px;
+  line-height: 18px;
+  -webkit-font-smoothing: inherit;
+}
+.selectize-input,
+.selectize-control.single .selectize-input.input-active {
+  background: #ffffff;
+  cursor: text;
+  display: inline-block;
+}
+.selectize-input {
+  border: 1px solid #d0d0d0;
+  padding: 8px 8px;
+  display: inline-block;
+  width: 100%;
+  overflow: hidden;
+  position: relative;
+  z-index: 1;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.selectize-control.multi .selectize-input.has-items {
+  padding: 5px 8px 2px;
+}
+.selectize-input.full {
+  background-color: #ffffff;
+}
+.selectize-input.disabled,
+.selectize-input.disabled * {
+  cursor: default !important;
+}
+.selectize-input.focus {
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
+}
+.selectize-input.dropdown-active {
+  -webkit-border-radius: 3px 3px 0 0;
+  -moz-border-radius: 3px 3px 0 0;
+  border-radius: 3px 3px 0 0;
+}
+.selectize-input > * {
+  vertical-align: baseline;
+  display: -moz-inline-stack;
+  display: inline-block;
+  zoom: 1;
+  *display: inline;
+}
+.selectize-control.multi .selectize-input > div {
+  cursor: pointer;
+  margin: 0 3px 3px 0;
+  padding: 2px 6px;
+  background: #1da7ee;
+  color: #ffffff;
+  border: 1px solid #0073bb;
+}
+.selectize-control.multi .selectize-input > div.active {
+  background: #92c836;
+  color: #ffffff;
+  border: 1px solid #00578d;
+}
+.selectize-control.multi .selectize-input.disabled > div,
+.selectize-control.multi .selectize-input.disabled > div.active {
+  color: #ffffff;
+  background: #d2d2d2;
+  border: 1px solid #aaaaaa;
+}
+.selectize-input > input {
+  display: inline-block !important;
+  padding: 0 !important;
+  min-height: 0 !important;
+  max-height: none !important;
+  max-width: 100% !important;
+  margin: 0 1px !important;
+  text-indent: 0 !important;
+  border: 0 none !important;
+  background: none !important;
+  line-height: inherit !important;
+  -webkit-user-select: auto !important;
+  -webkit-box-shadow: none !important;
+  box-shadow: none !important;
+}
+.selectize-input > input::-ms-clear {
+  display: none;
+}
+.selectize-input > input:focus {
+  outline: none !important;
+}
+.selectize-input::after {
+  content: ' ';
+  display: block;
+  clear: left;
+}
+.selectize-input.dropdown-active::before {
+  content: ' ';
+  display: block;
+  position: absolute;
+  background: #f0f0f0;
+  height: 1px;
+  bottom: 0;
+  left: 0;
+  right: 0;
+}
+.selectize-dropdown {
+  position: absolute;
+  z-index: 10;
+  border: 1px solid #d0d0d0;
+  background: #ffffff;
+  margin: -1px 0 0 0;
+  border-top: 0 none;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  -webkit-border-radius: 0 0 3px 3px;
+  -moz-border-radius: 0 0 3px 3px;
+  border-radius: 0 0 3px 3px;
+}
+.selectize-dropdown [data-selectable] {
+  cursor: pointer;
+  overflow: hidden;
+}
+.selectize-dropdown [data-selectable] .highlight {
+  background: rgba(125, 168, 208, 0.2);
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+}
+.selectize-dropdown [data-selectable],
+.selectize-dropdown .optgroup-header {
+  padding: 5px 8px;
+}
+.selectize-dropdown .optgroup:first-child .optgroup-header {
+  border-top: 0 none;
+}
+.selectize-dropdown .optgroup-header {
+  color: #303030;
+  background: #ffffff;
+  cursor: default;
+}
+.selectize-dropdown .active {
+  background-color: #f5fafd;
+  color: #495c68;
+}
+.selectize-dropdown .active.create {
+  color: #495c68;
+}
+.selectize-dropdown .create {
+  color: rgba(48, 48, 48, 0.5);
+}
+.selectize-dropdown-content {
+  overflow-y: auto;
+  overflow-x: hidden;
+  max-height: 200px;
+  -webkit-overflow-scrolling: touch;
+}
+.selectize-control.single .selectize-input,
+.selectize-control.single .selectize-input input {
+  cursor: pointer;
+}
+.selectize-control.single .selectize-input.input-active,
+.selectize-control.single .selectize-input.input-active input {
+  cursor: text;
+}
+.selectize-control.single .selectize-input:after {
+  content: ' ';
+  display: block;
+  position: absolute;
+  top: 50%;
+  right: 15px;
+  margin-top: -3px;
+  width: 0;
+  height: 0;
+  border-style: solid;
+  border-width: 5px 5px 0 5px;
+  border-color: #808080 transparent transparent transparent;
+}
+.selectize-control.single .selectize-input.dropdown-active:after {
+  margin-top: -4px;
+  border-width: 0 5px 5px 5px;
+  border-color: transparent transparent #808080 transparent;
+}
+.selectize-control.rtl.single .selectize-input:after {
+  left: 15px;
+  right: auto;
+}
+.selectize-control.rtl .selectize-input > input {
+  margin: 0 4px 0 -2px !important;
+}
+.selectize-control .selectize-input.disabled {
+  opacity: 0.5;
+  background-color: #fafafa;
+}
+.selectize-control.multi .selectize-input.has-items {
+  padding-left: 5px;
+  padding-right: 5px;
+}
+.selectize-control.multi .selectize-input.disabled [data-value] {
+  color: #999;
+  text-shadow: none;
+  background: none;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.selectize-control.multi .selectize-input.disabled [data-value],
+.selectize-control.multi .selectize-input.disabled [data-value] .remove {
+  border-color: #e6e6e6;
+}
+.selectize-control.multi .selectize-input.disabled [data-value] .remove {
+  background: none;
+}
+.selectize-control.multi .selectize-input [data-value] {
+  text-shadow: 0 1px 0 rgba(0, 51, 83, 0.3);
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  background-color: #1b9dec;
+  background-image: -moz-linear-gradient(top, #1da7ee, #178ee9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1da7ee), to(#178ee9));
+  background-image: -webkit-linear-gradient(top, #1da7ee, #178ee9);
+  background-image: -o-linear-gradient(top, #1da7ee, #178ee9);
+  background-image: linear-gradient(to bottom, #1da7ee, #178ee9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1da7ee', endColorstr='#ff178ee9', GradientType=0);
+  -webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
+  box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
+}
+.selectize-control.multi .selectize-input [data-value].active {
+  background-color: #0085d4;
+  background-image: -moz-linear-gradient(top, #008fd8, #0075cf);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#008fd8), to(#0075cf));
+  background-image: -webkit-linear-gradient(top, #008fd8, #0075cf);
+  background-image: -o-linear-gradient(top, #008fd8, #0075cf);
+  background-image: linear-gradient(to bottom, #008fd8, #0075cf);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff008fd8', endColorstr='#ff0075cf', GradientType=0);
+}
+.selectize-control.single .selectize-input {
+  -webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
+  box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
+  background-color: #f9f9f9;
+  background-image: -moz-linear-gradient(top, #fefefe, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fefefe), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #fefefe, #f2f2f2);
+  background-image: -o-linear-gradient(top, #fefefe, #f2f2f2);
+  background-image: linear-gradient(to bottom, #fefefe, #f2f2f2);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefefe', endColorstr='#fff2f2f2', GradientType=0);
+}
+.selectize-control.single .selectize-input,
+.selectize-dropdown.single {
+  border-color: #b8b8b8;
+}
+.selectize-dropdown .optgroup-header {
+  padding-top: 7px;
+  font-weight: bold;
+  font-size: 0.85em;
+}
+.selectize-dropdown .optgroup {
+  border-top: 1px solid #f0f0f0;
+}
+.selectize-dropdown .optgroup:first-child {
+  border-top: 0 none;
+}
diff --git a/js/third-party/selectize/selectize.js b/js/third-party/selectize/selectize.js
new file mode 100644
index 0000000..0ccd218
--- /dev/null
+++ b/js/third-party/selectize/selectize.js
@@ -0,0 +1,3829 @@
+/**
+ * sifter.js
+ * Copyright (c) 2013 Brian Reavis & contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at:
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ *
+ * @author Brian Reavis <brian@thirdroute.com>
+ */
+
+(function(root, factory) {
+	if (typeof define === 'function' && define.amd) {
+		define('sifter', factory);
+	} else if (typeof exports === 'object') {
+		module.exports = factory();
+	} else {
+		root.Sifter = factory();
+	}
+}(this, function() {
+
+	/**
+	 * Textually searches arrays and hashes of objects
+	 * by property (or multiple properties). Designed
+	 * specifically for autocomplete.
+	 *
+	 * @constructor
+	 * @param {array|object} items
+	 * @param {object} items
+	 */
+	var Sifter = function(items, settings) {
+		this.items = items;
+		this.settings = settings || {diacritics: true};
+	};
+
+	/**
+	 * Splits a search string into an array of individual
+	 * regexps to be used to match results.
+	 *
+	 * @param {string} query
+	 * @returns {array}
+	 */
+	Sifter.prototype.tokenize = function(query) {
+		query = trim(String(query || '').toLowerCase());
+		if (!query || !query.length) return [];
+
+		var i, n, regex, letter;
+		var tokens = [];
+		var words = query.split(/ +/);
+
+		for (i = 0, n = words.length; i < n; i++) {
+			regex = escape_regex(words[i]);
+			if (this.settings.diacritics) {
+				for (letter in DIACRITICS) {
+					if (DIACRITICS.hasOwnProperty(letter)) {
+						regex = regex.replace(new RegExp(letter, 'g'), DIACRITICS[letter]);
+					}
+				}
+			}
+			tokens.push({
+				string : words[i],
+				regex  : new RegExp(regex, 'i')
+			});
+		}
+
+		return tokens;
+	};
+
+	/**
+	 * Iterates over arrays and hashes.
+	 *
+	 * ```
+	 * this.iterator(this.items, function(item, id) {
+	 *    // invoked for each item
+	 * });
+	 * ```
+	 *
+	 * @param {array|object} object
+	 */
+	Sifter.prototype.iterator = function(object, callback) {
+		var iterator;
+		if (is_array(object)) {
+			iterator = Array.prototype.forEach || function(callback) {
+				for (var i = 0, n = this.length; i < n; i++) {
+					callback(this[i], i, this);
+				}
+			};
+		} else {
+			iterator = function(callback) {
+				for (var key in this) {
+					if (this.hasOwnProperty(key)) {
+						callback(this[key], key, this);
+					}
+				}
+			};
+		}
+
+		iterator.apply(object, [callback]);
+	};
+
+	/**
+	 * Returns a function to be used to score individual results.
+	 *
+	 * Good matches will have a higher score than poor matches.
+	 * If an item is not a match, 0 will be returned by the function.
+	 *
+	 * @param {object|string} search
+	 * @param {object} options (optional)
+	 * @returns {function}
+	 */
+	Sifter.prototype.getScoreFunction = function(search, options) {
+		var self, fields, tokens, token_count, nesting;
+
+		self        = this;
+		search      = self.prepareSearch(search, options);
+		tokens      = search.tokens;
+		fields      = search.options.fields;
+		token_count = tokens.length;
+		nesting     = search.options.nesting;
+
+		/**
+		 * Calculates how close of a match the
+		 * given value is against a search token.
+		 *
+		 * @param {mixed} value
+		 * @param {object} token
+		 * @return {number}
+		 */
+		var scoreValue = function(value, token) {
+			var score, pos;
+
+			if (!value) return 0;
+			value = String(value || '');
+			pos = value.search(token.regex);
+			if (pos === -1) return 0;
+			score = token.string.length / value.length;
+			if (pos === 0) score += 0.5;
+			return score;
+		};
+
+		/**
+		 * Calculates the score of an object
+		 * against the search query.
+		 *
+		 * @param {object} token
+		 * @param {object} data
+		 * @return {number}
+		 */
+		var scoreObject = (function() {
+			var field_count = fields.length;
+			if (!field_count) {
+				return function() { return 0; };
+			}
+			if (field_count === 1) {
+				return function(token, data) {
+					return scoreValue(getattr(data, fields[0], nesting), token);
+				};
+			}
+			return function(token, data) {
+				for (var i = 0, sum = 0; i < field_count; i++) {
+					sum += scoreValue(getattr(data, fields[i], nesting), token);
+				}
+				return sum / field_count;
+			};
+		})();
+
+		if (!token_count) {
+			return function() { return 0; };
+		}
+		if (token_count === 1) {
+			return function(data) {
+				return scoreObject(tokens[0], data);
+			};
+		}
+
+		if (search.options.conjunction === 'and') {
+			return function(data) {
+				var score;
+				for (var i = 0, sum = 0; i < token_count; i++) {
+					score = scoreObject(tokens[i], data);
+					if (score <= 0) return 0;
+					sum += score;
+				}
+				return sum / token_count;
+			};
+		} else {
+			return function(data) {
+				for (var i = 0, sum = 0; i < token_count; i++) {
+					sum += scoreObject(tokens[i], data);
+				}
+				return sum / token_count;
+			};
+		}
+	};
+
+	/**
+	 * Returns a function that can be used to compare two
+	 * results, for sorting purposes. If no sorting should
+	 * be performed, `null` will be returned.
+	 *
+	 * @param {string|object} search
+	 * @param {object} options
+	 * @return function(a,b)
+	 */
+	Sifter.prototype.getSortFunction = function(search, options) {
+		var i, n, self, field, fields, fields_count, multiplier, multipliers, get_field, implicit_score, sort;
+
+		self   = this;
+		search = self.prepareSearch(search, options);
+		sort   = (!search.query && options.sort_empty) || options.sort;
+
+		/**
+		 * Fetches the specified sort field value
+		 * from a search result item.
+		 *
+		 * @param  {string} name
+		 * @param  {object} result
+		 * @return {mixed}
+		 */
+		get_field = function(name, result) {
+			if (name === '$score') return result.score;
+			return getattr(self.items[result.id], name, options.nesting);
+		};
+
+		// parse options
+		fields = [];
+		if (sort) {
+			for (i = 0, n = sort.length; i < n; i++) {
+				if (search.query || sort[i].field !== '$score') {
+					fields.push(sort[i]);
+				}
+			}
+		}
+
+		// the "$score" field is implied to be the primary
+		// sort field, unless it's manually specified
+		if (search.query) {
+			implicit_score = true;
+			for (i = 0, n = fields.length; i < n; i++) {
+				if (fields[i].field === '$score') {
+					implicit_score = false;
+					break;
+				}
+			}
+			if (implicit_score) {
+				fields.unshift({field: '$score', direction: 'desc'});
+			}
+		} else {
+			for (i = 0, n = fields.length; i < n; i++) {
+				if (fields[i].field === '$score') {
+					fields.splice(i, 1);
+					break;
+				}
+			}
+		}
+
+		multipliers = [];
+		for (i = 0, n = fields.length; i < n; i++) {
+			multipliers.push(fields[i].direction === 'desc' ? -1 : 1);
+		}
+
+		// build function
+		fields_count = fields.length;
+		if (!fields_count) {
+			return null;
+		} else if (fields_count === 1) {
+			field = fields[0].field;
+			multiplier = multipliers[0];
+			return function(a, b) {
+				return multiplier * cmp(
+					get_field(field, a),
+					get_field(field, b)
+				);
+			};
+		} else {
+			return function(a, b) {
+				var i, result, a_value, b_value, field;
+				for (i = 0; i < fields_count; i++) {
+					field = fields[i].field;
+					result = multipliers[i] * cmp(
+						get_field(field, a),
+						get_field(field, b)
+					);
+					if (result) return result;
+				}
+				return 0;
+			};
+		}
+	};
+
+	/**
+	 * Parses a search query and returns an object
+	 * with tokens and fields ready to be populated
+	 * with results.
+	 *
+	 * @param {string} query
+	 * @param {object} options
+	 * @returns {object}
+	 */
+	Sifter.prototype.prepareSearch = function(query, options) {
+		if (typeof query === 'object') return query;
+
+		options = extend({}, options);
+
+		var option_fields     = options.fields;
+		var option_sort       = options.sort;
+		var option_sort_empty = options.sort_empty;
+
+		if (option_fields && !is_array(option_fields)) options.fields = [option_fields];
+		if (option_sort && !is_array(option_sort)) options.sort = [option_sort];
+		if (option_sort_empty && !is_array(option_sort_empty)) options.sort_empty = [option_sort_empty];
+
+		return {
+			options : options,
+			query   : String(query || '').toLowerCase(),
+			tokens  : this.tokenize(query),
+			total   : 0,
+			items   : []
+		};
+	};
+
+	/**
+	 * Searches through all items and returns a sorted array of matches.
+	 *
+	 * The `options` parameter can contain:
+	 *
+	 *   - fields {string|array}
+	 *   - sort {array}
+	 *   - score {function}
+	 *   - filter {bool}
+	 *   - limit {integer}
+	 *
+	 * Returns an object containing:
+	 *
+	 *   - options {object}
+	 *   - query {string}
+	 *   - tokens {array}
+	 *   - total {int}
+	 *   - items {array}
+	 *
+	 * @param {string} query
+	 * @param {object} options
+	 * @returns {object}
+	 */
+	Sifter.prototype.search = function(query, options) {
+		var self = this, value, score, search, calculateScore;
+		var fn_sort;
+		var fn_score;
+
+		search  = this.prepareSearch(query, options);
+		options = search.options;
+		query   = search.query;
+
+		// generate result scoring function
+		fn_score = options.score || self.getScoreFunction(search);
+
+		// perform search and sort
+		if (query.length) {
+			self.iterator(self.items, function(item, id) {
+				score = fn_score(item);
+				if (options.filter === false || score > 0) {
+					search.items.push({'score': score, 'id': id});
+				}
+			});
+		} else {
+			self.iterator(self.items, function(item, id) {
+				search.items.push({'score': 1, 'id': id});
+			});
+		}
+
+		fn_sort = self.getSortFunction(search, options);
+		if (fn_sort) search.items.sort(fn_sort);
+
+		// apply limits
+		search.total = search.items.length;
+		if (typeof options.limit === 'number') {
+			search.items = search.items.slice(0, options.limit);
+		}
+
+		return search;
+	};
+
+	// utilities
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	var cmp = function(a, b) {
+		if (typeof a === 'number' && typeof b === 'number') {
+			return a > b ? 1 : (a < b ? -1 : 0);
+		}
+		a = asciifold(String(a || ''));
+		b = asciifold(String(b || ''));
+		if (a > b) return 1;
+		if (b > a) return -1;
+		return 0;
+	};
+
+	var extend = function(a, b) {
+		var i, n, k, object;
+		for (i = 1, n = arguments.length; i < n; i++) {
+			object = arguments[i];
+			if (!object) continue;
+			for (k in object) {
+				if (object.hasOwnProperty(k)) {
+					a[k] = object[k];
+				}
+			}
+		}
+		return a;
+	};
+
+	/**
+	 * A property getter resolving dot-notation
+	 * @param  {Object}  obj     The root object to fetch property on
+	 * @param  {String}  name    The optionally dotted property name to fetch
+	 * @param  {Boolean} nesting Handle nesting or not
+	 * @return {Object}          The resolved property value
+	 */
+	var getattr = function(obj, name, nesting) {
+	    if (!obj || !name) return;
+	    if (!nesting) return obj[name];
+	    var names = name.split(".");
+	    while(names.length && (obj = obj[names.shift()]));
+	    return obj;
+	};
+
+	var trim = function(str) {
+		return (str + '').replace(/^\s+|\s+$|/g, '');
+	};
+
+	var escape_regex = function(str) {
+		return (str + '').replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1');
+	};
+
+	var is_array = Array.isArray || (typeof $ !== 'undefined' && $.isArray) || function(object) {
+		return Object.prototype.toString.call(object) === '[object Array]';
+	};
+
+	var DIACRITICS = {
+		'a': '[aḀḁĂăÂâǍǎȺⱥȦȧẠạÄäÀàÁáĀāÃãÅåąĄÃąĄ]',
+		'b': '[b␢βΒB฿𐌁ᛒ]',
+		'c': '[cĆćĈĉČčĊċC̄c̄ÇçḈḉȻȼƇƈɕᴄＣｃ]',
+		'd': '[dĎďḊḋḐḑḌḍḒḓḎḏĐđD̦d̦ƉɖƊɗƋƌᵭᶁᶑȡᴅＤｄð]',
+		'e': '[eÉéÈèÊêḘḙĚěĔĕẼẽḚḛẺẻĖėËëĒēȨȩĘęᶒɆɇȄȅẾếỀềỄễỂểḜḝḖḗḔḕȆȇẸẹỆệⱸᴇＥｅɘǝƏƐε]',
+		'f': '[fƑƒḞḟ]',
+		'g': '[gɢ₲ǤǥĜĝĞğĢģƓɠĠġ]',
+		'h': '[hĤĥĦħḨḩẖẖḤḥḢḣɦʰǶƕ]',
+		'i': '[iÍíÌìĬĭÎîǏǐÏïḮḯĨĩĮįĪīỈỉȈȉȊȋỊịḬḭƗɨɨ̆ᵻᶖİiIıɪＩｉ]',
+		'j': '[jȷĴĵɈɉʝɟʲ]',
+		'k': '[kƘƙꝀꝁḰḱǨǩḲḳḴḵκϰ₭]',
+		'l': '[lŁłĽľĻļĹĺḶḷḸḹḼḽḺḻĿŀȽƚⱠⱡⱢɫɬᶅɭȴʟＬｌ]',
+		'n': '[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲȠƞᵰᶇɳȵɴＮｎŊŋ]',
+		'o': '[oØøÖöÓóÒòÔôǑǒŐőŎŏȮȯỌọƟɵƠơỎỏŌōÕõǪǫȌȍՕօ]',
+		'p': '[pṔṕṖṗⱣᵽƤƥᵱ]',
+		'q': '[qꝖꝗʠɊɋꝘꝙq̃]',
+		'r': '[rŔŕɌɍŘřŖŗṘṙȐȑȒȓṚṛⱤɽ]',
+		's': '[sŚśṠṡṢṣꞨꞩŜŝŠšŞşȘșS̈s̈]',
+		't': '[tŤťṪṫŢţṬṭƮʈȚțṰṱṮṯƬƭ]',
+		'u': '[uŬŭɄʉỤụÜüÚúÙùÛûǓǔŰűŬŭƯưỦủŪūŨũŲųȔȕ∪]',
+		'v': '[vṼṽṾṿƲʋꝞꝟⱱʋ]',
+		'w': '[wẂẃẀẁŴŵẄẅẆẇẈẉ]',
+		'x': '[xẌẍẊẋχ]',
+		'y': '[yÝýỲỳŶŷŸÿỸỹẎẏỴỵɎɏƳƴ]',
+		'z': '[zŹźẐẑŽžŻżẒẓẔẕƵƶ]'
+	};
+
+	var asciifold = (function() {
+		var i, n, k, chunk;
+		var foreignletters = '';
+		var lookup = {};
+		for (k in DIACRITICS) {
+			if (DIACRITICS.hasOwnProperty(k)) {
+				chunk = DIACRITICS[k].substring(2, DIACRITICS[k].length - 1);
+				foreignletters += chunk;
+				for (i = 0, n = chunk.length; i < n; i++) {
+					lookup[chunk.charAt(i)] = k;
+				}
+			}
+		}
+		var regexp = new RegExp('[' +  foreignletters + ']', 'g');
+		return function(str) {
+			return str.replace(regexp, function(foreignletter) {
+				return lookup[foreignletter];
+			}).toLowerCase();
+		};
+	})();
+
+
+	// export
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	return Sifter;
+}));
+
+
+
+/**
+ * microplugin.js
+ * Copyright (c) 2013 Brian Reavis & contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at:
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ *
+ * @author Brian Reavis <brian@thirdroute.com>
+ */
+
+(function(root, factory) {
+	if (typeof define === 'function' && define.amd) {
+		define('microplugin', factory);
+	} else if (typeof exports === 'object') {
+		module.exports = factory();
+	} else {
+		root.MicroPlugin = factory();
+	}
+}(this, function() {
+	var MicroPlugin = {};
+
+	MicroPlugin.mixin = function(Interface) {
+		Interface.plugins = {};
+
+		/**
+		 * Initializes the listed plugins (with options).
+		 * Acceptable formats:
+		 *
+		 * List (without options):
+		 *   ['a', 'b', 'c']
+		 *
+		 * List (with options):
+		 *   [{'name': 'a', options: {}}, {'name': 'b', options: {}}]
+		 *
+		 * Hash (with options):
+		 *   {'a': { ... }, 'b': { ... }, 'c': { ... }}
+		 *
+		 * @param {mixed} plugins
+		 */
+		Interface.prototype.initializePlugins = function(plugins) {
+			var i, n, key;
+			var self  = this;
+			var queue = [];
+
+			self.plugins = {
+				names     : [],
+				settings  : {},
+				requested : {},
+				loaded    : {}
+			};
+
+			if (utils.isArray(plugins)) {
+				for (i = 0, n = plugins.length; i < n; i++) {
+					if (typeof plugins[i] === 'string') {
+						queue.push(plugins[i]);
+					} else {
+						self.plugins.settings[plugins[i].name] = plugins[i].options;
+						queue.push(plugins[i].name);
+					}
+				}
+			} else if (plugins) {
+				for (key in plugins) {
+					if (plugins.hasOwnProperty(key)) {
+						self.plugins.settings[key] = plugins[key];
+						queue.push(key);
+					}
+				}
+			}
+
+			while (queue.length) {
+				self.require(queue.shift());
+			}
+		};
+
+		Interface.prototype.loadPlugin = function(name) {
+			var self    = this;
+			var plugins = self.plugins;
+			var plugin  = Interface.plugins[name];
+
+			if (!Interface.plugins.hasOwnProperty(name)) {
+				throw new Error('Unable to find "' +  name + '" plugin');
+			}
+
+			plugins.requested[name] = true;
+			plugins.loaded[name] = plugin.fn.apply(self, [self.plugins.settings[name] || {}]);
+			plugins.names.push(name);
+		};
+
+		/**
+		 * Initializes a plugin.
+		 *
+		 * @param {string} name
+		 */
+		Interface.prototype.require = function(name) {
+			var self = this;
+			var plugins = self.plugins;
+
+			if (!self.plugins.loaded.hasOwnProperty(name)) {
+				if (plugins.requested[name]) {
+					throw new Error('Plugin has circular dependency ("' + name + '")');
+				}
+				self.loadPlugin(name);
+			}
+
+			return plugins.loaded[name];
+		};
+
+		/**
+		 * Registers a plugin.
+		 *
+		 * @param {string} name
+		 * @param {function} fn
+		 */
+		Interface.define = function(name, fn) {
+			Interface.plugins[name] = {
+				'name' : name,
+				'fn'   : fn
+			};
+		};
+	};
+
+	var utils = {
+		isArray: Array.isArray || function(vArg) {
+			return Object.prototype.toString.call(vArg) === '[object Array]';
+		}
+	};
+
+	return MicroPlugin;
+}));
+
+/**
+ * selectize.js (v0.12.4)
+ * Copyright (c) 2013–2015 Brian Reavis & contributors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
+ * file except in compliance with the License. You may obtain a copy of the License at:
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
+ * ANY KIND, either express or implied. See the License for the specific language
+ * governing permissions and limitations under the License.
+ *
+ * @author Brian Reavis <brian@thirdroute.com>
+ */
+
+/*jshint curly:false */
+/*jshint browser:true */
+
+(function(root, factory) {
+	if (typeof define === 'function' && define.amd) {
+		define('selectize', ['jquery','sifter','microplugin'], factory);
+	} else if (typeof exports === 'object') {
+		module.exports = factory(require('jquery'), require('sifter'), require('microplugin'));
+	} else {
+		root.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin);
+	}
+}(this, function($, Sifter, MicroPlugin) {
+	'use strict';
+
+	var highlight = function($element, pattern) {
+		if (typeof pattern === 'string' && !pattern.length) return;
+		var regex = (typeof pattern === 'string') ? new RegExp(pattern, 'i') : pattern;
+	
+		var highlight = function(node) {
+			var skip = 0;
+			if (node.nodeType === 3) {
+				var pos = node.data.search(regex);
+				if (pos >= 0 && node.data.length > 0) {
+					var match = node.data.match(regex);
+					var spannode = document.createElement('span');
+					spannode.className = 'highlight';
+					var middlebit = node.splitText(pos);
+					var endbit = middlebit.splitText(match[0].length);
+					var middleclone = middlebit.cloneNode(true);
+					spannode.appendChild(middleclone);
+					middlebit.parentNode.replaceChild(spannode, middlebit);
+					skip = 1;
+				}
+			} else if (node.nodeType === 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
+				for (var i = 0; i < node.childNodes.length; ++i) {
+					i += highlight(node.childNodes[i]);
+				}
+			}
+			return skip;
+		};
+	
+		return $element.each(function() {
+			highlight(this);
+		});
+	};
+	
+	/**
+	 * removeHighlight fn copied from highlight v5 and
+	 * edited to remove with() and pass js strict mode
+	 */
+	$.fn.removeHighlight = function() {
+		return this.find("span.highlight").each(function() {
+			this.parentNode.firstChild.nodeName;
+			var parent = this.parentNode;
+			parent.replaceChild(this.firstChild, this);
+			parent.normalize();
+		}).end();
+	};
+	
+	
+	var MicroEvent = function() {};
+	MicroEvent.prototype = {
+		on: function(event, fct){
+			this._events = this._events || {};
+			this._events[event] = this._events[event] || [];
+			this._events[event].push(fct);
+		},
+		off: function(event, fct){
+			var n = arguments.length;
+			if (n === 0) return delete this._events;
+			if (n === 1) return delete this._events[event];
+	
+			this._events = this._events || {};
+			if (event in this._events === false) return;
+			this._events[event].splice(this._events[event].indexOf(fct), 1);
+		},
+		trigger: function(event /* , args... */){
+			this._events = this._events || {};
+			if (event in this._events === false) return;
+			for (var i = 0; i < this._events[event].length; i++){
+				this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
+			}
+		}
+	};
+	
+	/**
+	 * Mixin will delegate all MicroEvent.js function in the destination object.
+	 *
+	 * - MicroEvent.mixin(Foobar) will make Foobar able to use MicroEvent
+	 *
+	 * @param {object} the object which will support MicroEvent
+	 */
+	MicroEvent.mixin = function(destObject){
+		var props = ['on', 'off', 'trigger'];
+		for (var i = 0; i < props.length; i++){
+			destObject.prototype[props[i]] = MicroEvent.prototype[props[i]];
+		}
+	};
+	
+	var IS_MAC        = /Mac/.test(navigator.userAgent);
+	
+	var KEY_A         = 65;
+	var KEY_COMMA     = 188;
+	var KEY_RETURN    = 13;
+	var KEY_ESC       = 27;
+	var KEY_LEFT      = 37;
+	var KEY_UP        = 38;
+	var KEY_P         = 80;
+	var KEY_RIGHT     = 39;
+	var KEY_DOWN      = 40;
+	var KEY_N         = 78;
+	var KEY_BACKSPACE = 8;
+	var KEY_DELETE    = 46;
+	var KEY_SHIFT     = 16;
+	var KEY_CMD       = IS_MAC ? 91 : 17;
+	var KEY_CTRL      = IS_MAC ? 18 : 17;
+	var KEY_TAB       = 9;
+	
+	var TAG_SELECT    = 1;
+	var TAG_INPUT     = 2;
+	
+	// for now, android support in general is too spotty to support validity
+	var SUPPORTS_VALIDITY_API = !/android/i.test(window.navigator.userAgent) && !!document.createElement('input').validity;
+	
+	
+	var isset = function(object) {
+		return typeof object !== 'undefined';
+	};
+	
+	/**
+	 * Converts a scalar to its best string representation
+	 * for hash keys and HTML attribute values.
+	 *
+	 * Transformations:
+	 *   'str'     -> 'str'
+	 *   null      -> ''
+	 *   undefined -> ''
+	 *   true      -> '1'
+	 *   false     -> '0'
+	 *   0         -> '0'
+	 *   1         -> '1'
+	 *
+	 * @param {string} value
+	 * @returns {string|null}
+	 */
+	var hash_key = function(value) {
+		if (typeof value === 'undefined' || value === null) return null;
+		if (typeof value === 'boolean') return value ? '1' : '0';
+		return value + '';
+	};
+	
+	/**
+	 * Escapes a string for use within HTML.
+	 *
+	 * @param {string} str
+	 * @returns {string}
+	 */
+	var escape_html = function(str) {
+		return (str + '')
+			.replace(/&/g, '&amp;')
+			.replace(/</g, '&lt;')
+			.replace(/>/g, '&gt;')
+			.replace(/"/g, '&quot;');
+	};
+	
+	/**
+	 * Escapes "$" characters in replacement strings.
+	 *
+	 * @param {string} str
+	 * @returns {string}
+	 */
+	var escape_replace = function(str) {
+		return (str + '').replace(/\$/g, '$$$$');
+	};
+	
+	var hook = {};
+	
+	/**
+	 * Wraps `method` on `self` so that `fn`
+	 * is invoked before the original method.
+	 *
+	 * @param {object} self
+	 * @param {string} method
+	 * @param {function} fn
+	 */
+	hook.before = function(self, method, fn) {
+		var original = self[method];
+		self[method] = function() {
+			fn.apply(self, arguments);
+			return original.apply(self, arguments);
+		};
+	};
+	
+	/**
+	 * Wraps `method` on `self` so that `fn`
+	 * is invoked after the original method.
+	 *
+	 * @param {object} self
+	 * @param {string} method
+	 * @param {function} fn
+	 */
+	hook.after = function(self, method, fn) {
+		var original = self[method];
+		self[method] = function() {
+			var result = original.apply(self, arguments);
+			fn.apply(self, arguments);
+			return result;
+		};
+	};
+	
+	/**
+	 * Wraps `fn` so that it can only be invoked once.
+	 *
+	 * @param {function} fn
+	 * @returns {function}
+	 */
+	var once = function(fn) {
+		var called = false;
+		return function() {
+			if (called) return;
+			called = true;
+			fn.apply(this, arguments);
+		};
+	};
+	
+	/**
+	 * Wraps `fn` so that it can only be called once
+	 * every `delay` milliseconds (invoked on the falling edge).
+	 *
+	 * @param {function} fn
+	 * @param {int} delay
+	 * @returns {function}
+	 */
+	var debounce = function(fn, delay) {
+		var timeout;
+		return function() {
+			var self = this;
+			var args = arguments;
+			window.clearTimeout(timeout);
+			timeout = window.setTimeout(function() {
+				fn.apply(self, args);
+			}, delay);
+		};
+	};
+	
+	/**
+	 * Debounce all fired events types listed in `types`
+	 * while executing the provided `fn`.
+	 *
+	 * @param {object} self
+	 * @param {array} types
+	 * @param {function} fn
+	 */
+	var debounce_events = function(self, types, fn) {
+		var type;
+		var trigger = self.trigger;
+		var event_args = {};
+	
+		// override trigger method
+		self.trigger = function() {
+			var type = arguments[0];
+			if (types.indexOf(type) !== -1) {
+				event_args[type] = arguments;
+			} else {
+				return trigger.apply(self, arguments);
+			}
+		};
+	
+		// invoke provided function
+		fn.apply(self, []);
+		self.trigger = trigger;
+	
+		// trigger queued events
+		for (type in event_args) {
+			if (event_args.hasOwnProperty(type)) {
+				trigger.apply(self, event_args[type]);
+			}
+		}
+	};
+	
+	/**
+	 * A workaround for http://bugs.jquery.com/ticket/6696
+	 *
+	 * @param {object} $parent - Parent element to listen on.
+	 * @param {string} event - Event name.
+	 * @param {string} selector - Descendant selector to filter by.
+	 * @param {function} fn - Event handler.
+	 */
+	var watchChildEvent = function($parent, event, selector, fn) {
+		$parent.on(event, selector, function(e) {
+			var child = e.target;
+			while (child && child.parentNode !== $parent[0]) {
+				child = child.parentNode;
+			}
+			e.currentTarget = child;
+			return fn.apply(this, [e]);
+		});
+	};
+	
+	/**
+	 * Determines the current selection within a text input control.
+	 * Returns an object containing:
+	 *   - start
+	 *   - length
+	 *
+	 * @param {object} input
+	 * @returns {object}
+	 */
+	var getSelection = function(input) {
+		var result = {};
+		if ('selectionStart' in input) {
+			result.start = input.selectionStart;
+			result.length = input.selectionEnd - result.start;
+		} else if (document.selection) {
+			input.focus();
+			var sel = document.selection.createRange();
+			var selLen = document.selection.createRange().text.length;
+			sel.moveStart('character', -input.value.length);
+			result.start = sel.text.length - selLen;
+			result.length = selLen;
+		}
+		return result;
+	};
+	
+	/**
+	 * Copies CSS properties from one element to another.
+	 *
+	 * @param {object} $from
+	 * @param {object} $to
+	 * @param {array} properties
+	 */
+	var transferStyles = function($from, $to, properties) {
+		var i, n, styles = {};
+		if (properties) {
+			for (i = 0, n = properties.length; i < n; i++) {
+				styles[properties[i]] = $from.css(properties[i]);
+			}
+		} else {
+			styles = $from.css();
+		}
+		$to.css(styles);
+	};
+	
+	/**
+	 * Measures the width of a string within a
+	 * parent element (in pixels).
+	 *
+	 * @param {string} str
+	 * @param {object} $parent
+	 * @returns {int}
+	 */
+	var measureString = function(str, $parent) {
+		if (!str) {
+			return 0;
+		}
+	
+		var $test = $('<test>').css({
+			position: 'absolute',
+			top: -99999,
+			left: -99999,
+			width: 'auto',
+			padding: 0,
+			whiteSpace: 'pre'
+		}).text(str).appendTo('body');
+	
+		transferStyles($parent, $test, [
+			'letterSpacing',
+			'fontSize',
+			'fontFamily',
+			'fontWeight',
+			'textTransform'
+		]);
+	
+		var width = $test.width();
+		$test.remove();
+	
+		return width;
+	};
+	
+	/**
+	 * Sets up an input to grow horizontally as the user
+	 * types. If the value is changed manually, you can
+	 * trigger the "update" handler to resize:
+	 *
+	 * $input.trigger('update');
+	 *
+	 * @param {object} $input
+	 */
+	var autoGrow = function($input) {
+		var currentWidth = null;
+	
+		var update = function(e, options) {
+			var value, keyCode, printable, placeholder, width;
+			var shift, character, selection;
+			e = e || window.event || {};
+			options = options || {};
+	
+			if (e.metaKey || e.altKey) return;
+			if (!options.force && $input.data('grow') === false) return;
+	
+			value = $input.val();
+			if (e.type && e.type.toLowerCase() === 'keydown') {
+				keyCode = e.keyCode;
+				printable = (
+					(keyCode >= 97 && keyCode <= 122) || // a-z
+					(keyCode >= 65 && keyCode <= 90)  || // A-Z
+					(keyCode >= 48 && keyCode <= 57)  || // 0-9
+					keyCode === 32 // space
+				);
+	
+				if (keyCode === KEY_DELETE || keyCode === KEY_BACKSPACE) {
+					selection = getSelection($input[0]);
+					if (selection.length) {
+						value = value.substring(0, selection.start) + value.substring(selection.start + selection.length);
+					} else if (keyCode === KEY_BACKSPACE && selection.start) {
+						value = value.substring(0, selection.start - 1) + value.substring(selection.start + 1);
+					} else if (keyCode === KEY_DELETE && typeof selection.start !== 'undefined') {
+						value = value.substring(0, selection.start) + value.substring(selection.start + 1);
+					}
+				} else if (printable) {
+					shift = e.shiftKey;
+					character = String.fromCharCode(e.keyCode);
+					if (shift) character = character.toUpperCase();
+					else character = character.toLowerCase();
+					value += character;
+				}
+			}
+	
+			placeholder = $input.attr('placeholder');
+			if (!value && placeholder) {
+				value = placeholder;
+			}
+	
+			width = measureString(value, $input) + 4;
+			if (width !== currentWidth) {
+				currentWidth = width;
+				$input.width(width);
+				$input.triggerHandler('resize');
+			}
+		};
+	
+		$input.on('keydown keyup update blur', update);
+		update();
+	};
+	
+	var domToString = function(d) {
+		var tmp = document.createElement('div');
+	
+		tmp.appendChild(d.cloneNode(true));
+	
+		return tmp.innerHTML;
+	};
+	
+	var logError = function(message, options){
+		if(!options) options = {};
+		var component = "Selectize";
+	
+		console.error(component + ": " + message)
+	
+		if(options.explanation){
+			// console.group is undefined in <IE11
+			if(console.group) console.group();
+			console.error(options.explanation);
+			if(console.group) console.groupEnd();
+		}
+	}
+	
+	
+	var Selectize = function($input, settings) {
+		var key, i, n, dir, input, self = this;
+		input = $input[0];
+		input.selectize = self;
+	
+		// detect rtl environment
+		var computedStyle = window.getComputedStyle && window.getComputedStyle(input, null);
+		dir = computedStyle ? computedStyle.getPropertyValue('direction') : input.currentStyle && input.currentStyle.direction;
+		dir = dir || $input.parents('[dir]:first').attr('dir') || '';
+	
+		// setup default state
+		$.extend(self, {
+			order            : 0,
+			settings         : settings,
+			$input           : $input,
+			tabIndex         : $input.attr('tabindex') || '',
+			tagType          : input.tagName.toLowerCase() === 'select' ? TAG_SELECT : TAG_INPUT,
+			rtl              : /rtl/i.test(dir),
+	
+			eventNS          : '.selectize' + (++Selectize.count),
+			highlightedValue : null,
+			isOpen           : false,
+			isDisabled       : false,
+			isRequired       : $input.is('[required]'),
+			isInvalid        : false,
+			isLocked         : false,
+			isFocused        : false,
+			isInputHidden    : false,
+			isSetup          : false,
+			isShiftDown      : false,
+			isCmdDown        : false,
+			isCtrlDown       : false,
+			ignoreFocus      : false,
+			ignoreBlur       : false,
+			ignoreHover      : false,
+			hasOptions       : false,
+			currentResults   : null,
+			lastValue        : '',
+			caretPos         : 0,
+			loading          : 0,
+			loadedSearches   : {},
+	
+			$activeOption    : null,
+			$activeItems     : [],
+	
+			optgroups        : {},
+			options          : {},
+			userOptions      : {},
+			items            : [],
+			renderCache      : {},
+			onSearchChange   : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle)
+		});
+	
+		// search system
+		self.sifter = new Sifter(this.options, {diacritics: settings.diacritics});
+	
+		// build options table
+		if (self.settings.options) {
+			for (i = 0, n = self.settings.options.length; i < n; i++) {
+				self.registerOption(self.settings.options[i]);
+			}
+			delete self.settings.options;
+		}
+	
+		// build optgroup table
+		if (self.settings.optgroups) {
+			for (i = 0, n = self.settings.optgroups.length; i < n; i++) {
+				self.registerOptionGroup(self.settings.optgroups[i]);
+			}
+			delete self.settings.optgroups;
+		}
+	
+		// option-dependent defaults
+		self.settings.mode = self.settings.mode || (self.settings.maxItems === 1 ? 'single' : 'multi');
+		if (typeof self.settings.hideSelected !== 'boolean') {
+			self.settings.hideSelected = self.settings.mode === 'multi';
+		}
+	
+		self.initializePlugins(self.settings.plugins);
+		self.setupCallbacks();
+		self.setupTemplates();
+		self.setup();
+	};
+	
+	// mixins
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+	
+	MicroEvent.mixin(Selectize);
+	
+	if(typeof MicroPlugin !== "undefined"){
+		MicroPlugin.mixin(Selectize);
+	}else{
+		logError("Dependency MicroPlugin is missing",
+			{explanation:
+				"Make sure you either: (1) are using the \"standalone\" "+
+				"version of Selectize, or (2) require MicroPlugin before you "+
+				"load Selectize."}
+		);
+	}
+	
+	
+	// methods
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+	
+	$.extend(Selectize.prototype, {
+	
+		/**
+		 * Creates all elements and sets up event bindings.
+		 */
+		setup: function() {
+			var self      = this;
+			var settings  = self.settings;
+			var eventNS   = self.eventNS;
+			var $window   = $(window);
+			var $document = $(document);
+			var $input    = self.$input;
+	
+			var $wrapper;
+			var $control;
+			var $control_input;
+			var $dropdown;
+			var $dropdown_content;
+			var $dropdown_parent;
+			var inputMode;
+			var timeout_blur;
+			var timeout_focus;
+			var classes;
+			var classes_plugins;
+			var inputId;
+	
+			inputMode         = self.settings.mode;
+			classes           = $input.attr('class') || '';
+	
+			$wrapper          = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);
+			$control          = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);
+			$control_input    = $('<input type="text" autocomplete="off" />').appendTo($control).attr('tabindex', $input.is(':disabled') ? '-1' : self.tabIndex);
+			$dropdown_parent  = $(settings.dropdownParent || $wrapper);
+			$dropdown         = $('<div>').addClass(settings.dropdownClass).addClass(inputMode).hide().appendTo($dropdown_parent);
+			$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);
+	
+			if(inputId = $input.attr('id')) {
+				$control_input.attr('id', inputId + '-selectized');
+				$("label[for='"+inputId+"']").attr('for', inputId + '-selectized');
+			}
+	
+			if(self.settings.copyClassesToDropdown) {
+				$dropdown.addClass(classes);
+			}
+	
+			$wrapper.css({
+				width: $input[0].style.width
+			});
+	
+			if (self.plugins.names.length) {
+				classes_plugins = 'plugin-' + self.plugins.names.join(' plugin-');
+				$wrapper.addClass(classes_plugins);
+				$dropdown.addClass(classes_plugins);
+			}
+	
+			if ((settings.maxItems === null || settings.maxItems > 1) && self.tagType === TAG_SELECT) {
+				$input.attr('multiple', 'multiple');
+			}
+	
+			if (self.settings.placeholder) {
+				$control_input.attr('placeholder', settings.placeholder);
+			}
+	
+			// if splitOn was not passed in, construct it from the delimiter to allow pasting universally
+			if (!self.settings.splitOn && self.settings.delimiter) {
+				var delimiterEscaped = self.settings.delimiter.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+				self.settings.splitOn = new RegExp('\\s*' + delimiterEscaped + '+\\s*');
+			}
+	
+			if ($input.attr('autocorrect')) {
+				$control_input.attr('autocorrect', $input.attr('autocorrect'));
+			}
+	
+			if ($input.attr('autocapitalize')) {
+				$control_input.attr('autocapitalize', $input.attr('autocapitalize'));
+			}
+	
+			self.$wrapper          = $wrapper;
+			self.$control          = $control;
+			self.$control_input    = $control_input;
+			self.$dropdown         = $dropdown;
+			self.$dropdown_content = $dropdown_content;
+	
+			$dropdown.on('mouseenter', '[data-selectable]', function() { return self.onOptionHover.apply(self, arguments); });
+			$dropdown.on('mousedown click', '[data-selectable]', function() { return self.onOptionSelect.apply(self, arguments); });
+			watchChildEvent($control, 'mousedown', '*:not(input)', function() { return self.onItemSelect.apply(self, arguments); });
+			autoGrow($control_input);
+	
+			$control.on({
+				mousedown : function() { return self.onMouseDown.apply(self, arguments); },
+				click     : function() { return self.onClick.apply(self, arguments); }
+			});
+	
+			$control_input.on({
+				mousedown : function(e) { e.stopPropagation(); },
+				keydown   : function() { return self.onKeyDown.apply(self, arguments); },
+				keyup     : function() { return self.onKeyUp.apply(self, arguments); },
+				keypress  : function() { return self.onKeyPress.apply(self, arguments); },
+				resize    : function() { self.positionDropdown.apply(self, []); },
+				blur      : function() { return self.onBlur.apply(self, arguments); },
+				focus     : function() { self.ignoreBlur = false; return self.onFocus.apply(self, arguments); },
+				paste     : function() { return self.onPaste.apply(self, arguments); }
+			});
+	
+			$document.on('keydown' + eventNS, function(e) {
+				self.isCmdDown = e[IS_MAC ? 'metaKey' : 'ctrlKey'];
+				self.isCtrlDown = e[IS_MAC ? 'altKey' : 'ctrlKey'];
+				self.isShiftDown = e.shiftKey;
+			});
+	
+			$document.on('keyup' + eventNS, function(e) {
+				if (e.keyCode === KEY_CTRL) self.isCtrlDown = false;
+				if (e.keyCode === KEY_SHIFT) self.isShiftDown = false;
+				if (e.keyCode === KEY_CMD) self.isCmdDown = false;
+			});
+	
+			$document.on('mousedown' + eventNS, function(e) {
+				if (self.isFocused) {
+					// prevent events on the dropdown scrollbar from causing the control to blur
+					if (e.target === self.$dropdown[0] || e.target.parentNode === self.$dropdown[0]) {
+						return false;
+					}
+					// blur on click outside
+					if (!self.$control.has(e.target).length && e.target !== self.$control[0]) {
+						self.blur(e.target);
+					}
+				}
+			});
+	
+			$window.on(['scroll' + eventNS, 'resize' + eventNS].join(' '), function() {
+				if (self.isOpen) {
+					self.positionDropdown.apply(self, arguments);
+				}
+			});
+			$window.on('mousemove' + eventNS, function() {
+				self.ignoreHover = false;
+			});
+	
+			// store original children and tab index so that they can be
+			// restored when the destroy() method is called.
+			this.revertSettings = {
+				$children : $input.children().detach(),
+				tabindex  : $input.attr('tabindex')
+			};
+	
+			$input.attr('tabindex', -1).hide().after(self.$wrapper);
+	
+			if ($.isArray(settings.items)) {
+				self.setValue(settings.items);
+				delete settings.items;
+			}
+	
+			// feature detect for the validation API
+			if (SUPPORTS_VALIDITY_API) {
+				$input.on('invalid' + eventNS, function(e) {
+					e.preventDefault();
+					self.isInvalid = true;
+					self.refreshState();
+				});
+			}
+	
+			self.updateOriginalInput();
+			self.refreshItems();
+			self.refreshState();
+			self.updatePlaceholder();
+			self.isSetup = true;
+	
+			if ($input.is(':disabled')) {
+				self.disable();
+			}
+	
+			self.on('change', this.onChange);
+	
+			$input.data('selectize', self);
+			$input.addClass('selectized');
+			self.trigger('initialize');
+	
+			// preload options
+			if (settings.preload === true) {
+				self.onSearchChange('');
+			}
+	
+		},
+	
+		/**
+		 * Sets up default rendering functions.
+		 */
+		setupTemplates: function() {
+			var self = this;
+			var field_label = self.settings.labelField;
+			var field_optgroup = self.settings.optgroupLabelField;
+	
+			var templates = {
+				'optgroup': function(data) {
+					return '<div class="optgroup">' + data.html + '</div>';
+				},
+				'optgroup_header': function(data, escape) {
+					return '<div class="optgroup-header">' + escape(data[field_optgroup]) + '</div>';
+				},
+				'option': function(data, escape) {
+					return '<div class="option">' + escape(data[field_label]) + '</div>';
+				},
+				'item': function(data, escape) {
+					return '<div class="item">' + escape(data[field_label]) + '</div>';
+				},
+				'option_create': function(data, escape) {
+					return '<div class="create">Add <strong>' + escape(data.input) + '</strong>&hellip;</div>';
+				}
+			};
+	
+			self.settings.render = $.extend({}, templates, self.settings.render);
+		},
+	
+		/**
+		 * Maps fired events to callbacks provided
+		 * in the settings used when creating the control.
+		 */
+		setupCallbacks: function() {
+			var key, fn, callbacks = {
+				'initialize'      : 'onInitialize',
+				'change'          : 'onChange',
+				'item_add'        : 'onItemAdd',
+				'item_remove'     : 'onItemRemove',
+				'clear'           : 'onClear',
+				'option_add'      : 'onOptionAdd',
+				'option_remove'   : 'onOptionRemove',
+				'option_clear'    : 'onOptionClear',
+				'optgroup_add'    : 'onOptionGroupAdd',
+				'optgroup_remove' : 'onOptionGroupRemove',
+				'optgroup_clear'  : 'onOptionGroupClear',
+				'dropdown_open'   : 'onDropdownOpen',
+				'dropdown_close'  : 'onDropdownClose',
+				'type'            : 'onType',
+				'load'            : 'onLoad',
+				'focus'           : 'onFocus',
+				'blur'            : 'onBlur'
+			};
+	
+			for (key in callbacks) {
+				if (callbacks.hasOwnProperty(key)) {
+					fn = this.settings[callbacks[key]];
+					if (fn) this.on(key, fn);
+				}
+			}
+		},
+	
+		/**
+		 * Triggered when the main control element
+		 * has a click event.
+		 *
+		 * @param {object} e
+		 * @return {boolean}
+		 */
+		onClick: function(e) {
+			var self = this;
+	
+			// necessary for mobile webkit devices (manual focus triggering
+			// is ignored unless invoked within a click event)
+			if (!self.isFocused) {
+				self.focus();
+				e.preventDefault();
+			}
+		},
+	
+		/**
+		 * Triggered when the main control element
+		 * has a mouse down event.
+		 *
+		 * @param {object} e
+		 * @return {boolean}
+		 */
+		onMouseDown: function(e) {
+			var self = this;
+			var defaultPrevented = e.isDefaultPrevented();
+			var $target = $(e.target);
+	
+			if (self.isFocused) {
+				// retain focus by preventing native handling. if the
+				// event target is the input it should not be modified.
+				// otherwise, text selection within the input won't work.
+				if (e.target !== self.$control_input[0]) {
+					if (self.settings.mode === 'single') {
+						// toggle dropdown
+						self.isOpen ? self.close() : self.open();
+					} else if (!defaultPrevented) {
+						self.setActiveItem(null);
+					}
+					return false;
+				}
+			} else {
+				// give control focus
+				if (!defaultPrevented) {
+					window.setTimeout(function() {
+						self.focus();
+					}, 0);
+				}
+			}
+		},
+	
+		/**
+		 * Triggered when the value of the control has been changed.
+		 * This should propagate the event to the original DOM
+		 * input / select element.
+		 */
+		onChange: function() {
+			this.$input.trigger('change');
+		},
+	
+		/**
+		 * Triggered on <input> paste.
+		 *
+		 * @param {object} e
+		 * @returns {boolean}
+		 */
+		onPaste: function(e) {
+			var self = this;
+	
+			if (self.isFull() || self.isInputHidden || self.isLocked) {
+				e.preventDefault();
+				return;
+			}
+	
+			// If a regex or string is included, this will split the pasted
+			// input and create Items for each separate value
+			if (self.settings.splitOn) {
+	
+				// Wait for pasted text to be recognized in value
+				setTimeout(function() {
+					var pastedText = self.$control_input.val();
+					if(!pastedText.match(self.settings.splitOn)){ return }
+	
+					var splitInput = $.trim(pastedText).split(self.settings.splitOn);
+					for (var i = 0, n = splitInput.length; i < n; i++) {
+						self.createItem(splitInput[i]);
+					}
+				}, 0);
+			}
+		},
+	
+		/**
+		 * Triggered on <input> keypress.
+		 *
+		 * @param {object} e
+		 * @returns {boolean}
+		 */
+		onKeyPress: function(e) {
+			if (this.isLocked) return e && e.preventDefault();
+			var character = String.fromCharCode(e.keyCode || e.which);
+			if (this.settings.create && this.settings.mode === 'multi' && character === this.settings.delimiter) {
+				this.createItem();
+				e.preventDefault();
+				return false;
+			}
+		},
+	
+		/**
+		 * Triggered on <input> keydown.
+		 *
+		 * @param {object} e
+		 * @returns {boolean}
+		 */
+		onKeyDown: function(e) {
+			var isInput = e.target === this.$control_input[0];
+			var self = this;
+	
+			if (self.isLocked) {
+				if (e.keyCode !== KEY_TAB) {
+					e.preventDefault();
+				}
+				return;
+			}
+	
+			switch (e.keyCode) {
+				case KEY_A:
+					if (self.isCmdDown) {
+						self.selectAll();
+						return;
+					}
+					break;
+				case KEY_ESC:
+					if (self.isOpen) {
+						e.preventDefault();
+						e.stopPropagation();
+						self.close();
+					}
+					return;
+				case KEY_N:
+					if (!e.ctrlKey || e.altKey) break;
+				case KEY_DOWN:
+					if (!self.isOpen && self.hasOptions) {
+						self.open();
+					} else if (self.$activeOption) {
+						self.ignoreHover = true;
+						var $next = self.getAdjacentOption(self.$activeOption, 1);
+						if ($next.length) self.setActiveOption($next, true, true);
+					}
+					e.preventDefault();
+					return;
+				case KEY_P:
+					if (!e.ctrlKey || e.altKey) break;
+				case KEY_UP:
+					if (self.$activeOption) {
+						self.ignoreHover = true;
+						var $prev = self.getAdjacentOption(self.$activeOption, -1);
+						if ($prev.length) self.setActiveOption($prev, true, true);
+					}
+					e.preventDefault();
+					return;
+				case KEY_RETURN:
+					if (self.isOpen && self.$activeOption) {
+						self.onOptionSelect({currentTarget: self.$activeOption});
+						e.preventDefault();
+					}
+					return;
+				case KEY_LEFT:
+					self.advanceSelection(-1, e);
+					return;
+				case KEY_RIGHT:
+					self.advanceSelection(1, e);
+					return;
+				case KEY_TAB:
+					if (self.settings.selectOnTab && self.isOpen && self.$activeOption) {
+						self.onOptionSelect({currentTarget: self.$activeOption});
+	
+						// Default behaviour is to jump to the next field, we only want this
+						// if the current field doesn't accept any more entries
+						if (!self.isFull()) {
+							e.preventDefault();
+						}
+					}
+					if (self.settings.create && self.createItem()) {
+						e.preventDefault();
+					}
+					return;
+				case KEY_BACKSPACE:
+				case KEY_DELETE:
+					self.deleteSelection(e);
+					return;
+			}
+	
+			if ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) {
+				e.preventDefault();
+				return;
+			}
+		},
+	
+		/**
+		 * Triggered on <input> keyup.
+		 *
+		 * @param {object} e
+		 * @returns {boolean}
+		 */
+		onKeyUp: function(e) {
+			var self = this;
+	
+			if (self.isLocked) return e && e.preventDefault();
+			var value = self.$control_input.val() || '';
+			if (self.lastValue !== value) {
+				self.lastValue = value;
+				self.onSearchChange(value);
+				self.refreshOptions();
+				self.trigger('type', value);
+			}
+		},
+	
+		/**
+		 * Invokes the user-provide option provider / loader.
+		 *
+		 * Note: this function is debounced in the Selectize
+		 * constructor (by `settings.loadThrottle` milliseconds)
+		 *
+		 * @param {string} value
+		 */
+		onSearchChange: function(value) {
+			var self = this;
+			var fn = self.settings.load;
+			if (!fn) return;
+			if (self.loadedSearches.hasOwnProperty(value)) return;
+			self.loadedSearches[value] = true;
+			self.load(function(callback) {
+				fn.apply(self, [value, callback]);
+			});
+		},
+	
+		/**
+		 * Triggered on <input> focus.
+		 *
+		 * @param {object} e (optional)
+		 * @returns {boolean}
+		 */
+		onFocus: function(e) {
+			var self = this;
+			var wasFocused = self.isFocused;
+	
+			if (self.isDisabled) {
+				self.blur();
+				e && e.preventDefault();
+				return false;
+			}
+	
+			if (self.ignoreFocus) return;
+			self.isFocused = true;
+			if (self.settings.preload === 'focus') self.onSearchChange('');
+	
+			if (!wasFocused) self.trigger('focus');
+	
+			if (!self.$activeItems.length) {
+				self.showInput();
+				self.setActiveItem(null);
+				self.refreshOptions(!!self.settings.openOnFocus);
+			}
+	
+			self.refreshState();
+		},
+	
+		/**
+		 * Triggered on <input> blur.
+		 *
+		 * @param {object} e
+		 * @param {Element} dest
+		 */
+		onBlur: function(e, dest) {
+			var self = this;
+			if (!self.isFocused) return;
+			self.isFocused = false;
+	
+			if (self.ignoreFocus) {
+				return;
+			} else if (!self.ignoreBlur && document.activeElement === self.$dropdown_content[0]) {
+				// necessary to prevent IE closing the dropdown when the scrollbar is clicked
+				self.ignoreBlur = true;
+				self.onFocus(e);
+				return;
+			}
+	
+			var deactivate = function() {
+				self.close();
+				self.setTextboxValue('');
+				self.setActiveItem(null);
+				self.setActiveOption(null);
+				self.setCaret(self.items.length);
+				self.refreshState();
+	
+				// IE11 bug: element still marked as active
+				dest && dest.focus && dest.focus();
+	
+				self.ignoreFocus = false;
+				self.trigger('blur');
+			};
+	
+			self.ignoreFocus = true;
+			if (self.settings.create && self.settings.createOnBlur) {
+				self.createItem(null, false, deactivate);
+			} else {
+				deactivate();
+			}
+		},
+	
+		/**
+		 * Triggered when the user rolls over
+		 * an option in the autocomplete dropdown menu.
+		 *
+		 * @param {object} e
+		 * @returns {boolean}
+		 */
+		onOptionHover: function(e) {
+			if (this.ignoreHover) return;
+			this.setActiveOption(e.currentTarget, false);
+		},
+	
+		/**
+		 * Triggered when the user clicks on an option
+		 * in the autocomplete dropdown menu.
+		 *
+		 * @param {object} e
+		 * @returns {boolean}
+		 */
+		onOptionSelect: function(e) {
+			var value, $target, $option, self = this;
+	
+			if (e.preventDefault) {
+				e.preventDefault();
+				e.stopPropagation();
+			}
+	
+			$target = $(e.currentTarget);
+			if ($target.hasClass('create')) {
+				self.createItem(null, function() {
+					if (self.settings.closeAfterSelect) {
+						self.close();
+					}
+				});
+			} else {
+				value = $target.attr('data-value');
+				if (typeof value !== 'undefined') {
+					self.lastQuery = null;
+					self.setTextboxValue('');
+					self.addItem(value);
+					if (self.settings.closeAfterSelect) {
+						self.close();
+					} else if (!self.settings.hideSelected && e.type && /mouse/.test(e.type)) {
+						self.setActiveOption(self.getOption(value));
+					}
+				}
+			}
+		},
+	
+		/**
+		 * Triggered when the user clicks on an item
+		 * that has been selected.
+		 *
+		 * @param {object} e
+		 * @returns {boolean}
+		 */
+		onItemSelect: function(e) {
+			var self = this;
+	
+			if (self.isLocked) return;
+			if (self.settings.mode === 'multi') {
+				e.preventDefault();
+				self.setActiveItem(e.currentTarget, e);
+			}
+		},
+	
+		/**
+		 * Invokes the provided method that provides
+		 * results to a callback---which are then added
+		 * as options to the control.
+		 *
+		 * @param {function} fn
+		 */
+		load: function(fn) {
+			var self = this;
+			var $wrapper = self.$wrapper.addClass(self.settings.loadingClass);
+	
+			self.loading++;
+			fn.apply(self, [function(results) {
+				self.loading = Math.max(self.loading - 1, 0);
+				if (results && results.length) {
+					self.addOption(results);
+					self.refreshOptions(self.isFocused && !self.isInputHidden);
+				}
+				if (!self.loading) {
+					$wrapper.removeClass(self.settings.loadingClass);
+				}
+				self.trigger('load', results);
+			}]);
+		},
+	
+		/**
+		 * Sets the input field of the control to the specified value.
+		 *
+		 * @param {string} value
+		 */
+		setTextboxValue: function(value) {
+			var $input = this.$control_input;
+			var changed = $input.val() !== value;
+			if (changed) {
+				$input.val(value).triggerHandler('update');
+				this.lastValue = value;
+			}
+		},
+	
+		/**
+		 * Returns the value of the control. If multiple items
+		 * can be selected (e.g. <select multiple>), this returns
+		 * an array. If only one item can be selected, this
+		 * returns a string.
+		 *
+		 * @returns {mixed}
+		 */
+		getValue: function() {
+			if (this.tagType === TAG_SELECT && this.$input.attr('multiple')) {
+				return this.items;
+			} else {
+				return this.items.join(this.settings.delimiter);
+			}
+		},
+	
+		/**
+		 * Resets the selected items to the given value.
+		 *
+		 * @param {mixed} value
+		 */
+		setValue: function(value, silent) {
+			var events = silent ? [] : ['change'];
+	
+			debounce_events(this, events, function() {
+				this.clear(silent);
+				this.addItems(value, silent);
+			});
+		},
+	
+		/**
+		 * Sets the selected item.
+		 *
+		 * @param {object} $item
+		 * @param {object} e (optional)
+		 */
+		setActiveItem: function($item, e) {
+			var self = this;
+			var eventName;
+			var i, idx, begin, end, item, swap;
+			var $last;
+	
+			if (self.settings.mode === 'single') return;
+			$item = $($item);
+	
+			// clear the active selection
+			if (!$item.length) {
+				$(self.$activeItems).removeClass('active');
+				self.$activeItems = [];
+				if (self.isFocused) {
+					self.showInput();
+				}
+				return;
+			}
+	
+			// modify selection
+			eventName = e && e.type.toLowerCase();
+	
+			if (eventName === 'mousedown' && self.isShiftDown && self.$activeItems.length) {
+				$last = self.$control.children('.active:last');
+				begin = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$last[0]]);
+				end   = Array.prototype.indexOf.apply(self.$control[0].childNodes, [$item[0]]);
+				if (begin > end) {
+					swap  = begin;
+					begin = end;
+					end   = swap;
+				}
+				for (i = begin; i <= end; i++) {
+					item = self.$control[0].childNodes[i];
+					if (self.$activeItems.indexOf(item) === -1) {
+						$(item).addClass('active');
+						self.$activeItems.push(item);
+					}
+				}
+				e.preventDefault();
+			} else if ((eventName === 'mousedown' && self.isCtrlDown) || (eventName === 'keydown' && this.isShiftDown)) {
+				if ($item.hasClass('active')) {
+					idx = self.$activeItems.indexOf($item[0]);
+					self.$activeItems.splice(idx, 1);
+					$item.removeClass('active');
+				} else {
+					self.$activeItems.push($item.addClass('active')[0]);
+				}
+			} else {
+				$(self.$activeItems).removeClass('active');
+				self.$activeItems = [$item.addClass('active')[0]];
+			}
+	
+			// ensure control has focus
+			self.hideInput();
+			if (!this.isFocused) {
+				self.focus();
+			}
+		},
+	
+		/**
+		 * Sets the selected item in the dropdown menu
+		 * of available options.
+		 *
+		 * @param {object} $object
+		 * @param {boolean} scroll
+		 * @param {boolean} animate
+		 */
+		setActiveOption: function($option, scroll, animate) {
+			var height_menu, height_item, y;
+			var scroll_top, scroll_bottom;
+			var self = this;
+	
+			if (self.$activeOption) self.$activeOption.removeClass('active');
+			self.$activeOption = null;
+	
+			$option = $($option);
+			if (!$option.length) return;
+	
+			self.$activeOption = $option.addClass('active');
+	
+			if (scroll || !isset(scroll)) {
+	
+				height_menu   = self.$dropdown_content.height();
+				height_item   = self.$activeOption.outerHeight(true);
+				scroll        = self.$dropdown_content.scrollTop() || 0;
+				y             = self.$activeOption.offset().top - self.$dropdown_content.offset().top + scroll;
+				scroll_top    = y;
+				scroll_bottom = y - height_menu + height_item;
+	
+				if (y + height_item > height_menu + scroll) {
+					self.$dropdown_content.stop().animate({scrollTop: scroll_bottom}, animate ? self.settings.scrollDuration : 0);
+				} else if (y < scroll) {
+					self.$dropdown_content.stop().animate({scrollTop: scroll_top}, animate ? self.settings.scrollDuration : 0);
+				}
+	
+			}
+		},
+	
+		/**
+		 * Selects all items (CTRL + A).
+		 */
+		selectAll: function() {
+			var self = this;
+			if (self.settings.mode === 'single') return;
+	
+			self.$activeItems = Array.prototype.slice.apply(self.$control.children(':not(input)').addClass('active'));
+			if (self.$activeItems.length) {
+				self.hideInput();
+				self.close();
+			}
+			self.focus();
+		},
+	
+		/**
+		 * Hides the input element out of view, while
+		 * retaining its focus.
+		 */
+		hideInput: function() {
+			var self = this;
+	
+			self.setTextboxValue('');
+			self.$control_input.css({opacity: 0, position: 'absolute', left: self.rtl ? 10000 : -10000});
+			self.isInputHidden = true;
+		},
+	
+		/**
+		 * Restores input visibility.
+		 */
+		showInput: function() {
+			this.$control_input.css({opacity: 1, position: 'relative', left: 0});
+			this.isInputHidden = false;
+		},
+	
+		/**
+		 * Gives the control focus.
+		 */
+		focus: function() {
+			var self = this;
+			if (self.isDisabled) return;
+	
+			self.ignoreFocus = true;
+			self.$control_input[0].focus();
+			window.setTimeout(function() {
+				self.ignoreFocus = false;
+				self.onFocus();
+			}, 0);
+		},
+	
+		/**
+		 * Forces the control out of focus.
+		 *
+		 * @param {Element} dest
+		 */
+		blur: function(dest) {
+			this.$control_input[0].blur();
+			this.onBlur(null, dest);
+		},
+	
+		/**
+		 * Returns a function that scores an object
+		 * to show how good of a match it is to the
+		 * provided query.
+		 *
+		 * @param {string} query
+		 * @param {object} options
+		 * @return {function}
+		 */
+		getScoreFunction: function(query) {
+			return this.sifter.getScoreFunction(query, this.getSearchOptions());
+		},
+	
+		/**
+		 * Returns search options for sifter (the system
+		 * for scoring and sorting results).
+		 *
+		 * @see https://github.com/brianreavis/sifter.js
+		 * @return {object}
+		 */
+		getSearchOptions: function() {
+			var settings = this.settings;
+			var sort = settings.sortField;
+			if (typeof sort === 'string') {
+				sort = [{field: sort}];
+			}
+	
+			return {
+				fields      : settings.searchField,
+				conjunction : settings.searchConjunction,
+				sort        : sort
+			};
+		},
+	
+		/**
+		 * Searches through available options and returns
+		 * a sorted array of matches.
+		 *
+		 * Returns an object containing:
+		 *
+		 *   - query {string}
+		 *   - tokens {array}
+		 *   - total {int}
+		 *   - items {array}
+		 *
+		 * @param {string} query
+		 * @returns {object}
+		 */
+		search: function(query) {
+			var i, value, score, result, calculateScore;
+			var self     = this;
+			var settings = self.settings;
+			var options  = this.getSearchOptions();
+	
+			// validate user-provided result scoring function
+			if (settings.score) {
+				calculateScore = self.settings.score.apply(this, [query]);
+				if (typeof calculateScore !== 'function') {
+					throw new Error('Selectize "score" setting must be a function that returns a function');
+				}
+			}
+	
+			// perform search
+			if (query !== self.lastQuery) {
+				self.lastQuery = query;
+				result = self.sifter.search(query, $.extend(options, {score: calculateScore}));
+				self.currentResults = result;
+			} else {
+				result = $.extend(true, {}, self.currentResults);
+			}
+	
+			// filter out selected items
+			if (settings.hideSelected) {
+				for (i = result.items.length - 1; i >= 0; i--) {
+					if (self.items.indexOf(hash_key(result.items[i].id)) !== -1) {
+						result.items.splice(i, 1);
+					}
+				}
+			}
+	
+			return result;
+		},
+	
+		/**
+		 * Refreshes the list of available options shown
+		 * in the autocomplete dropdown menu.
+		 *
+		 * @param {boolean} triggerDropdown
+		 */
+		refreshOptions: function(triggerDropdown) {
+			var i, j, k, n, groups, groups_order, option, option_html, optgroup, optgroups, html, html_children, has_create_option;
+			var $active, $active_before, $create;
+	
+			if (typeof triggerDropdown === 'undefined') {
+				triggerDropdown = true;
+			}
+	
+			var self              = this;
+			var query             = $.trim(self.$control_input.val());
+			var results           = self.search(query);
+			var $dropdown_content = self.$dropdown_content;
+			var active_before     = self.$activeOption && hash_key(self.$activeOption.attr('data-value'));
+	
+			// build markup
+			n = results.items.length;
+			if (typeof self.settings.maxOptions === 'number') {
+				n = Math.min(n, self.settings.maxOptions);
+			}
+	
+			// render and group available options individually
+			groups = {};
+			groups_order = [];
+	
+			for (i = 0; i < n; i++) {
+				option      = self.options[results.items[i].id];
+				option_html = self.render('option', option);
+				optgroup    = option[self.settings.optgroupField] || '';
+				optgroups   = $.isArray(optgroup) ? optgroup : [optgroup];
+	
+				for (j = 0, k = optgroups && optgroups.length; j < k; j++) {
+					optgroup = optgroups[j];
+					if (!self.optgroups.hasOwnProperty(optgroup)) {
+						optgroup = '';
+					}
+					if (!groups.hasOwnProperty(optgroup)) {
+						groups[optgroup] = document.createDocumentFragment();
+						groups_order.push(optgroup);
+					}
+					groups[optgroup].appendChild(option_html);
+				}
+			}
+	
+			// sort optgroups
+			if (this.settings.lockOptgroupOrder) {
+				groups_order.sort(function(a, b) {
+					var a_order = self.optgroups[a].$order || 0;
+					var b_order = self.optgroups[b].$order || 0;
+					return a_order - b_order;
+				});
+			}
+	
+			// render optgroup headers & join groups
+			html = document.createDocumentFragment();
+			for (i = 0, n = groups_order.length; i < n; i++) {
+				optgroup = groups_order[i];
+				if (self.optgroups.hasOwnProperty(optgroup) && groups[optgroup].childNodes.length) {
+					// render the optgroup header and options within it,
+					// then pass it to the wrapper template
+					html_children = document.createDocumentFragment();
+					html_children.appendChild(self.render('optgroup_header', self.optgroups[optgroup]));
+					html_children.appendChild(groups[optgroup]);
+	
+					html.appendChild(self.render('optgroup', $.extend({}, self.optgroups[optgroup], {
+						html: domToString(html_children),
+						dom:  html_children
+					})));
+				} else {
+					html.appendChild(groups[optgroup]);
+				}
+			}
+	
+			$dropdown_content.html(html);
+	
+			// highlight matching terms inline
+			if (self.settings.highlight && results.query.length && results.tokens.length) {
+				$dropdown_content.removeHighlight();
+				for (i = 0, n = results.tokens.length; i < n; i++) {
+					highlight($dropdown_content, results.tokens[i].regex);
+				}
+			}
+	
+			// add "selected" class to selected options
+			if (!self.settings.hideSelected) {
+				for (i = 0, n = self.items.length; i < n; i++) {
+					self.getOption(self.items[i]).addClass('selected');
+				}
+			}
+	
+			// add create option
+			has_create_option = self.canCreate(query);
+			if (has_create_option) {
+				$dropdown_content.prepend(self.render('option_create', {input: query}));
+				$create = $($dropdown_content[0].childNodes[0]);
+			}
+	
+			// activate
+			self.hasOptions = results.items.length > 0 || has_create_option;
+			if (self.hasOptions) {
+				if (results.items.length > 0) {
+					$active_before = active_before && self.getOption(active_before);
+					if ($active_before && $active_before.length) {
+						$active = $active_before;
+					} else if (self.settings.mode === 'single' && self.items.length) {
+						$active = self.getOption(self.items[0]);
+					}
+					if (!$active || !$active.length) {
+						if ($create && !self.settings.addPrecedence) {
+							$active = self.getAdjacentOption($create, 1);
+						} else {
+							$active = $dropdown_content.find('[data-selectable]:first');
+						}
+					}
+				} else {
+					$active = $create;
+				}
+				self.setActiveOption($active);
+				if (triggerDropdown && !self.isOpen) { self.open(); }
+			} else {
+				self.setActiveOption(null);
+				if (triggerDropdown && self.isOpen) { self.close(); }
+			}
+		},
+	
+		/**
+		 * Adds an available option. If it already exists,
+		 * nothing will happen. Note: this does not refresh
+		 * the options list dropdown (use `refreshOptions`
+		 * for that).
+		 *
+		 * Usage:
+		 *
+		 *   this.addOption(data)
+		 *
+		 * @param {object|array} data
+		 */
+		addOption: function(data) {
+			var i, n, value, self = this;
+	
+			if ($.isArray(data)) {
+				for (i = 0, n = data.length; i < n; i++) {
+					self.addOption(data[i]);
+				}
+				return;
+			}
+	
+			if (value = self.registerOption(data)) {
+				self.userOptions[value] = true;
+				self.lastQuery = null;
+				self.trigger('option_add', value, data);
+			}
+		},
+	
+		/**
+		 * Registers an option to the pool of options.
+		 *
+		 * @param {object} data
+		 * @return {boolean|string}
+		 */
+		registerOption: function(data) {
+			var key = hash_key(data[this.settings.valueField]);
+			if (typeof key === 'undefined' || key === null || this.options.hasOwnProperty(key)) return false;
+			data.$order = data.$order || ++this.order;
+			this.options[key] = data;
+			return key;
+		},
+	
+		/**
+		 * Registers an option group to the pool of option groups.
+		 *
+		 * @param {object} data
+		 * @return {boolean|string}
+		 */
+		registerOptionGroup: function(data) {
+			var key = hash_key(data[this.settings.optgroupValueField]);
+			if (!key) return false;
+	
+			data.$order = data.$order || ++this.order;
+			this.optgroups[key] = data;
+			return key;
+		},
+	
+		/**
+		 * Registers a new optgroup for options
+		 * to be bucketed into.
+		 *
+		 * @param {string} id
+		 * @param {object} data
+		 */
+		addOptionGroup: function(id, data) {
+			data[this.settings.optgroupValueField] = id;
+			if (id = this.registerOptionGroup(data)) {
+				this.trigger('optgroup_add', id, data);
+			}
+		},
+	
+		/**
+		 * Removes an existing option group.
+		 *
+		 * @param {string} id
+		 */
+		removeOptionGroup: function(id) {
+			if (this.optgroups.hasOwnProperty(id)) {
+				delete this.optgroups[id];
+				this.renderCache = {};
+				this.trigger('optgroup_remove', id);
+			}
+		},
+	
+		/**
+		 * Clears all existing option groups.
+		 */
+		clearOptionGroups: function() {
+			this.optgroups = {};
+			this.renderCache = {};
+			this.trigger('optgroup_clear');
+		},
+	
+		/**
+		 * Updates an option available for selection. If
+		 * it is visible in the selected items or options
+		 * dropdown, it will be re-rendered automatically.
+		 *
+		 * @param {string} value
+		 * @param {object} data
+		 */
+		updateOption: function(value, data) {
+			var self = this;
+			var $item, $item_new;
+			var value_new, index_item, cache_items, cache_options, order_old;
+	
+			value     = hash_key(value);
+			value_new = hash_key(data[self.settings.valueField]);
+	
+			// sanity checks
+			if (value === null) return;
+			if (!self.options.hasOwnProperty(value)) return;
+			if (typeof value_new !== 'string') throw new Error('Value must be set in option data');
+	
+			order_old = self.options[value].$order;
+	
+			// update references
+			if (value_new !== value) {
+				delete self.options[value];
+				index_item = self.items.indexOf(value);
+				if (index_item !== -1) {
+					self.items.splice(index_item, 1, value_new);
+				}
+			}
+			data.$order = data.$order || order_old;
+			self.options[value_new] = data;
+	
+			// invalidate render cache
+			cache_items = self.renderCache['item'];
+			cache_options = self.renderCache['option'];
+	
+			if (cache_items) {
+				delete cache_items[value];
+				delete cache_items[value_new];
+			}
+			if (cache_options) {
+				delete cache_options[value];
+				delete cache_options[value_new];
+			}
+	
+			// update the item if it's selected
+			if (self.items.indexOf(value_new) !== -1) {
+				$item = self.getItem(value);
+				$item_new = $(self.render('item', data));
+				if ($item.hasClass('active')) $item_new.addClass('active');
+				$item.replaceWith($item_new);
+			}
+	
+			// invalidate last query because we might have updated the sortField
+			self.lastQuery = null;
+	
+			// update dropdown contents
+			if (self.isOpen) {
+				self.refreshOptions(false);
+			}
+		},
+	
+		/**
+		 * Removes a single option.
+		 *
+		 * @param {string} value
+		 * @param {boolean} silent
+		 */
+		removeOption: function(value, silent) {
+			var self = this;
+			value = hash_key(value);
+	
+			var cache_items = self.renderCache['item'];
+			var cache_options = self.renderCache['option'];
+			if (cache_items) delete cache_items[value];
+			if (cache_options) delete cache_options[value];
+	
+			delete self.userOptions[value];
+			delete self.options[value];
+			self.lastQuery = null;
+			self.trigger('option_remove', value);
+			self.removeItem(value, silent);
+		},
+	
+		/**
+		 * Clears all options.
+		 */
+		clearOptions: function() {
+			var self = this;
+	
+			self.loadedSearches = {};
+			self.userOptions = {};
+			self.renderCache = {};
+			self.options = self.sifter.items = {};
+			self.lastQuery = null;
+			self.trigger('option_clear');
+			self.clear();
+		},
+	
+		/**
+		 * Returns the jQuery element of the option
+		 * matching the given value.
+		 *
+		 * @param {string} value
+		 * @returns {object}
+		 */
+		getOption: function(value) {
+			return this.getElementWithValue(value, this.$dropdown_content.find('[data-selectable]'));
+		},
+	
+		/**
+		 * Returns the jQuery element of the next or
+		 * previous selectable option.
+		 *
+		 * @param {object} $option
+		 * @param {int} direction  can be 1 for next or -1 for previous
+		 * @return {object}
+		 */
+		getAdjacentOption: function($option, direction) {
+			var $options = this.$dropdown.find('[data-selectable]');
+			var index    = $options.index($option) + direction;
+	
+			return index >= 0 && index < $options.length ? $options.eq(index) : $();
+		},
+	
+		/**
+		 * Finds the first element with a "data-value" attribute
+		 * that matches the given value.
+		 *
+		 * @param {mixed} value
+		 * @param {object} $els
+		 * @return {object}
+		 */
+		getElementWithValue: function(value, $els) {
+			value = hash_key(value);
+	
+			if (typeof value !== 'undefined' && value !== null) {
+				for (var i = 0, n = $els.length; i < n; i++) {
+					if ($els[i].getAttribute('data-value') === value) {
+						return $($els[i]);
+					}
+				}
+			}
+	
+			return $();
+		},
+	
+		/**
+		 * Returns the jQuery element of the item
+		 * matching the given value.
+		 *
+		 * @param {string} value
+		 * @returns {object}
+		 */
+		getItem: function(value) {
+			return this.getElementWithValue(value, this.$control.children());
+		},
+	
+		/**
+		 * "Selects" multiple items at once. Adds them to the list
+		 * at the current caret position.
+		 *
+		 * @param {string} value
+		 * @param {boolean} silent
+		 */
+		addItems: function(values, silent) {
+			var items = $.isArray(values) ? values : [values];
+			for (var i = 0, n = items.length; i < n; i++) {
+				this.isPending = (i < n - 1);
+				this.addItem(items[i], silent);
+			}
+		},
+	
+		/**
+		 * "Selects" an item. Adds it to the list
+		 * at the current caret position.
+		 *
+		 * @param {string} value
+		 * @param {boolean} silent
+		 */
+		addItem: function(value, silent) {
+			var events = silent ? [] : ['change'];
+	
+			debounce_events(this, events, function() {
+				var $item, $option, $options;
+				var self = this;
+				var inputMode = self.settings.mode;
+				var i, active, value_next, wasFull;
+				value = hash_key(value);
+	
+				if (self.items.indexOf(value) !== -1) {
+					if (inputMode === 'single') self.close();
+					return;
+				}
+	
+				if (!self.options.hasOwnProperty(value)) return;
+				if (inputMode === 'single') self.clear(silent);
+				if (inputMode === 'multi' && self.isFull()) return;
+	
+				$item = $(self.render('item', self.options[value]));
+				wasFull = self.isFull();
+				self.items.splice(self.caretPos, 0, value);
+				self.insertAtCaret($item);
+				if (!self.isPending || (!wasFull && self.isFull())) {
+					self.refreshState();
+				}
+	
+				if (self.isSetup) {
+					$options = self.$dropdown_content.find('[data-selectable]');
+	
+					// update menu / remove the option (if this is not one item being added as part of series)
+					if (!self.isPending) {
+						$option = self.getOption(value);
+						value_next = self.getAdjacentOption($option, 1).attr('data-value');
+						self.refreshOptions(self.isFocused && inputMode !== 'single');
+						if (value_next) {
+							self.setActiveOption(self.getOption(value_next));
+						}
+					}
+	
+					// hide the menu if the maximum number of items have been selected or no options are left
+					if (!$options.length || self.isFull()) {
+						self.close();
+					} else {
+						self.positionDropdown();
+					}
+	
+					self.updatePlaceholder();
+					self.trigger('item_add', value, $item);
+					self.updateOriginalInput({silent: silent});
+				}
+			});
+		},
+	
+		/**
+		 * Removes the selected item matching
+		 * the provided value.
+		 *
+		 * @param {string} value
+		 */
+		removeItem: function(value, silent) {
+			var self = this;
+			var $item, i, idx;
+	
+			$item = (value instanceof $) ? value : self.getItem(value);
+			value = hash_key($item.attr('data-value'));
+			i = self.items.indexOf(value);
+	
+			if (i !== -1) {
+				$item.remove();
+				if ($item.hasClass('active')) {
+					idx = self.$activeItems.indexOf($item[0]);
+					self.$activeItems.splice(idx, 1);
+				}
+	
+				self.items.splice(i, 1);
+				self.lastQuery = null;
+				if (!self.settings.persist && self.userOptions.hasOwnProperty(value)) {
+					self.removeOption(value, silent);
+				}
+	
+				if (i < self.caretPos) {
+					self.setCaret(self.caretPos - 1);
+				}
+	
+				self.refreshState();
+				self.updatePlaceholder();
+				self.updateOriginalInput({silent: silent});
+				self.positionDropdown();
+				self.trigger('item_remove', value, $item);
+			}
+		},
+	
+		/**
+		 * Invokes the `create` method provided in the
+		 * selectize options that should provide the data
+		 * for the new item, given the user input.
+		 *
+		 * Once this completes, it will be added
+		 * to the item list.
+		 *
+		 * @param {string} value
+		 * @param {boolean} [triggerDropdown]
+		 * @param {function} [callback]
+		 * @return {boolean}
+		 */
+		createItem: function(input, triggerDropdown) {
+			var self  = this;
+			var caret = self.caretPos;
+			input = input || $.trim(self.$control_input.val() || '');
+	
+			var callback = arguments[arguments.length - 1];
+			if (typeof callback !== 'function') callback = function() {};
+	
+			if (typeof triggerDropdown !== 'boolean') {
+				triggerDropdown = true;
+			}
+	
+			if (!self.canCreate(input)) {
+				callback();
+				return false;
+			}
+	
+			self.lock();
+	
+			var setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {
+				var data = {};
+				data[self.settings.labelField] = input;
+				data[self.settings.valueField] = input;
+				return data;
+			};
+	
+			var create = once(function(data) {
+				self.unlock();
+	
+				if (!data || typeof data !== 'object') return callback();
+				var value = hash_key(data[self.settings.valueField]);
+				if (typeof value !== 'string') return callback();
+	
+				self.setTextboxValue('');
+				self.addOption(data);
+				self.setCaret(caret);
+				self.addItem(value);
+				self.refreshOptions(triggerDropdown && self.settings.mode !== 'single');
+				callback(data);
+			});
+	
+			var output = setup.apply(this, [input, create]);
+			if (typeof output !== 'undefined') {
+				create(output);
+			}
+	
+			return true;
+		},
+	
+		/**
+		 * Re-renders the selected item lists.
+		 */
+		refreshItems: function() {
+			this.lastQuery = null;
+	
+			if (this.isSetup) {
+				this.addItem(this.items);
+			}
+	
+			this.refreshState();
+			this.updateOriginalInput();
+		},
+	
+		/**
+		 * Updates all state-dependent attributes
+		 * and CSS classes.
+		 */
+		refreshState: function() {
+			this.refreshValidityState();
+			this.refreshClasses();
+		},
+	
+		/**
+		 * Update the `required` attribute of both input and control input.
+		 *
+		 * The `required` property needs to be activated on the control input
+		 * for the error to be displayed at the right place. `required` also
+		 * needs to be temporarily deactivated on the input since the input is
+		 * hidden and can't show errors.
+		 */
+		refreshValidityState: function() {
+			if (!this.isRequired) return false;
+	
+			var invalid = !this.items.length;
+	
+			this.isInvalid = invalid;
+			this.$control_input.prop('required', invalid);
+			this.$input.prop('required', !invalid);
+		},
+	
+		/**
+		 * Updates all state-dependent CSS classes.
+		 */
+		refreshClasses: function() {
+			var self     = this;
+			var isFull   = self.isFull();
+			var isLocked = self.isLocked;
+	
+			self.$wrapper
+				.toggleClass('rtl', self.rtl);
+	
+			self.$control
+				.toggleClass('focus', self.isFocused)
+				.toggleClass('disabled', self.isDisabled)
+				.toggleClass('required', self.isRequired)
+				.toggleClass('invalid', self.isInvalid)
+				.toggleClass('locked', isLocked)
+				.toggleClass('full', isFull).toggleClass('not-full', !isFull)
+				.toggleClass('input-active', self.isFocused && !self.isInputHidden)
+				.toggleClass('dropdown-active', self.isOpen)
+				.toggleClass('has-options', !$.isEmptyObject(self.options))
+				.toggleClass('has-items', self.items.length > 0);
+	
+			self.$control_input.data('grow', !isFull && !isLocked);
+		},
+	
+		/**
+		 * Determines whether or not more items can be added
+		 * to the control without exceeding the user-defined maximum.
+		 *
+		 * @returns {boolean}
+		 */
+		isFull: function() {
+			return this.settings.maxItems !== null && this.items.length >= this.settings.maxItems;
+		},
+	
+		/**
+		 * Refreshes the original <select> or <input>
+		 * element to reflect the current state.
+		 */
+		updateOriginalInput: function(opts) {
+			var i, n, options, label, self = this;
+			opts = opts || {};
+	
+			if (self.tagType === TAG_SELECT) {
+				options = [];
+				for (i = 0, n = self.items.length; i < n; i++) {
+					label = self.options[self.items[i]][self.settings.labelField] || '';
+					options.push('<option value="' + escape_html(self.items[i]) + '" selected="selected">' + escape_html(label) + '</option>');
+				}
+				if (!options.length && !this.$input.attr('multiple')) {
+					options.push('<option value="" selected="selected"></option>');
+				}
+				self.$input.html(options.join(''));
+			} else {
+				self.$input.val(self.getValue());
+				self.$input.attr('value',self.$input.val());
+			}
+	
+			if (self.isSetup) {
+				if (!opts.silent) {
+					self.trigger('change', self.$input.val());
+				}
+			}
+		},
+	
+		/**
+		 * Shows/hide the input placeholder depending
+		 * on if there items in the list already.
+		 */
+		updatePlaceholder: function() {
+			if (!this.settings.placeholder) return;
+			var $input = this.$control_input;
+	
+			if (this.items.length) {
+				$input.removeAttr('placeholder');
+			} else {
+				$input.attr('placeholder', this.settings.placeholder);
+			}
+			$input.triggerHandler('update', {force: true});
+		},
+	
+		/**
+		 * Shows the autocomplete dropdown containing
+		 * the available options.
+		 */
+		open: function() {
+			var self = this;
+	
+			if (self.isLocked || self.isOpen || (self.settings.mode === 'multi' && self.isFull())) return;
+			self.focus();
+			self.isOpen = true;
+			self.refreshState();
+			self.$dropdown.css({visibility: 'hidden', display: 'block'});
+			self.positionDropdown();
+			self.$dropdown.css({visibility: 'visible'});
+			self.trigger('dropdown_open', self.$dropdown);
+		},
+	
+		/**
+		 * Closes the autocomplete dropdown menu.
+		 */
+		close: function() {
+			var self = this;
+			var trigger = self.isOpen;
+	
+			if (self.settings.mode === 'single' && self.items.length) {
+				self.hideInput();
+				self.$control_input.blur(); // close keyboard on iOS
+			}
+	
+			self.isOpen = false;
+			self.$dropdown.hide();
+			self.setActiveOption(null);
+			self.refreshState();
+	
+			if (trigger) self.trigger('dropdown_close', self.$dropdown);
+		},
+	
+		/**
+		 * Calculates and applies the appropriate
+		 * position of the dropdown.
+		 */
+		positionDropdown: function() {
+			var $control = this.$control;
+			var offset = this.settings.dropdownParent === 'body' ? $control.offset() : $control.position();
+			offset.top += $control.outerHeight(true);
+	
+			this.$dropdown.css({
+				width : $control.outerWidth(),
+				top   : offset.top,
+				left  : offset.left
+			});
+		},
+	
+		/**
+		 * Resets / clears all selected items
+		 * from the control.
+		 *
+		 * @param {boolean} silent
+		 */
+		clear: function(silent) {
+			var self = this;
+	
+			if (!self.items.length) return;
+			self.$control.children(':not(input)').remove();
+			self.items = [];
+			self.lastQuery = null;
+			self.setCaret(0);
+			self.setActiveItem(null);
+			self.updatePlaceholder();
+			self.updateOriginalInput({silent: silent});
+			self.refreshState();
+			self.showInput();
+			self.trigger('clear');
+		},
+	
+		/**
+		 * A helper method for inserting an element
+		 * at the current caret position.
+		 *
+		 * @param {object} $el
+		 */
+		insertAtCaret: function($el) {
+			var caret = Math.min(this.caretPos, this.items.length);
+			if (caret === 0) {
+				this.$control.prepend($el);
+			} else {
+				$(this.$control[0].childNodes[caret]).before($el);
+			}
+			this.setCaret(caret + 1);
+		},
+	
+		/**
+		 * Removes the current selected item(s).
+		 *
+		 * @param {object} e (optional)
+		 * @returns {boolean}
+		 */
+		deleteSelection: function(e) {
+			var i, n, direction, selection, values, caret, option_select, $option_select, $tail;
+			var self = this;
+	
+			direction = (e && e.keyCode === KEY_BACKSPACE) ? -1 : 1;
+			selection = getSelection(self.$control_input[0]);
+	
+			if (self.$activeOption && !self.settings.hideSelected) {
+				option_select = self.getAdjacentOption(self.$activeOption, -1).attr('data-value');
+			}
+	
+			// determine items that will be removed
+			values = [];
+	
+			if (self.$activeItems.length) {
+				$tail = self.$control.children('.active:' + (direction > 0 ? 'last' : 'first'));
+				caret = self.$control.children(':not(input)').index($tail);
+				if (direction > 0) { caret++; }
+	
+				for (i = 0, n = self.$activeItems.length; i < n; i++) {
+					values.push($(self.$activeItems[i]).attr('data-value'));
+				}
+				if (e) {
+					e.preventDefault();
+					e.stopPropagation();
+				}
+			} else if ((self.isFocused || self.settings.mode === 'single') && self.items.length) {
+				if (direction < 0 && selection.start === 0 && selection.length === 0) {
+					values.push(self.items[self.caretPos - 1]);
+				} else if (direction > 0 && selection.start === self.$control_input.val().length) {
+					values.push(self.items[self.caretPos]);
+				}
+			}
+	
+			// allow the callback to abort
+			if (!values.length || (typeof self.settings.onDelete === 'function' && self.settings.onDelete.apply(self, [values]) === false)) {
+				return false;
+			}
+	
+			// perform removal
+			if (typeof caret !== 'undefined') {
+				self.setCaret(caret);
+			}
+			while (values.length) {
+				self.removeItem(values.pop());
+			}
+	
+			self.showInput();
+			self.positionDropdown();
+			self.refreshOptions(true);
+	
+			// select previous option
+			if (option_select) {
+				$option_select = self.getOption(option_select);
+				if ($option_select.length) {
+					self.setActiveOption($option_select);
+				}
+			}
+	
+			return true;
+		},
+	
+		/**
+		 * Selects the previous / next item (depending
+		 * on the `direction` argument).
+		 *
+		 * > 0 - right
+		 * < 0 - left
+		 *
+		 * @param {int} direction
+		 * @param {object} e (optional)
+		 */
+		advanceSelection: function(direction, e) {
+			var tail, selection, idx, valueLength, cursorAtEdge, $tail;
+			var self = this;
+	
+			if (direction === 0) return;
+			if (self.rtl) direction *= -1;
+	
+			tail = direction > 0 ? 'last' : 'first';
+			selection = getSelection(self.$control_input[0]);
+	
+			if (self.isFocused && !self.isInputHidden) {
+				valueLength = self.$control_input.val().length;
+				cursorAtEdge = direction < 0
+					? selection.start === 0 && selection.length === 0
+					: selection.start === valueLength;
+	
+				if (cursorAtEdge && !valueLength) {
+					self.advanceCaret(direction, e);
+				}
+			} else {
+				$tail = self.$control.children('.active:' + tail);
+				if ($tail.length) {
+					idx = self.$control.children(':not(input)').index($tail);
+					self.setActiveItem(null);
+					self.setCaret(direction > 0 ? idx + 1 : idx);
+				}
+			}
+		},
+	
+		/**
+		 * Moves the caret left / right.
+		 *
+		 * @param {int} direction
+		 * @param {object} e (optional)
+		 */
+		advanceCaret: function(direction, e) {
+			var self = this, fn, $adj;
+	
+			if (direction === 0) return;
+	
+			fn = direction > 0 ? 'next' : 'prev';
+			if (self.isShiftDown) {
+				$adj = self.$control_input[fn]();
+				if ($adj.length) {
+					self.hideInput();
+					self.setActiveItem($adj);
+					e && e.preventDefault();
+				}
+			} else {
+				self.setCaret(self.caretPos + direction);
+			}
+		},
+	
+		/**
+		 * Moves the caret to the specified index.
+		 *
+		 * @param {int} i
+		 */
+		setCaret: function(i) {
+			var self = this;
+	
+			if (self.settings.mode === 'single') {
+				i = self.items.length;
+			} else {
+				i = Math.max(0, Math.min(self.items.length, i));
+			}
+	
+			if(!self.isPending) {
+				// the input must be moved by leaving it in place and moving the
+				// siblings, due to the fact that focus cannot be restored once lost
+				// on mobile webkit devices
+				var j, n, fn, $children, $child;
+				$children = self.$control.children(':not(input)');
+				for (j = 0, n = $children.length; j < n; j++) {
+					$child = $($children[j]).detach();
+					if (j <  i) {
+						self.$control_input.before($child);
+					} else {
+						self.$control.append($child);
+					}
+				}
+			}
+	
+			self.caretPos = i;
+		},
+	
+		/**
+		 * Disables user input on the control. Used while
+		 * items are being asynchronously created.
+		 */
+		lock: function() {
+			this.close();
+			this.isLocked = true;
+			this.refreshState();
+		},
+	
+		/**
+		 * Re-enables user input on the control.
+		 */
+		unlock: function() {
+			this.isLocked = false;
+			this.refreshState();
+		},
+	
+		/**
+		 * Disables user input on the control completely.
+		 * While disabled, it cannot receive focus.
+		 */
+		disable: function() {
+			var self = this;
+			self.$input.prop('disabled', true);
+			self.$control_input.prop('disabled', true).prop('tabindex', -1);
+			self.isDisabled = true;
+			self.lock();
+		},
+	
+		/**
+		 * Enables the control so that it can respond
+		 * to focus and user input.
+		 */
+		enable: function() {
+			var self = this;
+			self.$input.prop('disabled', false);
+			self.$control_input.prop('disabled', false).prop('tabindex', self.tabIndex);
+			self.isDisabled = false;
+			self.unlock();
+		},
+	
+		/**
+		 * Completely destroys the control and
+		 * unbinds all event listeners so that it can
+		 * be garbage collected.
+		 */
+		destroy: function() {
+			var self = this;
+			var eventNS = self.eventNS;
+			var revertSettings = self.revertSettings;
+	
+			self.trigger('destroy');
+			self.off();
+			self.$wrapper.remove();
+			self.$dropdown.remove();
+	
+			self.$input
+				.html('')
+				.append(revertSettings.$children)
+				.removeAttr('tabindex')
+				.removeClass('selectized')
+				.attr({tabindex: revertSettings.tabindex})
+				.show();
+	
+			self.$control_input.removeData('grow');
+			self.$input.removeData('selectize');
+	
+			$(window).off(eventNS);
+			$(document).off(eventNS);
+			$(document.body).off(eventNS);
+	
+			delete self.$input[0].selectize;
+		},
+	
+		/**
+		 * A helper method for rendering "item" and
+		 * "option" templates, given the data.
+		 *
+		 * @param {string} templateName
+		 * @param {object} data
+		 * @returns {string}
+		 */
+		render: function(templateName, data) {
+			var value, id, label;
+			var html = '';
+			var cache = false;
+			var self = this;
+			var regex_tag = /^[\t \r\n]*<([a-z][a-z0-9\-_]*(?:\:[a-z][a-z0-9\-_]*)?)/i;
+	
+			if (templateName === 'option' || templateName === 'item') {
+				value = hash_key(data[self.settings.valueField]);
+				cache = !!value;
+			}
+	
+			// pull markup from cache if it exists
+			if (cache) {
+				if (!isset(self.renderCache[templateName])) {
+					self.renderCache[templateName] = {};
+				}
+				if (self.renderCache[templateName].hasOwnProperty(value)) {
+					return self.renderCache[templateName][value];
+				}
+			}
+	
+			// render markup
+			html = $(self.settings.render[templateName].apply(this, [data, escape_html]));
+	
+			// add mandatory attributes
+			if (templateName === 'option' || templateName === 'option_create') {
+				html.attr('data-selectable', '');
+			}
+			else if (templateName === 'optgroup') {
+				id = data[self.settings.optgroupValueField] || '';
+				html.attr('data-group', id);
+			}
+			if (templateName === 'option' || templateName === 'item') {
+				html.attr('data-value', value || '');
+			}
+	
+			// update cache
+			if (cache) {
+				self.renderCache[templateName][value] = html[0];
+			}
+	
+			return html[0];
+		},
+	
+		/**
+		 * Clears the render cache for a template. If
+		 * no template is given, clears all render
+		 * caches.
+		 *
+		 * @param {string} templateName
+		 */
+		clearCache: function(templateName) {
+			var self = this;
+			if (typeof templateName === 'undefined') {
+				self.renderCache = {};
+			} else {
+				delete self.renderCache[templateName];
+			}
+		},
+	
+		/**
+		 * Determines whether or not to display the
+		 * create item prompt, given a user input.
+		 *
+		 * @param {string} input
+		 * @return {boolean}
+		 */
+		canCreate: function(input) {
+			var self = this;
+			if (!self.settings.create) return false;
+			var filter = self.settings.createFilter;
+			return input.length
+				&& (typeof filter !== 'function' || filter.apply(self, [input]))
+				&& (typeof filter !== 'string' || new RegExp(filter).test(input))
+				&& (!(filter instanceof RegExp) || filter.test(input));
+		}
+	
+	});
+	
+	
+	Selectize.count = 0;
+	Selectize.defaults = {
+		options: [],
+		optgroups: [],
+	
+		plugins: [],
+		delimiter: ',',
+		splitOn: null, // regexp or string for splitting up values from a paste command
+		persist: true,
+		diacritics: true,
+		create: false,
+		createOnBlur: false,
+		createFilter: null,
+		highlight: true,
+		openOnFocus: true,
+		maxOptions: 1000,
+		maxItems: null,
+		hideSelected: null,
+		addPrecedence: false,
+		selectOnTab: false,
+		preload: false,
+		allowEmptyOption: false,
+		closeAfterSelect: false,
+	
+		scrollDuration: 60,
+		loadThrottle: 300,
+		loadingClass: 'loading',
+	
+		dataAttr: 'data-data',
+		optgroupField: 'optgroup',
+		valueField: 'value',
+		labelField: 'text',
+		optgroupLabelField: 'label',
+		optgroupValueField: 'value',
+		lockOptgroupOrder: false,
+	
+		sortField: '$order',
+		searchField: ['text'],
+		searchConjunction: 'and',
+	
+		mode: null,
+		wrapperClass: 'selectize-control',
+		inputClass: 'selectize-input',
+		dropdownClass: 'selectize-dropdown',
+		dropdownContentClass: 'selectize-dropdown-content',
+	
+		dropdownParent: null,
+	
+		copyClassesToDropdown: true,
+	
+		/*
+		load                 : null, // function(query, callback) { ... }
+		score                : null, // function(search) { ... }
+		onInitialize         : null, // function() { ... }
+		onChange             : null, // function(value) { ... }
+		onItemAdd            : null, // function(value, $item) { ... }
+		onItemRemove         : null, // function(value) { ... }
+		onClear              : null, // function() { ... }
+		onOptionAdd          : null, // function(value, data) { ... }
+		onOptionRemove       : null, // function(value) { ... }
+		onOptionClear        : null, // function() { ... }
+		onOptionGroupAdd     : null, // function(id, data) { ... }
+		onOptionGroupRemove  : null, // function(id) { ... }
+		onOptionGroupClear   : null, // function() { ... }
+		onDropdownOpen       : null, // function($dropdown) { ... }
+		onDropdownClose      : null, // function($dropdown) { ... }
+		onType               : null, // function(str) { ... }
+		onDelete             : null, // function(values) { ... }
+		*/
+	
+		render: {
+			/*
+			item: null,
+			optgroup: null,
+			optgroup_header: null,
+			option: null,
+			option_create: null
+			*/
+		}
+	};
+	
+	
+	$.fn.selectize = function(settings_user) {
+		var defaults             = $.fn.selectize.defaults;
+		var settings             = $.extend({}, defaults, settings_user);
+		var attr_data            = settings.dataAttr;
+		var field_label          = settings.labelField;
+		var field_value          = settings.valueField;
+		var field_optgroup       = settings.optgroupField;
+		var field_optgroup_label = settings.optgroupLabelField;
+		var field_optgroup_value = settings.optgroupValueField;
+	
+		/**
+		 * Initializes selectize from a <input type="text"> element.
+		 *
+		 * @param {object} $input
+		 * @param {object} settings_element
+		 */
+		var init_textbox = function($input, settings_element) {
+			var i, n, values, option;
+	
+			var data_raw = $input.attr(attr_data);
+	
+			if (!data_raw) {
+				var value = $.trim($input.val() || '');
+				if (!settings.allowEmptyOption && !value.length) return;
+				values = value.split(settings.delimiter);
+				for (i = 0, n = values.length; i < n; i++) {
+					option = {};
+					option[field_label] = values[i];
+					option[field_value] = values[i];
+					settings_element.options.push(option);
+				}
+				settings_element.items = values;
+			} else {
+				settings_element.options = JSON.parse(data_raw);
+				for (i = 0, n = settings_element.options.length; i < n; i++) {
+					settings_element.items.push(settings_element.options[i][field_value]);
+				}
+			}
+		};
+	
+		/**
+		 * Initializes selectize from a <select> element.
+		 *
+		 * @param {object} $input
+		 * @param {object} settings_element
+		 */
+		var init_select = function($input, settings_element) {
+			var i, n, tagName, $children, order = 0;
+			var options = settings_element.options;
+			var optionsMap = {};
+	
+			var readData = function($el) {
+				var data = attr_data && $el.attr(attr_data);
+				if (typeof data === 'string' && data.length) {
+					return JSON.parse(data);
+				}
+				return null;
+			};
+	
+			var addOption = function($option, group) {
+				$option = $($option);
+	
+				var value = hash_key($option.val());
+				if (!value && !settings.allowEmptyOption) return;
+	
+				// if the option already exists, it's probably been
+				// duplicated in another optgroup. in this case, push
+				// the current group to the "optgroup" property on the
+				// existing option so that it's rendered in both places.
+				if (optionsMap.hasOwnProperty(value)) {
+					if (group) {
+						var arr = optionsMap[value][field_optgroup];
+						if (!arr) {
+							optionsMap[value][field_optgroup] = group;
+						} else if (!$.isArray(arr)) {
+							optionsMap[value][field_optgroup] = [arr, group];
+						} else {
+							arr.push(group);
+						}
+					}
+					return;
+				}
+	
+				var option             = readData($option) || {};
+				option[field_label]    = option[field_label] || $option.text();
+				option[field_value]    = option[field_value] || value;
+				option[field_optgroup] = option[field_optgroup] || group;
+	
+				optionsMap[value] = option;
+				options.push(option);
+	
+				if ($option.is(':selected')) {
+					settings_element.items.push(value);
+				}
+			};
+	
+			var addGroup = function($optgroup) {
+				var i, n, id, optgroup, $options;
+	
+				$optgroup = $($optgroup);
+				id = $optgroup.attr('label');
+	
+				if (id) {
+					optgroup = readData($optgroup) || {};
+					optgroup[field_optgroup_label] = id;
+					optgroup[field_optgroup_value] = id;
+					settings_element.optgroups.push(optgroup);
+				}
+	
+				$options = $('option', $optgroup);
+				for (i = 0, n = $options.length; i < n; i++) {
+					addOption($options[i], id);
+				}
+			};
+	
+			settings_element.maxItems = $input.attr('multiple') ? null : 1;
+	
+			$children = $input.children();
+			for (i = 0, n = $children.length; i < n; i++) {
+				tagName = $children[i].tagName.toLowerCase();
+				if (tagName === 'optgroup') {
+					addGroup($children[i]);
+				} else if (tagName === 'option') {
+					addOption($children[i]);
+				}
+			}
+		};
+	
+		return this.each(function() {
+			if (this.selectize) return;
+	
+			var instance;
+			var $input = $(this);
+			var tag_name = this.tagName.toLowerCase();
+			var placeholder = $input.attr('placeholder') || $input.attr('data-placeholder');
+			if (!placeholder && !settings.allowEmptyOption) {
+				placeholder = $input.children('option[value=""]').text();
+			}
+	
+			var settings_element = {
+				'placeholder' : placeholder,
+				'options'     : [],
+				'optgroups'   : [],
+				'items'       : []
+			};
+	
+			if (tag_name === 'select') {
+				init_select($input, settings_element);
+			} else {
+				init_textbox($input, settings_element);
+			}
+	
+			instance = new Selectize($input, $.extend(true, {}, defaults, settings_element, settings_user));
+		});
+	};
+	
+	$.fn.selectize.defaults = Selectize.defaults;
+	$.fn.selectize.support = {
+		validity: SUPPORTS_VALIDITY_API
+	};
+	
+	
+	Selectize.define('drag_drop', function(options) {
+		if (!$.fn.sortable) throw new Error('The "drag_drop" plugin requires jQuery UI "sortable".');
+		if (this.settings.mode !== 'multi') return;
+		var self = this;
+	
+		self.lock = (function() {
+			var original = self.lock;
+			return function() {
+				var sortable = self.$control.data('sortable');
+				if (sortable) sortable.disable();
+				return original.apply(self, arguments);
+			};
+		})();
+	
+		self.unlock = (function() {
+			var original = self.unlock;
+			return function() {
+				var sortable = self.$control.data('sortable');
+				if (sortable) sortable.enable();
+				return original.apply(self, arguments);
+			};
+		})();
+	
+		self.setup = (function() {
+			var original = self.setup;
+			return function() {
+				original.apply(this, arguments);
+	
+				var $control = self.$control.sortable({
+					items: '[data-value]',
+					forcePlaceholderSize: true,
+					disabled: self.isLocked,
+					start: function(e, ui) {
+						ui.placeholder.css('width', ui.helper.css('width'));
+						$control.css({overflow: 'visible'});
+					},
+					stop: function() {
+						$control.css({overflow: 'hidden'});
+						var active = self.$activeItems ? self.$activeItems.slice() : null;
+						var values = [];
+						$control.children('[data-value]').each(function() {
+							values.push($(this).attr('data-value'));
+						});
+						self.setValue(values);
+						self.setActiveItem(active);
+					}
+				});
+			};
+		})();
+	
+	});
+	
+	Selectize.define('dropdown_header', function(options) {
+		var self = this;
+	
+		options = $.extend({
+			title         : 'Untitled',
+			headerClass   : 'selectize-dropdown-header',
+			titleRowClass : 'selectize-dropdown-header-title',
+			labelClass    : 'selectize-dropdown-header-label',
+			closeClass    : 'selectize-dropdown-header-close',
+	
+			html: function(data) {
+				return (
+					'<div class="' + data.headerClass + '">' +
+						'<div class="' + data.titleRowClass + '">' +
+							'<span class="' + data.labelClass + '">' + data.title + '</span>' +
+							'<a href="javascript:void(0)" class="' + data.closeClass + '">&times;</a>' +
+						'</div>' +
+					'</div>'
+				);
+			}
+		}, options);
+	
+		self.setup = (function() {
+			var original = self.setup;
+			return function() {
+				original.apply(self, arguments);
+				self.$dropdown_header = $(options.html(options));
+				self.$dropdown.prepend(self.$dropdown_header);
+			};
+		})();
+	
+	});
+	
+	Selectize.define('optgroup_columns', function(options) {
+		var self = this;
+	
+		options = $.extend({
+			equalizeWidth  : true,
+			equalizeHeight : true
+		}, options);
+	
+		this.getAdjacentOption = function($option, direction) {
+			var $options = $option.closest('[data-group]').find('[data-selectable]');
+			var index    = $options.index($option) + direction;
+	
+			return index >= 0 && index < $options.length ? $options.eq(index) : $();
+		};
+	
+		this.onKeyDown = (function() {
+			var original = self.onKeyDown;
+			return function(e) {
+				var index, $option, $options, $optgroup;
+	
+				if (this.isOpen && (e.keyCode === KEY_LEFT || e.keyCode === KEY_RIGHT)) {
+					self.ignoreHover = true;
+					$optgroup = this.$activeOption.closest('[data-group]');
+					index = $optgroup.find('[data-selectable]').index(this.$activeOption);
+	
+					if(e.keyCode === KEY_LEFT) {
+						$optgroup = $optgroup.prev('[data-group]');
+					} else {
+						$optgroup = $optgroup.next('[data-group]');
+					}
+	
+					$options = $optgroup.find('[data-selectable]');
+					$option  = $options.eq(Math.min($options.length - 1, index));
+					if ($option.length) {
+						this.setActiveOption($option);
+					}
+					return;
+				}
+	
+				return original.apply(this, arguments);
+			};
+		})();
+	
+		var getScrollbarWidth = function() {
+			var div;
+			var width = getScrollbarWidth.width;
+			var doc = document;
+	
+			if (typeof width === 'undefined') {
+				div = doc.createElement('div');
+				div.innerHTML = '<div style="width:50px;height:50px;position:absolute;left:-50px;top:-50px;overflow:auto;"><div style="width:1px;height:100px;"></div></div>';
+				div = div.firstChild;
+				doc.body.appendChild(div);
+				width = getScrollbarWidth.width = div.offsetWidth - div.clientWidth;
+				doc.body.removeChild(div);
+			}
+			return width;
+		};
+	
+		var equalizeSizes = function() {
+			var i, n, height_max, width, width_last, width_parent, $optgroups;
+	
+			$optgroups = $('[data-group]', self.$dropdown_content);
+			n = $optgroups.length;
+			if (!n || !self.$dropdown_content.width()) return;
+	
+			if (options.equalizeHeight) {
+				height_max = 0;
+				for (i = 0; i < n; i++) {
+					height_max = Math.max(height_max, $optgroups.eq(i).height());
+				}
+				$optgroups.css({height: height_max});
+			}
+	
+			if (options.equalizeWidth) {
+				width_parent = self.$dropdown_content.innerWidth() - getScrollbarWidth();
+				width = Math.round(width_parent / n);
+				$optgroups.css({width: width});
+				if (n > 1) {
+					width_last = width_parent - width * (n - 1);
+					$optgroups.eq(n - 1).css({width: width_last});
+				}
+			}
+		};
+	
+		if (options.equalizeHeight || options.equalizeWidth) {
+			hook.after(this, 'positionDropdown', equalizeSizes);
+			hook.after(this, 'refreshOptions', equalizeSizes);
+		}
+	
+	
+	});
+	
+	Selectize.define('remove_button', function(options) {
+		options = $.extend({
+				label     : '&times;',
+				title     : 'Remove',
+				className : 'remove',
+				append    : true
+			}, options);
+	
+			var singleClose = function(thisRef, options) {
+	
+				options.className = 'remove-single';
+	
+				var self = thisRef;
+				var html = '<a href="javascript:void(0)" class="' + options.className + '" tabindex="-1" title="' + escape_html(options.title) + '">' + options.label + '</a>';
+	
+				/**
+				 * Appends an element as a child (with raw HTML).
+				 *
+				 * @param {string} html_container
+				 * @param {string} html_element
+				 * @return {string}
+				 */
+				var append = function(html_container, html_element) {
+					return html_container + html_element;
+				};
+	
+				thisRef.setup = (function() {
+					var original = self.setup;
+					return function() {
+						// override the item rendering method to add the button to each
+						if (options.append) {
+							var id = $(self.$input.context).attr('id');
+							var selectizer = $('#'+id);
+	
+							var render_item = self.settings.render.item;
+							self.settings.render.item = function(data) {
+								return append(render_item.apply(thisRef, arguments), html);
+							};
+						}
+	
+						original.apply(thisRef, arguments);
+	
+						// add event listener
+						thisRef.$control.on('click', '.' + options.className, function(e) {
+							e.preventDefault();
+							if (self.isLocked) return;
+	
+							self.clear();
+						});
+	
+					};
+				})();
+			};
+	
+			var multiClose = function(thisRef, options) {
+	
+				var self = thisRef;
+				var html = '<a href="javascript:void(0)" class="' + options.className + '" tabindex="-1" title="' + escape_html(options.title) + '">' + options.label + '</a>';
+	
+				/**
+				 * Appends an element as a child (with raw HTML).
+				 *
+				 * @param {string} html_container
+				 * @param {string} html_element
+				 * @return {string}
+				 */
+				var append = function(html_container, html_element) {
+					var pos = html_container.search(/(<\/[^>]+>\s*)$/);
+					return html_container.substring(0, pos) + html_element + html_container.substring(pos);
+				};
+	
+				thisRef.setup = (function() {
+					var original = self.setup;
+					return function() {
+						// override the item rendering method to add the button to each
+						if (options.append) {
+							var render_item = self.settings.render.item;
+							self.settings.render.item = function(data) {
+								return append(render_item.apply(thisRef, arguments), html);
+							};
+						}
+	
+						original.apply(thisRef, arguments);
+	
+						// add event listener
+						thisRef.$control.on('click', '.' + options.className, function(e) {
+							e.preventDefault();
+							if (self.isLocked) return;
+	
+							var $item = $(e.currentTarget).parent();
+							self.setActiveItem($item);
+							if (self.deleteSelection()) {
+								self.setCaret(self.items.length);
+							}
+						});
+	
+					};
+				})();
+			};
+	
+			if (this.settings.mode === 'single') {
+				singleClose(this, options);
+				return;
+			} else {
+				multiClose(this, options);
+			}
+	});
+	
+	
+	Selectize.define('restore_on_backspace', function(options) {
+		var self = this;
+	
+		options.text = options.text || function(option) {
+			return option[this.settings.labelField];
+		};
+	
+		this.onKeyDown = (function() {
+			var original = self.onKeyDown;
+			return function(e) {
+				var index, option;
+				if (e.keyCode === KEY_BACKSPACE && this.$control_input.val() === '' && !this.$activeItems.length) {
+					index = this.caretPos - 1;
+					if (index >= 0 && index < this.items.length) {
+						option = this.options[this.items[index]];
+						if (this.deleteSelection(e)) {
+							this.setTextboxValue(options.text.apply(this, [option]));
+							this.refreshOptions(true);
+						}
+						e.preventDefault();
+						return;
+					}
+				}
+				return original.apply(this, arguments);
+			};
+		})();
+	});
+	
+
+	return Selectize;
+}));
\ No newline at end of file
diff --git a/problems_list.json b/problems_list.json
new file mode 100644
index 0000000..5895444
--- /dev/null
+++ b/problems_list.json
@@ -0,0 +1,14546 @@
+[
+  {
+    "Id": 1,
+    "Type": "Coding",
+    "Name": "Median of Arrays",
+    "Origin": "Byte by Byte",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ByteByByte/src/CodingInterviewQuestions/Array/P1_MedianOfArrays",
+    "Companies": [],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Searching"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 2,
+    "Type": "Coding",
+    "Name": "0-1 Knapsack",
+    "Origin": "Byte by Byte",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ByteByByte/src/CodingInterviewQuestions/Array/P2_01Knapsack",
+    "Companies": [],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 3,
+    "Type": "Coding",
+    "Name": "BTree Printer",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/BTreePrinter",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 4,
+    "Type": "Coding",
+    "Name": "Linked List Node",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/LinkedListNode",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 5,
+    "Type": "Coding",
+    "Name": "Tree Node",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/TreeNode",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 6,
+    "Type": "Coding",
+    "Name": "Trie",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/Trie",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 7,
+    "Type": "Coding",
+    "Name": "Trie Node",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/TrieNode",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 8,
+    "Type": "Coding",
+    "Name": "ArrayList",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q0_Introduction/ArrayList",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Known Data Structures"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 9,
+    "Type": "Coding",
+    "Name": "HashTable",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q0_Introduction/HashTable",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Known Data Structures"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 10,
+    "Type": "Coding",
+    "Name": "StringBuilder",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q0_Introduction/StringBuilder",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Known Data Structures"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 11,
+    "Type": "Coding",
+    "Name": "Q1 Is Unique",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q1_IsUnique",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays",
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 12,
+    "Type": "Coding",
+    "Name": "Q2 Check Permutation",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q2_CheckPermutation",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays",
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 13,
+    "Type": "Coding",
+    "Name": "Q3 URLify",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q3_URLify",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays",
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 14,
+    "Type": "Coding",
+    "Name": "Q4 Palindrome Permutation",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q4_PalindromePermutation",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays",
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 15,
+    "Type": "Coding",
+    "Name": "Linked List",
+    "Origin": "Cracking the Coding Interview",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch02_LinkedLists",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Python"
+    ]
+  },
+  {
+    "Id": 16,
+    "Type": "Coding",
+    "Name": "1. Two Sum",
+    "Origin": "Daily Coding Problem",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P1_TwoSum",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 17,
+    "Type": "Coding",
+    "Name": "2. Product of Array Except Self",
+    "Origin": "Daily Coding Problem",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P2_ProductOfArrayExceptSelf",
+    "Companies": [
+      "Uber"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 18,
+    "Type": "Coding",
+    "Name": "3. Serialize and Deserialize Binary Tree",
+    "Origin": "Daily Coding Problem",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P3_SerializeAndDeserializeBinaryTree",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Tree",
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 19,
+    "Type": "Coding",
+    "Name": "4. First Missing Positive",
+    "Origin": "Daily Coding Problem",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P4_FirstMissingPositive",
+    "Companies": [
+      "Stripe"
+    ],
+    "Categories": [
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 20,
+    "Type": "Coding",
+    "Name": "5. First and Last Element of Pair",
+    "Origin": "Daily Coding Problem",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P5_FirstAndLastElementOfPair",
+    "Companies": [
+      "Jane Street"
+    ],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 21,
+    "Type": "Coding",
+    "Name": "205. Next Permutation Of Integer In Absolute Order",
+    "Origin": "Daily Coding Problem",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P201_300/P205_NextPermutationOfIntegerInAbsoluteOrder",
+    "Companies": [
+      "IBM"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 22,
+    "Type": "Coding",
+    "Name": "1. Add two numbers as a linked list",
+    "Origin": "Daily Interview Pro",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P1_AddTwoNumbersAsALinkedList",
+    "Companies": [
+      "Microsoft"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 23,
+    "Type": "Coding",
+    "Name": "2. Longest Substring Without Repeating Characters",
+    "Origin": "Daily Interview Pro",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P2_LongestSubstringWithoutRepeatingCharacters",
+    "Companies": [
+      "Microsoft"
+    ],
+    "Categories": [
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Arrays",
+      "Sliding Window"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 24,
+    "Type": "Coding",
+    "Name": "3. Longest Palindromic Substring",
+    "Origin": "Daily Interview Pro",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P3_LongestPalindromicSubstring",
+    "Companies": [
+      "Twitter"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 25,
+    "Type": "Coding",
+    "Name": "4. Validate Balanced Parentheses",
+    "Origin": "Daily Interview Pro",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P4_ValidateBalancedParentheses",
+    "Companies": [
+      "Uber"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 26,
+    "Type": "Course",
+    "Name": "Grokking the Coding Interview: Patterns for Coding Questions",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 27,
+    "Type": "Coding",
+    "Name": "Maximum Sum Subarray of Size K",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P1_MaximumSumSubarrayOfSizeK",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java",
+      "Python"
+    ]
+  },
+  {
+    "Id": 28,
+    "Type": "Coding",
+    "Name": "Smallest Subarray with a given sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P2_SmallestSubarrayWithAGivenSum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java",
+      "Python"
+    ]
+  },
+  {
+    "Id": 29,
+    "Type": "Coding",
+    "Name": "Longest Substring with K Distinct Character",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P3_LongestSubstringWithKDistinctCharacters",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 30,
+    "Type": "Coding",
+    "Name": "Fruits into Baskets",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P4_FruitsIntoBaskets",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 31,
+    "Type": "Coding",
+    "Name": "No-repeat Substring",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P5_NoRepeatSubstring",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 32,
+    "Type": "Coding",
+    "Name": "Longest Substring with Same Letters after Replacement",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P6_LongestSubstringWithSameLettersAfterReplacement",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 33,
+    "Type": "Coding",
+    "Name": "Longest Subarray with Ones after Replacement",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P7_LongestSubarrayWithOnesAfterReplacement",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 34,
+    "Type": "Coding",
+    "Name": "Permutation in a String",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC1_PermutationInAString",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 35,
+    "Type": "Coding",
+    "Name": "String Anagrams",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC2_StringAnagrams",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 36,
+    "Type": "Coding",
+    "Name": "Smallest Window containing Substring",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC3_SmallestWindowContainingSubstring",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 37,
+    "Type": "Coding",
+    "Name": "Words Concatenation",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC4_WordsConcatenation",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 38,
+    "Type": "Coding",
+    "Name": "Average of Subarray of Size K",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/_Introduction_P0_AverageOfSubarrayOfSizeK",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Sliding Window"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java",
+      "Python"
+    ]
+  },
+  {
+    "Id": 39,
+    "Type": "Coding",
+    "Name": "Pair with Target Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P1_PairWithTargetSum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 40,
+    "Type": "Coding",
+    "Name": "Remove Duplicates",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P2_RemoveDuplicates",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 41,
+    "Type": "Coding",
+    "Name": "Remove All Instances of K",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P2_RemoveDuplicates/Variants/P1_RemoveAllInstancesOfK",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 42,
+    "Type": "Coding",
+    "Name": "Squaring a Sorted Array",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P3_SquaringASortedArray",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 43,
+    "Type": "Coding",
+    "Name": "Triplet Sum to Zero",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P4_TripletSumToZero",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 44,
+    "Type": "Coding",
+    "Name": "Triplet Sum Close to Target",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P5_TripleSumCloseToTarget",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 45,
+    "Type": "Coding",
+    "Name": "Triplets with Smaller Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P6_TripletsWithSmallerSum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 46,
+    "Type": "Coding",
+    "Name": "Return Triplets with Smaller Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P6_TripletsWithSmallerSum/_Variants/P1_ReturnTripletsWithSmallerSum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 47,
+    "Type": "Coding",
+    "Name": "Subarrays with Product Less than a Target",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P7_SubarraysWithProductLessThanATarget",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 48,
+    "Type": "Coding",
+    "Name": "Dutch National Flag Problem",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P8_DutchNationalFlagProblem",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 49,
+    "Type": "Coding",
+    "Name": "Quadruple Sum to Target",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC1_QuadrupleSumToTarget",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 50,
+    "Type": "Coding",
+    "Name": "Comparing Strings containing Backspaces",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC2_ComparingStringsContainingBackspaces",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 51,
+    "Type": "Coding",
+    "Name": "Minimum Window Sort",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC3_MinimumWindowSort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 52,
+    "Type": "Coding",
+    "Name": "Maximum Trapping Water",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC4_MaximumTrappingWater",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 53,
+    "Type": "Coding",
+    "Name": "LinkedList Cycle",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P1_LinkedListCycle",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 54,
+    "Type": "Coding",
+    "Name": "Length of Linked List Cycle",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P1_LinkedListCycle/_Variants/P1_LengthOfLinkedListCycle",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 55,
+    "Type": "Coding",
+    "Name": "Start of LinkedList Cycle",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P2_StartOfLinkedListCycle",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 56,
+    "Type": "Coding",
+    "Name": "Happy Number",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P3_HappyNumber",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 57,
+    "Type": "Coding",
+    "Name": "Middle of the LinkedList",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P4_MiddleOfTheLinkedList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 58,
+    "Type": "Coding",
+    "Name": "Palindrome LinkedList",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/PC1_PalindromeLinkedList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 59,
+    "Type": "Coding",
+    "Name": "Rearrange a LinkedList",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/PC2_RearrangeALinkedList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 60,
+    "Type": "Coding",
+    "Name": "Cycle in a Circular Array",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/PC3_CycleInACircularArray",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Fast and Slow Pointers"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 61,
+    "Type": "Coding",
+    "Name": "Merge Intervals",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P1_MergeIntervals",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 62,
+    "Type": "Coding",
+    "Name": "Find If Intervals Overlap",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P1_MergeIntervals/_Variants/FindIfIntervalsOverlap",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 63,
+    "Type": "Coding",
+    "Name": "Insert Interval",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P2_InsertInterval",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 64,
+    "Type": "Coding",
+    "Name": "Intervals Intersection",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P3_IntervalsIntersection",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 65,
+    "Type": "Coding",
+    "Name": "Conflicting Appointments",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P4_ConflictingAppointments",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 66,
+    "Type": "Coding",
+    "Name": "Find All Conflicting Appointments",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P4_ConflictingAppointments/_Variants/P1_FindAllConflictingAppointments",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 67,
+    "Type": "Coding",
+    "Name": "Minimum Meeting Rooms",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC1_MinimumMeetingRooms",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 68,
+    "Type": "Coding",
+    "Name": "Maximum Number Of Intervals Overlap Point",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC1_MinimumMeetingRooms/_Variants/P1_MaximumNumberOfIntervalsOverlapPoint",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 69,
+    "Type": "Coding",
+    "Name": "Minimum Number of Platforms for Train Station",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC1_MinimumMeetingRooms/_Variants/P2_MinimumNumberOfPlatformsForTrainStation",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 70,
+    "Type": "Coding",
+    "Name": "Maximum CPU Load",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC2_MaximumCpuLoad",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 71,
+    "Type": "Coding",
+    "Name": "Employee Free Time",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC3_EmployeeFreeTime",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Merge Intervals"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 72,
+    "Type": "Coding",
+    "Name": "Cyclic Sort",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P1_CyclicSort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 73,
+    "Type": "Coding",
+    "Name": "Find the Missing Number",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P2_FindTheMissingNumber",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 74,
+    "Type": "Coding",
+    "Name": "Find all Missing Numbers",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P3_FindAllMissingNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 75,
+    "Type": "Coding",
+    "Name": "Find the Duplicate Number",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P4_FindTheDuplicateNumber",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 76,
+    "Type": "Coding",
+    "Name": "Find all Duplicate Numbers",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P5_FindAllDuplicateNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 77,
+    "Type": "Coding",
+    "Name": "Find the Corrupt Pair",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/PC1_FindTheCorruptPair",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 78,
+    "Type": "Coding",
+    "Name": "Find the Smallest Missing Positive Number",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/PC2_FindTheSmallestMissingPositiveNumber",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 79,
+    "Type": "Coding",
+    "Name": "Find the First K Missing Positive Numbers",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/PC3_FindTheFirstKMissingPositiveNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Cyclic Sort"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 80,
+    "Type": "Coding",
+    "Name": "Reverse a LinkedList",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P1_ReverseALinkedList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> In-place Reversal of a LinkedList"
+    ],
+    "Tags": [
+      "LinkedList"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 81,
+    "Type": "Coding",
+    "Name": "Reverse a Sub-list",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P2_ReverseASubList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> In-place Reversal of a LinkedList"
+    ],
+    "Tags": [
+      "LinkedList"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 82,
+    "Type": "Coding",
+    "Name": "Reverse First K Elements of a LinkedList",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P2_ReverseASubList/_Variants/P1_ReverseFirstKElementsOfLinkedList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> In-place Reversal of a LinkedList"
+    ],
+    "Tags": [
+      "LinkedList"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 83,
+    "Type": "Coding",
+    "Name": "Reverse LinkedList based on Even or Odd Size",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P2_ReverseASubList/_Variants/P2_ReverseLinkedListEvenOddSize",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> In-place Reversal of a LinkedList"
+    ],
+    "Tags": [
+      "LinkedList"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 84,
+    "Type": "Coding",
+    "Name": "Reverse every K-element Sub-list",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P3_ReverseEveryKElementSubList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> In-place Reversal of a LinkedList"
+    ],
+    "Tags": [
+      "LinkedList"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 85,
+    "Type": "Coding",
+    "Name": "Reverse alternating K-element Sub-list",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/PC1_ReverseAlternatingKElementSubList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> In-place Reversal of a LinkedList"
+    ],
+    "Tags": [
+      "LinkedList"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 86,
+    "Type": "Coding",
+    "Name": "Rotate a LinkedList",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/PC2_RotateALinkedList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> In-place Reversal of a LinkedList"
+    ],
+    "Tags": [
+      "LinkedList"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 87,
+    "Type": "Coding",
+    "Name": "Binary Tree Level Order Traversal",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P1_BinaryTreeLevelOrderTraversal",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 88,
+    "Type": "Coding",
+    "Name": "Reverse Level Order Traversal",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P2_ReverseLevelOrderTraversal",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 89,
+    "Type": "Coding",
+    "Name": "Zigzag Traversal",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P3_ZigzagTraversal",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 90,
+    "Type": "Coding",
+    "Name": "Level Averages in a Binary Tree",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P4_LevelAveragesInABinaryTree",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 91,
+    "Type": "Coding",
+    "Name": "Largest Value on Each Level of a Binary Tree",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P4_LevelAveragesInABinaryTree/_Variants/P1_LargestValueOnEachLevelOfABinaryTree",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 92,
+    "Type": "Coding",
+    "Name": "Minimum Depth of a Binary Tree",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P5_MinimumDepthOfABinaryTree",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 93,
+    "Type": "Coding",
+    "Name": "Maximum Depth of a Binary Tree",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P5_MinimumDepthOfABinaryTree/_Variants/P1_MaximumDepthOfABinaryTree",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 94,
+    "Type": "Coding",
+    "Name": "Level Order Successor",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P6_LevelOrderSuccessor",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 95,
+    "Type": "Coding",
+    "Name": "Connect Level Order Siblings",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P7_ConnectLevelOrderSiblings",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 96,
+    "Type": "Coding",
+    "Name": "Connect All Level Order Siblings",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/PC1_ConnectAllLevelOrderSiblings",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 97,
+    "Type": "Coding",
+    "Name": "Right View of a Binary Tree",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/PC2_RightViewOfABinaryTree",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 98,
+    "Type": "Coding",
+    "Name": "Left View of a Binary Tree",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/PC2_RightViewOfABinaryTree/_Variants/P1_LeftViewOfABinaryTree",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Breadth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Breadth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 99,
+    "Type": "Coding",
+    "Name": "Binary Tree Path Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P1_BinaryTreePathSum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 100,
+    "Type": "Coding",
+    "Name": "All Paths for a Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P2_AllPathsForASum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 101,
+    "Type": "Coding",
+    "Name": "All Root to Leaf Paths",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P2_AllPathsForASum/_Variants/P1_AllRootToLeafPaths",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 102,
+    "Type": "Coding",
+    "Name": "Root to Leaf Path with Maximum Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P2_AllPathsForASum/_Variants/P2_RootToLeafPathMaxSum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 103,
+    "Type": "Coding",
+    "Name": "Sum of Path Numbers",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P3_SumOfPathNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 104,
+    "Type": "Coding",
+    "Name": "Path With Given Sequence",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P4_PathWithGivenSequence",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 105,
+    "Type": "Coding",
+    "Name": "Count Paths for a Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P5_CountPathsForASum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 106,
+    "Type": "Coding",
+    "Name": "Tree Diameter",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/PC1_TreeDiameter",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 107,
+    "Type": "Coding",
+    "Name": "Path with Maximum Sum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/PC2_PathWithMaximumSum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Tree Depth First Search"
+    ],
+    "Tags": [
+      "Binary Tree",
+      "Depth First Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 108,
+    "Type": "Coding",
+    "Name": "Find the Median of a Number Stream",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/P1_FindTheMedianOfANumberStream",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Two Heaps"
+    ],
+    "Tags": [
+      "Two Heaps"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 109,
+    "Type": "Coding",
+    "Name": "Sliding Window Median",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/P2_SlidingWindowMedian",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Two Heaps"
+    ],
+    "Tags": [
+      "Two Heaps"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 110,
+    "Type": "Coding",
+    "Name": "Maximize Capital",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/P3_MaximizeCapital",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Two Heaps"
+    ],
+    "Tags": [
+      "Two Heaps"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 111,
+    "Type": "Coding",
+    "Name": "Next Interval",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/PC1_NextInterval",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Two Heaps"
+    ],
+    "Tags": [
+      "Two Heaps"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 112,
+    "Type": "Coding",
+    "Name": "Subsets",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P1_Subsets",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 113,
+    "Type": "Coding",
+    "Name": "Subsets With Duplicates",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P2_SubsetsWithDuplicates",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 114,
+    "Type": "Coding",
+    "Name": "Permutations",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P3_Permutations",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 115,
+    "Type": "Coding",
+    "Name": "String Permutations by changing case",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P4_StringPermutationsByChangingCase",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 116,
+    "Type": "Coding",
+    "Name": "Balanced Parentheses",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P5_BalancedParentheses",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 117,
+    "Type": "Coding",
+    "Name": "Unique Generalized Abbreviations",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P6_UniqueGeneralizedAbbreviations",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 118,
+    "Type": "Coding",
+    "Name": "Evaluate Expression",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/PC1_EvaluateExpression",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 119,
+    "Type": "Coding",
+    "Name": "Structurally Unique Binary Search Trees",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/PC2_StructurallyUniqueBinarySearchTrees",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 120,
+    "Type": "Coding",
+    "Name": "Count of Structurally Unique Binary Search Trees",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/PC3_CountOfStructurallyUniqueBinarySearchTrees",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Subsets"
+    ],
+    "Tags": [
+      "Subsets"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 121,
+    "Type": "Coding",
+    "Name": "Order-agnostic Binary Search",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P1_OrderAgnosticBinarySearch",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 122,
+    "Type": "Coding",
+    "Name": "Ceiling of a Number",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P2_CeilingOfANumber",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 123,
+    "Type": "Coding",
+    "Name": "Floor of a Number",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P2_CeilingOfANumber/_Variants/P1_FloorOfANumber",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 124,
+    "Type": "Coding",
+    "Name": "Next Letter",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P3_NextLetter",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 125,
+    "Type": "Coding",
+    "Name": "Number Range",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P4_NumberRange",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 126,
+    "Type": "Coding",
+    "Name": "Search in a Sorted Infinite Array",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P5_SearchInASortedInfiniteArray",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 127,
+    "Type": "Coding",
+    "Name": "Minimum Difference Element",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P6_MinimumDifferenceElement",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 128,
+    "Type": "Coding",
+    "Name": "Bitonic Array Maximum",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P7_BitonicArrayMaximum",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 129,
+    "Type": "Coding",
+    "Name": "Search Bitonic Array",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC1_SearchBitonicArray",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 130,
+    "Type": "Coding",
+    "Name": "Search in Rotated Array",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC2_SearchInRotatedArray",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 131,
+    "Type": "Coding",
+    "Name": "Search in Rotated Array with Duplicates",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC2_SearchInRotatedArray/_Variants/P1_SearchInRotatedArrayWithDuplicates",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 132,
+    "Type": "Coding",
+    "Name": "Rotation Count",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC3_RotationCount",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 133,
+    "Type": "Coding",
+    "Name": "Rotation Count with Duplicates",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC3_RotationCount/_Variants/P1_RotationCountWithDuplicates",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Modified Binary Search"
+    ],
+    "Tags": [
+      "Modified Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 134,
+    "Type": "Coding",
+    "Name": "Sum of Elements",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P10_SumOfElements",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 135,
+    "Type": "Coding",
+    "Name": "Rearrange String",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P11_RearrangeString",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 136,
+    "Type": "Coding",
+    "Name": "Top 'K' Numbers",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P1_TopKNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 137,
+    "Type": "Coding",
+    "Name": "Kth Smallest Number",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P2_KthSmallestNumber",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 138,
+    "Type": "Coding",
+    "Name": "'K' Closest Points to the Origin",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P3_KClosestPointsToTheOrigin",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 139,
+    "Type": "Coding",
+    "Name": "Connect Ropes",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P4_ConnectRopes",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Easy",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 140,
+    "Type": "Coding",
+    "Name": "Top 'K' Frequent Numbers",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P5_TopKFrequentNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 141,
+    "Type": "Coding",
+    "Name": "Frequency Sort",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P6_FrequencySort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 142,
+    "Type": "Coding",
+    "Name": "Kth Largest Number in a Stream",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P7_KthLargestNumberInAStream",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 143,
+    "Type": "Coding",
+    "Name": "'K' Closest Numbers",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P8_KClosestNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 144,
+    "Type": "Coding",
+    "Name": "Maximum Distinct Elements",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P9_MaximumDistinctEKements",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 145,
+    "Type": "Coding",
+    "Name": "Rearrange String K Distance Apart",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/PC1_RearrangeStringKDistanceApart",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 146,
+    "Type": "Coding",
+    "Name": "Scheduling Tasks",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/PC2_SchedulingTasks",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 147,
+    "Type": "Coding",
+    "Name": "Frequency Stack",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/PC3_FrequencyStack",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> Top K Elements"
+    ],
+    "Tags": [
+      "Top K Elements"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 148,
+    "Type": "Coding",
+    "Name": "Merge K Sorted Lists",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P1_MergeKSortedLists",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> K Way Merge"
+    ],
+    "Tags": [
+      "K Way Merge"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 149,
+    "Type": "Coding",
+    "Name": "Kth Smallest Number in M Sorted Lists",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P2_KthSmallestNumberInMSortedLists",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> K Way Merge"
+    ],
+    "Tags": [
+      "K Way Merge"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 150,
+    "Type": "Coding",
+    "Name": "Median Among M Sorted Arrays",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P2_KthSmallestNumberInMSortedLists/_Variants/P1_MedianAmongMSortedArrays",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> K Way Merge"
+    ],
+    "Tags": [
+      "K Way Merge"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 151,
+    "Type": "Coding",
+    "Name": "Merge K Sorted Arrays",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P2_KthSmallestNumberInMSortedLists/_Variants/P2_MergeKSortedArrays",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> K Way Merge"
+    ],
+    "Tags": [
+      "K Way Merge"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 152,
+    "Type": "Coding",
+    "Name": "Kth Smallest Number in a Sorted Matrix",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P3_KthSmallestNumberInASortedMatrix",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> K Way Merge"
+    ],
+    "Tags": [
+      "K Way Merge"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 153,
+    "Type": "Coding",
+    "Name": "Smallest Number Range",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P4_SmallestNumberRange",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> K Way Merge"
+    ],
+    "Tags": [
+      "K Way Merge"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 154,
+    "Type": "Coding",
+    "Name": "K Pairs with Largest Sums",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/PC1_KPairsWithLargestSums",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Hard",
+      "Pattern -> K Way Merge"
+    ],
+    "Tags": [
+      "K Way Merge"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 155,
+    "Type": "Coding",
+    "Name": "0/1 Knapsack",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch16_01Knapsack_DynamicProgramming/P1_01Knapsack",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> 0/1 Knapsack (Dynamic Programming)"
+    ],
+    "Tags": [
+      "0/1 Knapsack",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 156,
+    "Type": "Coding",
+    "Name": "Equal Subset Sum Partition",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch16_01Knapsack_DynamicProgramming/P2_EqualSubsetSumPartition",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the Coding Interview: Patterns for Coding Questions",
+      "Difficulty -> Medium",
+      "Pattern -> 0/1 Knapsack (Dynamic Programming)"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 157,
+    "Type": "Course",
+    "Name": "Grokking the System Design Interview",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 158,
+    "Type": "Systems Design",
+    "Name": "Designing an API Rate Limiter",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/ApiRateLimiter",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 159,
+    "Type": "Systems Design",
+    "Name": "Designing Dropbox",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Dropbox",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 160,
+    "Type": "Systems Design",
+    "Name": "Designing Facebook Messenger",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/FacebookMessenger",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 161,
+    "Type": "Systems Design",
+    "Name": "Designing Facebook's Newsfeed",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/FacebookNewsfeed",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 162,
+    "Type": "Systems Design",
+    "Name": "Designing Instagram",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Instagram",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 163,
+    "Type": "Systems Design",
+    "Name": "Designing Pastebin",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Pastebin",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 164,
+    "Type": "Systems Design",
+    "Name": "Design Ticketmaster",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Ticketmaster",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 165,
+    "Type": "Systems Design",
+    "Name": "Designing Twitter",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Twitter",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 166,
+    "Type": "Systems Design",
+    "Name": "Designing Twitter Search",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/TwitterSearch",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 167,
+    "Type": "Systems Design",
+    "Name": "Designing Typeahead Suggestion",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/TypeaheadSuggestion",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 168,
+    "Type": "Systems Design",
+    "Name": "Designing a URL Shortening service like TinyURL",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/URLShorteningServiceLikeTinyURL",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 169,
+    "Type": "Systems Design",
+    "Name": "Designing Uber backend",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/UberBackend",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 170,
+    "Type": "Systems Design",
+    "Name": "Designing a Web Crawler",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/WebCrawler",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 171,
+    "Type": "Systems Design",
+    "Name": "Designing Yelp or Nearby Friends",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/YelpOrNearlyFriends",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 172,
+    "Type": "Systems Design",
+    "Name": "Designing Youtube or Netflix",
+    "Origin": "Educative",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/YoutubeOrNetflix",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Grokking the System Design Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 173,
+    "Type": "Coding",
+    "Name": "Q0 Boot Camp",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q0_BootCamp",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 174,
+    "Type": "Coding",
+    "Name": "Q1 Compute Parity Of Word",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q1_ComputeParityOfWord",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 175,
+    "Type": "Coding",
+    "Name": "Q2 Swap Bits",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q2_SwapBits",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 176,
+    "Type": "Coding",
+    "Name": "Q3 Reverse Bits",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q3_ReverseBits",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 177,
+    "Type": "Coding",
+    "Name": "Q4 Find Closest Int With Same Weight",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q4_FindClosestIntWithSameWeight",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 178,
+    "Type": "Coding",
+    "Name": "Q5 Multiply Without Arithmetical Operators",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q5_MultiplyWithoutArithmeticalOperators",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 179,
+    "Type": "Coding",
+    "Name": "Q6 Compute Division",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q6_ComputeDivision",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 180,
+    "Type": "Coding",
+    "Name": "Q7 Compute Power",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q7_ComputePower",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 181,
+    "Type": "Coding",
+    "Name": "Q8 Reverse Digits",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q8_ReverseDigits",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 182,
+    "Type": "Coding",
+    "Name": "Q9 Decimal Integer Palindrome Check",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q9_DecimalIntegerPalindromeCheck",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Primitive Types"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 183,
+    "Type": "Coding",
+    "Name": "Computing An Alternation",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/ComputingAnAlternation",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 184,
+    "Type": "Coding",
+    "Name": "Q0 Boot Camp",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q0_BootCamp",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java",
+      "Python"
+    ]
+  },
+  {
+    "Id": 185,
+    "Type": "Coding",
+    "Name": "Q10 Compute The Next Permutation",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q10_ComputeTheNextPermutation",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 186,
+    "Type": "Coding",
+    "Name": "Previous Permutation",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q10_ComputeTheNextPermutation/Variants/PreviousPermutation",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 187,
+    "Type": "Coding",
+    "Name": "kth Permutation",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q10_ComputeTheNextPermutation/Variants/kthPermutation",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 188,
+    "Type": "Coding",
+    "Name": "Q11 Sample Offline Data",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q11_SampleOfflineData",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 189,
+    "Type": "Coding",
+    "Name": "Q12 Sample Online Data",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q12_SampleOnlineData",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 190,
+    "Type": "Coding",
+    "Name": "Q13 Compute Random Permutation",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q13_ComputeRandomPermutation",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 191,
+    "Type": "Coding",
+    "Name": "Q14 Compute Random Subset",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q14_ComputeRandomSubset",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 192,
+    "Type": "Coding",
+    "Name": "Q1 Dutch National Flag",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q1_DutchNationalFlag",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 193,
+    "Type": "Coding",
+    "Name": "Q2 Increment An Arbitrary Precision Integer",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q2_IncrementAnArbitraryPrecisionInteger",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 194,
+    "Type": "Coding",
+    "Name": "Q3 Multiply Two Arbitrary Precision Integers",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q3_MultiplyTwoArbitraryPrecisionIntegers",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 195,
+    "Type": "Coding",
+    "Name": "Q4 Advancing Through An Array",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q4_AdvancingThroughAnArray",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 196,
+    "Type": "Coding",
+    "Name": "Min Number Of Steps",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q4_AdvancingThroughAnArray/Variants/MinNumberOfSteps",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 197,
+    "Type": "Coding",
+    "Name": "Q5 Delete Duplicates From Sorted Array",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q5_DeleteDuplicatesFromSortedArray",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 198,
+    "Type": "Coding",
+    "Name": "Limit Duplicates",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q5_DeleteDuplicatesFromSortedArray/Variants/LimitDuplicates",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 199,
+    "Type": "Coding",
+    "Name": "Q6 Buy And Sell Stock Once",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q6_BuyAndSellStockOnce",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 200,
+    "Type": "Coding",
+    "Name": "Q7 Buy And Sell Stock Twice",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q7_BuyAndSellStockTwice",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 201,
+    "Type": "Coding",
+    "Name": "Q8 Enumerate All Primes To N",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q8_EnumerateAllPrimesToN",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 202,
+    "Type": "Coding",
+    "Name": "Q9 Permute Elements Of Array",
+    "Origin": "Elements of Programming Interviews",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q9_PermuteElementsOfArray",
+    "Companies": [],
+    "Categories": [
+      "Books"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 203,
+    "Type": "Coding",
+    "Name": "Binary Search On Array Of Integers",
+    "Origin": "Firecode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/BinarySearchOnArrayOfIntegers",
+    "Companies": [
+      "Oracle"
+    ],
+    "Categories": [
+      "Level1"
+    ],
+    "Tags": [
+      "Strings",
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 204,
+    "Type": "Coding",
+    "Name": "Find the First Non Duplicate Character in a String",
+    "Origin": "Firecode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/FindFirstNonDuplicateCharacterInAString",
+    "Companies": [
+      "Oracle"
+    ],
+    "Categories": [
+      "Level1"
+    ],
+    "Tags": [
+      "Strings",
+      "Hash Tables"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 205,
+    "Type": "Coding",
+    "Name": "Flip It",
+    "Origin": "Firecode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/FlipIt",
+    "Companies": [
+      "Infosys"
+    ],
+    "Categories": [
+      "Level1"
+    ],
+    "Tags": [
+      "Arrays",
+      "Multi Dimensional Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 206,
+    "Type": "Coding",
+    "Name": "Palindrome Tester",
+    "Origin": "Firecode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/PalindromeTester",
+    "Companies": [],
+    "Categories": [
+      "Level1"
+    ],
+    "Tags": [
+      "Strings",
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 207,
+    "Type": "Coding",
+    "Name": "Repeated Elements In An Array",
+    "Origin": "Firecode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/RepeatedElementsInAnArray",
+    "Companies": [
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Level1"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 208,
+    "Type": "Coding",
+    "Name": "Reverse A String",
+    "Origin": "Firecode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/ReverseAString",
+    "Companies": [
+      "Microsoft"
+    ],
+    "Categories": [
+      "Level1"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 209,
+    "Type": "Coding",
+    "Name": "Binary Tree",
+    "Origin": "GitHub Repository",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/BillRyan/src/AlgorithmExercise/Part1_Basics/BasicDataStructure/BinaryTree",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> billryan - yuanbin -> Algorithm Exercise"
+    ],
+    "Tags": [
+      "Binary Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 210,
+    "Type": "Coding",
+    "Name": "Linked List",
+    "Origin": "GitHub Repository",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/BillRyan/src/AlgorithmExercise/Part1_Basics/BasicDataStructure/LinkedList",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> billryan - yuanbin -> Algorithm Exercise"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 211,
+    "Type": "Reading",
+    "Name": "System Design Interview",
+    "Origin": "GitHub Repository",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview"
+    ],
+    "Tags": [
+      "Distributed Systems Design",
+      "Object Oriented Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 212,
+    "Type": "Reading",
+    "Name": "Fallacies of Distributed Systems",
+    "Origin": "Notes - Article",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/FallaciesOfDistributedSystems",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview",
+      "Articles",
+      "Authors -> Arnon Rotem-Gal-Oz"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 213,
+    "Type": "Reading",
+    "Name": "How to Ace a Systems Design Interview",
+    "Origin": "Notes - Blog Post",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/HowToRockASystemsDesignInterview",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview",
+      "Blogs -> Palantir Blog"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 214,
+    "Type": "Reading",
+    "Name": "Introduction to architecting systems for scale",
+    "Origin": "Notes - Blog Post",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/IntroductionToArchitectingSystemsForScale",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview",
+      "Blogs -> Irrational Exuberance!",
+      "Authors -> Will Larson"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 215,
+    "Type": "Reading",
+    "Name": "Numbers Everyone Should Know",
+    "Origin": "Notes - Blog Post",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/NumbersEveryoneShouldKnow",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview",
+      "Blogs -> Everything is Data",
+      "Authors -> Neil Conway"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 216,
+    "Type": "Reading",
+    "Name": "Scalability for Dummies",
+    "Origin": "Notes - Blog Post",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/ScalabilityForDummies",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview",
+      "Blogs -> Le Cloud Blog",
+      "Authors -> Sebastian Kreutzberger"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 217,
+    "Type": "Reading",
+    "Name": "Scalable System Design Patterns",
+    "Origin": "Notes - Blog Post",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/ScalableSystemDesignPatterns",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview",
+      "Blogs -> Pragmatic Programming Techniques",
+      "Authors -> Ricky Ho"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 218,
+    "Type": "Reading",
+    "Name": "Scalable Web Architecture and Distributed Systems",
+    "Origin": "Notes - Book Chapter",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/ScalableWebArchitectureAndDistributedSystems",
+    "Companies": [],
+    "Categories": [
+      "GitHub -> checkcheckzz -> System Design Interview",
+      "Books -> The Architecture of Open Source Applications, Volume II",
+      "Authors -> Kate Matsudaira"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 219,
+    "Type": "Coding",
+    "Name": "Number Of Strings From Encoded Alphabet",
+    "Origin": "Glassdoor",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Glassdoor/src/Facebook/NumberOfStringsFromEncodedAlphabet",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Python"
+    ]
+  },
+  {
+    "Id": 220,
+    "Type": "Coding",
+    "Name": "HackerRank In A String",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/HackerRankInAString",
+    "Companies": [],
+    "Categories": [
+      "Contests -> RookieRank 2"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 221,
+    "Type": "Coding",
+    "Name": "KnightL On A Chessboard",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/KnightLOnAChessboard",
+    "Companies": [],
+    "Categories": [
+      "Contests -> RookieRank 2"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 222,
+    "Type": "Coding",
+    "Name": "Migratory Birds",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/MigratoryBirds",
+    "Companies": [],
+    "Categories": [
+      "Contests -> RookieRank 2"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 223,
+    "Type": "Coding",
+    "Name": "Minimum Absolute Difference In An Array",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/MinimumAbsoluteDifferenceInAnArray",
+    "Companies": [],
+    "Categories": [
+      "Contests -> RookieRank 2"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 224,
+    "Type": "Coding",
+    "Name": "Dam Design",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Miscellaneous/DamDesign",
+    "Companies": [],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Python"
+    ]
+  },
+  {
+    "Id": 225,
+    "Type": "Coding",
+    "Name": "Divisible Sum Pairs",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Implementation/DivisibleSumPairs",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Implementation",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 226,
+    "Type": "Coding",
+    "Name": "A Very Big Sum",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/AVeryBigSum",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 227,
+    "Type": "Coding",
+    "Name": "Circular Array Rotation",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/CircularArrayRotation",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 228,
+    "Type": "Coding",
+    "Name": "Compare The Triplets",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/CompareTheTriplets",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 229,
+    "Type": "Coding",
+    "Name": "Diagonal Difference",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/DiagonalDifference",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 230,
+    "Type": "Coding",
+    "Name": "Plus Minus",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/PlusMinus",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 231,
+    "Type": "Coding",
+    "Name": "Simple Array Sum",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/SimpleArraySum",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 232,
+    "Type": "Coding",
+    "Name": "Solve Me First",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/SolveMeFirst",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 233,
+    "Type": "Coding",
+    "Name": "Staircase",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/Staircase",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 234,
+    "Type": "Coding",
+    "Name": "Time Conversion",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/TimeConversion",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Algorithms -> Warmup"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 235,
+    "Type": "Coding",
+    "Name": "Arrays_DS",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/DataStructures/Arrays/Arrays_DS",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Data Structures"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 236,
+    "Type": "Coding",
+    "Name": "2DArray_DS",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/DataStructures/Arrays/TwoDArray_DS",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Data Structures"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 237,
+    "Type": "Coding",
+    "Name": "Reverse A Linked List",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/DataStructures/LinkedLists/ReverseALinkedList",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Problem Solving -> Data Structures"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 238,
+    "Type": "Coding",
+    "Name": "D0 Hello World",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D0_HelloWorld",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 239,
+    "Type": "Coding",
+    "Name": "D10 Binary Numbers",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D10_BinaryNumbers",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 240,
+    "Type": "Coding",
+    "Name": "D11 2D Arrays",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D11_2DArrays",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 241,
+    "Type": "Coding",
+    "Name": "D12 Inheritance",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D12_Inheritance",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 242,
+    "Type": "Coding",
+    "Name": "D13 Abstract Classes",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D13_AbstractClasses",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 243,
+    "Type": "Coding",
+    "Name": "D14 Scope",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D14_Scope",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 244,
+    "Type": "Coding",
+    "Name": "D15 Linked List",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D15_LinkedList",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 245,
+    "Type": "Coding",
+    "Name": "D16 Exceptions String To Integer",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D16_Exceptions_StringToInteger",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 246,
+    "Type": "Coding",
+    "Name": "D17 More Exceptions",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D17_MoreExceptions",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 247,
+    "Type": "Coding",
+    "Name": "D18 Queues And Stacks",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D18_QueuesAndStacks",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 248,
+    "Type": "Coding",
+    "Name": "D19 Interfaces",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D19_Interfaces",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 249,
+    "Type": "Coding",
+    "Name": "D1 Data Types",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D1_DataTypes",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 250,
+    "Type": "Coding",
+    "Name": "D20 Sorting",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D20_Sorting",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 251,
+    "Type": "Coding",
+    "Name": "D21 Generics",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D21_Generics",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 252,
+    "Type": "Coding",
+    "Name": "D22 Binary Search Trees",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D22_BinarySearchTrees",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 253,
+    "Type": "Coding",
+    "Name": "D23 BST Level Order Traversal",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D23_BSTLevelOrderTraversal",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 254,
+    "Type": "Coding",
+    "Name": "D24 More Linked Lists",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D24_MoreLinkedLists",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 255,
+    "Type": "Coding",
+    "Name": "D25 Running Time And Complexity",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D25_RunningTimeAndComplexity",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 256,
+    "Type": "Coding",
+    "Name": "D26 Nested Logic",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D26_NestedLogic",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 257,
+    "Type": "Coding",
+    "Name": "D27 Testing",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D27_Testing",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 258,
+    "Type": "Coding",
+    "Name": "D28 RegEx Patterns And Intro To Databases",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D28_RegExPatternsAndIntroToDatabases",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 259,
+    "Type": "Coding",
+    "Name": "D29 Bitwise AND",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D29_BitwiseAND",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 260,
+    "Type": "Coding",
+    "Name": "D2 Operators",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D2_Operators",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 261,
+    "Type": "Coding",
+    "Name": "D3 Intro To Conditional Statements",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D3_IntroToConditionalStatements",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 262,
+    "Type": "Coding",
+    "Name": "D4 Class Vs Instance",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D4_ClassVsInstance",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 263,
+    "Type": "Coding",
+    "Name": "D5 Loops",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D5_Loops",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 264,
+    "Type": "Coding",
+    "Name": "D6 Lets Review",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D6_LetsReview",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 265,
+    "Type": "Coding",
+    "Name": "D7 Arrays",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D7_Arrays",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 266,
+    "Type": "Coding",
+    "Name": "D8 Dictionaries And Maps",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D8_DictionariesAndMaps",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 267,
+    "Type": "Coding",
+    "Name": "D9 Recursion",
+    "Origin": "HackerRank",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D9_Recursion",
+    "Companies": [],
+    "Categories": [
+      "Tracks -> Tutorials -> Thirty Days of Code"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 268,
+    "Type": "Coding",
+    "Name": "amortized1",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/AmortizedComplexity/amortized1",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 269,
+    "Type": "Coding",
+    "Name": "choose4",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/choose4",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 270,
+    "Type": "Coding",
+    "Name": "loop_cmpl",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/loop_cmpl",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 271,
+    "Type": "Coding",
+    "Name": "nested_cmpl",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/nested_cmpl",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 272,
+    "Type": "Coding",
+    "Name": "nested_cmpl2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/nested_cmpl2",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 273,
+    "Type": "Coding",
+    "Name": "choose1",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/CompareFunctions/choose1",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 274,
+    "Type": "Coding",
+    "Name": "choose2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/CompareFunctions/choose2",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 275,
+    "Type": "Coding",
+    "Name": "choose3",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/CompareFunctions/choose3",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 276,
+    "Type": "Coding",
+    "Name": "rec_cmpl1",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/FunctionCallingItself/rec_cmpl1",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 277,
+    "Type": "Coding",
+    "Name": "rec_cmpl2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/FunctionCallingItself/rec_cmpl2",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 278,
+    "Type": "Coding",
+    "Name": "rec_cmpl3",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/FunctionCallingItself/rec_cmpl3",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 279,
+    "Type": "Coding",
+    "Name": "gcd_cmpl",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/gcd_cmpl",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 280,
+    "Type": "Coding",
+    "Name": "loop_cmpl2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/loop_cmpl2",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 281,
+    "Type": "Coding",
+    "Name": "nested_cmpl3",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/nested_cmpl3",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 282,
+    "Type": "Coding",
+    "Name": "while_cmpl",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/while_cmpl",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Time Complexity"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 283,
+    "Type": "Coding",
+    "Name": "Spiral Order Matrix 1",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Examples/SpiralOrderMatrix1",
+    "Companies": [
+      "Microsoft",
+      "JPMorgan",
+      "Amazon",
+      "Flipkart"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 284,
+    "Type": "Coding",
+    "Name": "Array Bug",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Primers/ArrayBug",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 285,
+    "Type": "Coding",
+    "Name": "Array 2D",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Primers/Array_2D",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 286,
+    "Type": "Coding",
+    "Name": "Array Impl 1",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Primers/Array_impl1",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 287,
+    "Type": "Coding",
+    "Name": "Largest Number",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/Arrangement/LargestNumber",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 288,
+    "Type": "Coding",
+    "Name": "Rotate Matrix",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/Arrangement/RotateMatrix",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 289,
+    "Type": "Coding",
+    "Name": "Add One To Number",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/ArrayMath/AddOneToNumber",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 290,
+    "Type": "Coding",
+    "Name": "Min Steps In Infinite Grid",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/ArrayMath/MinStepsInInfiniteGrid",
+    "Companies": [
+      "Directi"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 291,
+    "Type": "Coding",
+    "Name": "Noble Integer",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/Bucketing/NobleInteger",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 292,
+    "Type": "Coding",
+    "Name": "Wave Array",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/BucketingOrSorting/WaveArray",
+    "Companies": [
+      "Google",
+      "Adobe"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 293,
+    "Type": "Coding",
+    "Name": "First Missing Integer",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/MissingOrRepeatedNumber/FirstMissingInteger",
+    "Companies": [
+      "Model N",
+      "InMobi"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 294,
+    "Type": "Coding",
+    "Name": "Max Non Negative SubArray",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/SimulationArray/MaxNonNegativeSubArray",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 295,
+    "Type": "Coding",
+    "Name": "Spiral Order Matrix 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/SimulationArray/SpiralOrderMatrix2",
+    "Companies": [
+      "Microsoft",
+      "JPMorgan",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 296,
+    "Type": "Coding",
+    "Name": "Set Matrix Zeros",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/SpaceRecycle/SetMatrixZeros",
+    "Companies": [
+      "Oracle",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 297,
+    "Type": "Coding",
+    "Name": "Merge Intervals",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/ValueRanges/MergeIntervals",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 298,
+    "Type": "Coding",
+    "Name": "Bubble Sort",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/BubbleSort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming",
+      "Known Algorithms"
+    ],
+    "Tags": [
+      "Arrays",
+      "Sorting"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 299,
+    "Type": "Coding",
+    "Name": "Insertion Sort",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/InsertionSort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming",
+      "Known Algorithms"
+    ],
+    "Tags": [
+      "Arrays",
+      "Sorting"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 300,
+    "Type": "Coding",
+    "Name": "Merge Sort",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/MergeSort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming",
+      "Known Algorithms"
+    ],
+    "Tags": [
+      "Arrays",
+      "Sorting"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 301,
+    "Type": "Coding",
+    "Name": "Quick Sort",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/QuickSort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming",
+      "Known Algorithms"
+    ],
+    "Tags": [
+      "Arrays",
+      "Sorting"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 302,
+    "Type": "Coding",
+    "Name": "Selection Sort",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/SelectionSort",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming",
+      "Known Algorithms"
+    ],
+    "Tags": [
+      "Arrays",
+      "Sorting"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 303,
+    "Type": "Coding",
+    "Name": "All Factors",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/AllFactors",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 304,
+    "Type": "Coding",
+    "Name": "Binary Representation",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/BinaryRepresentation",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 305,
+    "Type": "Coding",
+    "Name": "Prime Numbers",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/PrimeNumbers",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 306,
+    "Type": "Coding",
+    "Name": "Verify Prime",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/VerifyPrime",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 307,
+    "Type": "Coding",
+    "Name": "Math Bug01",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Primers/Math_Bug01",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 308,
+    "Type": "Coding",
+    "Name": "Math Bug02",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Primers/Math_Bug02",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 309,
+    "Type": "Coding",
+    "Name": "Prime Sum",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/AdHoc/PrimeSum",
+    "Companies": [
+      "Epic Systems"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 310,
+    "Type": "Coding",
+    "Name": "Sum Of Pairwise Hamming Distance",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/AdHoc/SumOfPairwiseHammingDistance",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 311,
+    "Type": "Coding",
+    "Name": "Numbers Of Length N And Values Less Than K",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/ArrayDp/NumbersOfLengthNAndValuesLessThanK",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 312,
+    "Type": "Coding",
+    "Name": "Excel Column Title",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/BaseConversion/ExcelColumnTitle",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 313,
+    "Type": "Coding",
+    "Name": "Grid Unique Paths",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/Combinatorics/GridUniquePaths",
+    "Companies": [
+      "Google",
+      "Amazon",
+      "Microsoft",
+      "Adobe"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 314,
+    "Type": "Coding",
+    "Name": "Palindrome Integer",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/DigitOp/PalindromeInteger",
+    "Companies": [
+      "HCL"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 315,
+    "Type": "Coding",
+    "Name": "Reverse Integer",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/DigitOp/ReverseInteger",
+    "Companies": [
+      "HCL",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 316,
+    "Type": "Coding",
+    "Name": "Rearrange Array",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberEncoding/RearrangeArray",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 317,
+    "Type": "Coding",
+    "Name": "Greatest Common Divisor",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberTheory/GreatestCommonDivisor",
+    "Companies": [
+      "Google",
+      "NetApp"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 318,
+    "Type": "Coding",
+    "Name": "Sorted Permutation Rank With Repeats",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberTheory/SortedPermutationRankWithRepeats",
+    "Companies": [
+      "Housing",
+      "Zenefits"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 319,
+    "Type": "Coding",
+    "Name": "Trailing Zeros In Factorial",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberTheory/TrailingZerosInFactorial",
+    "Companies": [
+      "Microsoft",
+      "Jabong",
+      "Zillow"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 320,
+    "Type": "Coding",
+    "Name": "Find Element Occurrence",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Examples/FindElementOccurrence",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 321,
+    "Type": "Coding",
+    "Name": "Rotated Array",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Examples/RotatedArray",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 322,
+    "Type": "Coding",
+    "Name": "Square Root Of Integer",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SearchAnswer/SquareRootOfInteger",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 323,
+    "Type": "Coding",
+    "Name": "Implement Power Function",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SearchStepSimulation/ImplementPowerFunction",
+    "Companies": [
+      "Google",
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 324,
+    "Type": "Coding",
+    "Name": "Search For A Range",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SimpleBinarySearch/SearchForARange",
+    "Companies": [
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 325,
+    "Type": "Coding",
+    "Name": "Median Of Array",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SortModification/MedianOfArray",
+    "Companies": [
+      "Amazon",
+      "VMware",
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 326,
+    "Type": "Coding",
+    "Name": "Rotated Sorted Array Search",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SortModification/RotatedSortedArraySearch",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 327,
+    "Type": "Coding",
+    "Name": "Single Number 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BitManipulation/Problems/BitArray/SingleNumber2",
+    "Companies": [
+      "Google",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 328,
+    "Type": "Coding",
+    "Name": "Different Bits Sum Pairwise",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BitManipulation/Problems/BitPlay/DifferentBitsSumPairwise",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 329,
+    "Type": "Coding",
+    "Name": "Min XOR Value",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BitManipulation/Problems/Bucketing/MinXorValue",
+    "Companies": [
+      "Booking.com"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 330,
+    "Type": "Coding",
+    "Name": "Justified Text",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/PrettyPrint/JustifiedText",
+    "Companies": [
+      "LinkedIn",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 331,
+    "Type": "Coding",
+    "Name": "Add Binary Strings",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/AddBinaryStrings",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 332,
+    "Type": "Coding",
+    "Name": "Integer To Roman",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/IntegerToRoman",
+    "Companies": [
+      "Amazon",
+      "Facebook",
+      "Microsoft",
+      "Twitter"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 333,
+    "Type": "Coding",
+    "Name": "Multiply Strings",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/MultiplyStrings",
+    "Companies": [
+      "Microsoft",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 334,
+    "Type": "Coding",
+    "Name": "Roman To Integer",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/RomanToInteger",
+    "Companies": [
+      "Amazon",
+      "Facebook",
+      "Microsoft",
+      "Twitter"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 335,
+    "Type": "Coding",
+    "Name": "Atoi",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringParsing/Atoi",
+    "Companies": [
+      "Adobe",
+      "Nvidia",
+      "Agilent Systems",
+      "Bloomberg",
+      "Amazon",
+      "Apple",
+      "Microsoft",
+      "Groupon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 336,
+    "Type": "Coding",
+    "Name": "Implement StrStr",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSearch/ImplementStrStr",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Qualcomm",
+      "Wipro",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 337,
+    "Type": "Coding",
+    "Name": "Count And Say",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSimulation/CountAndSay",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 338,
+    "Type": "Coding",
+    "Name": "Longest Common Prefix",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSimulation/LongestCommonPrefix",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 339,
+    "Type": "Coding",
+    "Name": "Palindrome String",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSimulation/PalindromeString",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 340,
+    "Type": "Coding",
+    "Name": "Longest Palindromic Substring",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringTricks/LongestPalindromicSubstring",
+    "Companies": [
+      "Amazon",
+      "Microsoft",
+      "Groupon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 341,
+    "Type": "Coding",
+    "Name": "Reverse The String",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/Words/ReverseTheString",
+    "Companies": [
+      "Qualcomm",
+      "Amazon",
+      "Microsoft",
+      "Cisco",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 342,
+    "Type": "Coding",
+    "Name": "Remove Duplicates From Sorted Array",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/InplaceUpdate/RemoveDuplicatesFromSortedArray",
+    "Companies": [
+      "United Healthgroup",
+      "Amazon",
+      "Google",
+      "Microsoft",
+      "Expedia"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 343,
+    "Type": "Coding",
+    "Name": "Intersection Of Sorted Arrays",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/MultipleArrays/IntersectionOfSortedArrays",
+    "Companies": [
+      "Facebook",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 344,
+    "Type": "Coding",
+    "Name": "Three Sum",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/Sorting/ThreeSum",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 345,
+    "Type": "Coding",
+    "Name": "Container With Most Water",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/Tricks/ContainerWithMostWater",
+    "Companies": [
+      "Facebook",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 346,
+    "Type": "Coding",
+    "Name": "Minimize The Absolute Difference",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/TwoPointer/MinimizeAbsoluteDifference",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 347,
+    "Type": "Coding",
+    "Name": "Intersection of Linked Lists",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Examples/IntersectionOfLinkedLists",
+    "Companies": [
+      "Amazon",
+      "Microsoft",
+      "NetApp",
+      "Apache Design"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 348,
+    "Type": "Coding",
+    "Name": "Reverse Linked List",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Examples/ReverseLinkedList",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 349,
+    "Type": "Coding",
+    "Name": "Reverse Link List 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/List2Pointer/ReverseLinkList2",
+    "Companies": [
+      "Facebook",
+      "Microsoft",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 350,
+    "Type": "Coding",
+    "Name": "List Cycle",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/ListCycle/ListCycle",
+    "Companies": [
+      "Amazon",
+      "Microsoft",
+      "NetApp"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 351,
+    "Type": "Coding",
+    "Name": "Add Two Numbers As Lists",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/ListMath/AddTwoNumbersAsLists",
+    "Companies": [
+      "Amazon",
+      "Qualcomm",
+      "Microsoft",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 352,
+    "Type": "Coding",
+    "Name": "Insertion Sort List",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/ListSort/InsertionSortList",
+    "Companies": [
+      "Microsoft",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 353,
+    "Type": "Coding",
+    "Name": "Reorder List",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/PointerMove/ReorderList",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Linked Lists"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 354,
+    "Type": "Coding",
+    "Name": "Generate All Parentheses",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Examples/GenerateAllParentheses",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Stacks",
+      "Queues"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 355,
+    "Type": "Coding",
+    "Name": "Reverse String",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Examples/ReverseString",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Stacks",
+      "Queues"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 356,
+    "Type": "Coding",
+    "Name": "Largest Rectangle In Histogram",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/CleverStack/LargestRectangleInHistogram",
+    "Companies": [
+      "Google",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Stacks",
+      "Queues"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 357,
+    "Type": "Coding",
+    "Name": "Min Stack",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/MultipleStack/MinStack",
+    "Companies": [
+      "Yahoo",
+      "Amazon",
+      "Adobe"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Stacks",
+      "Queues"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 358,
+    "Type": "Coding",
+    "Name": "Evaluate Expression",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/StackMath/EvaluateExpression",
+    "Companies": [
+      "Yahoo",
+      "Google",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Stacks",
+      "Queues"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 359,
+    "Type": "Coding",
+    "Name": "Redundant Braces",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/StackSimple/RedundantBraces",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Stacks",
+      "Queues"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 360,
+    "Type": "Coding",
+    "Name": "Modular Expression",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Examples/ModularExpression",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 361,
+    "Type": "Coding",
+    "Name": "Reverse Linked List Recursion",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Examples/ReverseLinkedListRecursion",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 362,
+    "Type": "Coding",
+    "Name": "Palindrome Partitioning",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/BruteForceBuilder/PalindromePartitioning",
+    "Companies": [
+      "Amazon",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 363,
+    "Type": "Coding",
+    "Name": "NQueens",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/GameSolving/NQueens",
+    "Companies": [
+      "Qualcomm",
+      "Google",
+      "Amazon",
+      "Splunk"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 364,
+    "Type": "Coding",
+    "Name": "Kth Permutation Sequence",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/MathsAndBacktracking/KthPermutationSequence",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 365,
+    "Type": "Coding",
+    "Name": "Permutations",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/Permutations/Permutations",
+    "Companies": [
+      "Microsoft",
+      "Adobe",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 366,
+    "Type": "Coding",
+    "Name": "Generated All Parentheses 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/PrunedBuilder/GenerateAllParentheses2",
+    "Companies": [
+      "Facebook",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 367,
+    "Type": "Coding",
+    "Name": "Combination Sum",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/Subsets/CombinationSum",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Adobe"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 368,
+    "Type": "Coding",
+    "Name": "Four Sum",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/HashSearch/FourSum",
+    "Companies": [
+      "Amazon",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Hashing"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 369,
+    "Type": "Coding",
+    "Name": "Two Sum",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/HashSearch/TwoSum",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Hashing"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 370,
+    "Type": "Coding",
+    "Name": "Window String",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/HashingTwoPointer/WindowString",
+    "Companies": [
+      "Google",
+      "Directi"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Hashing"
+    ],
+    "Languages": [
+      "Java",
+      "Python"
+    ]
+  },
+  {
+    "Id": 371,
+    "Type": "Coding",
+    "Name": "Substring Concatenation",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/IncrementalHash/SubstringConcatenation",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Hashing"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 372,
+    "Type": "Coding",
+    "Name": "Equal",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/KeyFormation/Equal",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Hashing"
+    ],
+    "Languages": [
+      "Java",
+      "Python"
+    ]
+  },
+  {
+    "Id": 373,
+    "Type": "Coding",
+    "Name": "Points On The Straight Line",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/MathsAndHashing/PointsOnTheStraightLine",
+    "Companies": [
+      "Google",
+      "Amazon",
+      "InMobi"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Hashing"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 374,
+    "Type": "Coding",
+    "Name": "Merge K Sorted Lists",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_HeapsAndMaps/Problems/Heap/MergeKSortedLists",
+    "Companies": [
+      "Flipkart",
+      "Amazon",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Heaps",
+      "Maps"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 375,
+    "Type": "Coding",
+    "Name": "LRU Cache",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_HeapsAndMaps/Problems/Heapmap/LruCache",
+    "Companies": [
+      "Adobe",
+      "Citigroup",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Heaps",
+      "Maps"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 376,
+    "Type": "Coding",
+    "Name": "Ways To Form Max Heap",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_HeapsAndMaps/Problems/Math/WaysToFormMaxHeap",
+    "Companies": [
+      "Directi"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Heaps",
+      "Maps"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 377,
+    "Type": "Coding",
+    "Name": "Next Greater Number Bst",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Examples/NextGreaterNumberBst",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 378,
+    "Type": "Coding",
+    "Name": "Valid Binary Search Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Examples/ValidBinarySearchTree",
+    "Companies": [
+      "Amazon",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 379,
+    "Type": "Coding",
+    "Name": "BST Iterator",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/BstIterator",
+    "Companies": [
+      "Apple",
+      "Amazon",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 380,
+    "Type": "Coding",
+    "Name": "Kth Smallest Element In Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/KthSmallestElementInTree",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 381,
+    "Type": "Coding",
+    "Name": "Recover Binary Search Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/RecoverBinarySearchTree",
+    "Companies": [
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 382,
+    "Type": "Coding",
+    "Name": "Two Sum Binary Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/TwoSumBinaryTree",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 383,
+    "Type": "Coding",
+    "Name": "Invert The Binary Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/InPlaceChange/InvertTheBinaryTree",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 384,
+    "Type": "Coding",
+    "Name": "Order of People Heights",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/IntervalTree/OrderOfPeopleHeights",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 385,
+    "Type": "Coding",
+    "Name": "ZigZag Level Order Traversal BT",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/LevelOrder/ZigZagLevelOrderTraversalBt",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 386,
+    "Type": "Coding",
+    "Name": "Flatten Binary Tree To LinkedList",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/LinkedListTree/FlattenBinaryTreeToLinkedList",
+    "Companies": [
+      "Adobe",
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 387,
+    "Type": "Coding",
+    "Name": "Root to Leaf Paths With Sum",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/RootToLeaf/RootToLeafPathsWithSum",
+    "Companies": [
+      "Microsoft",
+      "Yahoo",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 388,
+    "Type": "Coding",
+    "Name": "Balanced Binary Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/SimpleTreeOps/BalancedBinaryTree",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 389,
+    "Type": "Coding",
+    "Name": "InOrder Traversal",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/InOrderTraversal",
+    "Companies": [
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 390,
+    "Type": "Coding",
+    "Name": "PostOrder Traversal",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/PostOrderTraversal",
+    "Companies": [
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 391,
+    "Type": "Coding",
+    "Name": "PreOrder Traversal",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/PreOrderTraversal",
+    "Companies": [
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 392,
+    "Type": "Coding",
+    "Name": "Vertical Order Traversal Of Binary Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/VerticalOrderTraversalOfBinaryTree",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 393,
+    "Type": "Coding",
+    "Name": "Binary Tree From InOrder And PostOrder",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeConstruction/BinaryTreeFromInorderAndPostorder",
+    "Companies": [
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 394,
+    "Type": "Coding",
+    "Name": "Construct Binary Tree From InOrder And PreOrder",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeConstruction/ConstructBinaryTreeFromInorderAndPreorder",
+    "Companies": [
+      "Amazon",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 395,
+    "Type": "Coding",
+    "Name": "Sorted Array To Balanced Bst",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeConstruction/SortedArrayToBalancedBst",
+    "Companies": [
+      "VMware",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 396,
+    "Type": "Coding",
+    "Name": "Least Common Ancestor",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeSearch/LeastCommonAncestor",
+    "Companies": [
+      "Facebook",
+      "Adobe",
+      "Microsoft",
+      "Amazon",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 397,
+    "Type": "Coding",
+    "Name": "Shortest Unique Prefix",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Trie/ShortestUniquePrefix",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 398,
+    "Type": "Coding",
+    "Name": "Hotel Reviews",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Tries/HotelReviews",
+    "Companies": [
+      "Booking.com"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 399,
+    "Type": "Coding",
+    "Name": "Identical Binary Trees",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TwoTrees/IdenticalBinaryTrees",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 400,
+    "Type": "Coding",
+    "Name": "Symmetric Binary Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TwoTrees/SymmetricBinaryTree",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Trees"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 401,
+    "Type": "Coding",
+    "Name": "Best Time to Buy and Sell Stock 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/AdHoc/BestTimeToBuyAndSellStock2",
+    "Companies": [
+      "Amazon",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 402,
+    "Type": "Coding",
+    "Name": "Palindrome Partitioning 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/BreakingWords/PalindromePartitioning2",
+    "Companies": [
+      "Amazon",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 403,
+    "Type": "Coding",
+    "Name": "Max Sum Without Adjacent Elements",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DerivedDp/MaxSumWithoutAdjacentElements",
+    "Companies": [
+      "Epic Systems"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 404,
+    "Type": "Coding",
+    "Name": "Word Break 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DpOptimizedBacktrack/WordBreak2",
+    "Companies": [
+      "IBM",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 405,
+    "Type": "Coding",
+    "Name": "Best Time to Buy and Sell Stocks 3",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DpTricky/BestTimeToBuyAndSellStocks3",
+    "Companies": [
+      "Amazon",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 406,
+    "Type": "Coding",
+    "Name": "Shortest Common SuperString",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DpTricky/ShortestCommonSuperString",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 407,
+    "Type": "Coding",
+    "Name": "Min Jumps Array",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/GreedyOrDp/MinJumpsArray",
+    "Companies": [
+      "Amazon",
+      "eBay",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 408,
+    "Type": "Coding",
+    "Name": "Equal Average Partition",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/Knapsack/EqualAveragePartition",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 409,
+    "Type": "Coding",
+    "Name": "Unique Paths in a Grid",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/MatrixDp/UniquePathsInAGrid",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 410,
+    "Type": "Coding",
+    "Name": "Unique Binary Search Trees 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/MultiplyDp/UniqueBinarySearchTrees2",
+    "Companies": [
+      "Amazon",
+      "Twitter",
+      "Samsung"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 411,
+    "Type": "Coding",
+    "Name": "Max Rectangle In Binary Matrix",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/PreProcessDp/MaxRectangleInBinaryMatrix",
+    "Companies": [
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 412,
+    "Type": "Coding",
+    "Name": "Length Of Longest Subsequence",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/SimpleArrayDp/LengthOfLongestSubsequence",
+    "Companies": [
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 413,
+    "Type": "Coding",
+    "Name": "Ways to Decode",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/SimpleArrayDp/WaysToDecode",
+    "Companies": [
+      "Facebook",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 414,
+    "Type": "Coding",
+    "Name": "Best Time to Buy and Sell Stocks 1",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/SuffixPrefixDp/BestTimeToBuyAndSellStocks1",
+    "Companies": [
+      "Amazon",
+      "Facebook"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 415,
+    "Type": "Coding",
+    "Name": "Max Sum Path In Binary Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/TreeDp/MaxSumPathInBinaryTree",
+    "Companies": [
+      "Directi",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 416,
+    "Type": "Coding",
+    "Name": "Edit Distance",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/TwoDStringDp/EditDistance",
+    "Companies": [
+      "Google",
+      "LinkedIn",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 417,
+    "Type": "Coding",
+    "Name": "Assign Mice To Holes",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket1/AssignMiceToHoles",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 418,
+    "Type": "Coding",
+    "Name": "Distribute Candy",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket1/DistributeCandy",
+    "Companies": [
+      "Microsoft"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 419,
+    "Type": "Coding",
+    "Name": "Gas Station",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket2/GasStation",
+    "Companies": [
+      "Bloomberg",
+      "Google",
+      "DE Shaw",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 420,
+    "Type": "Coding",
+    "Name": "Majority Element",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket3/MajorityElement",
+    "Companies": [
+      "Microsoft",
+      "Yahoo",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 421,
+    "Type": "Coding",
+    "Name": "Seats",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket4/Seats",
+    "Companies": [
+      "Walmart Labs"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 422,
+    "Type": "Coding",
+    "Name": "Highest Product",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket5/HighestProduct",
+    "Companies": [
+      "Coursera",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 423,
+    "Type": "Coding",
+    "Name": "Bulbs",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket6/Bulbs",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 424,
+    "Type": "Coding",
+    "Name": "Level   Order",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/Bfs/LevelOrder",
+    "Companies": [
+      "Facebook",
+      "Groupon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 425,
+    "Type": "Coding",
+    "Name": "Largest Distance Between Nodes of a Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/DepthFirstSearch/LargestDistanceBetweenNodesOfATree",
+    "Companies": [
+      "Facebook",
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 426,
+    "Type": "Coding",
+    "Name": "Convert Sorted List to Binary Search Tree",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphAdHoc/ConvertSortedListToBinarySearchTree",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 427,
+    "Type": "Coding",
+    "Name": "Capture Regions On Board",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphConnectivity/CaptureRegionsOnBoard",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 428,
+    "Type": "Coding",
+    "Name": "Clone Graph",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphHashing/CloneGraph",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 429,
+    "Type": "Coding",
+    "Name": "Word Search Board",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphTraversal/WordSearchBoard",
+    "Companies": [
+      "Epic Systems",
+      "Amazon"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 430,
+    "Type": "Coding",
+    "Name": "Word Ladder 1",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/ShortestPath/WordLadder1",
+    "Companies": [
+      "Google",
+      "Microsoft",
+      "eBay"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 431,
+    "Type": "Coding",
+    "Name": "Word Ladder 2",
+    "Origin": "InterviewBit",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/ShortestPath/WordLadder2",
+    "Companies": [
+      "Google",
+      "Microsoft",
+      "eBay"
+    ],
+    "Categories": [
+      "Courses -> Programming"
+    ],
+    "Tags": [
+      "Graphs"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 432,
+    "Type": "Coding",
+    "Name": "29. Bracket Validator",
+    "Origin": "InterviewCake",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/BracketValidator",
+    "Companies": [],
+    "Categories": [
+      "Questions"
+    ],
+    "Tags": [
+      "Stacks"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 433,
+    "Type": "Coding",
+    "Name": "25. Kth to Last Node in a Singly-Linked List",
+    "Origin": "InterviewCake",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/KthToLastNodeInSinglyLinkedList",
+    "Companies": [],
+    "Categories": [
+      "Questions"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 434,
+    "Type": "Coding",
+    "Name": "43. Merge Sorted Arrays",
+    "Origin": "InterviewCake",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/MergeSortedArrays",
+    "Companies": [],
+    "Categories": [
+      "Questions"
+    ],
+    "Tags": [
+      "Arrays"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 435,
+    "Type": "Coding",
+    "Name": "10. Second Largest Item In Bst",
+    "Origin": "InterviewCake",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/SecondLargestItemInBst",
+    "Companies": [],
+    "Categories": [
+      "Questions"
+    ],
+    "Tags": [
+      "Binary Search Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 436,
+    "Type": "Systems Design",
+    "Name": "Google Maps",
+    "Origin": "interviewing.io",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewingIo/src/SystemsDesign/GoogleMaps",
+    "Companies": [],
+    "Categories": [
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 437,
+    "Type": "Coding",
+    "Name": "Add Bold Tag in String",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/AddBoldTagInString",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 438,
+    "Type": "Coding",
+    "Name": "First Missing Positive",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/FirstMissingPositive",
+    "Companies": [
+      "Databricks",
+      "Google",
+      "Amazon",
+      "Adobe",
+      "Airbnb",
+      "Bloomberg",
+      "VMware",
+      "Pocket Gems",
+      "Alibaba",
+      "Facebook",
+      "Microsoft",
+      "Uber",
+      "Apple",
+      "Baidu"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 439,
+    "Type": "Coding",
+    "Name": "First Unique Character in a String",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/FirstUniqueCharacterInAString",
+    "Companies": [
+      "Amazon",
+      "Bloomberg",
+      "Facebook",
+      "Apple",
+      "Zillow",
+      "Goldman Sachs",
+      "Microsoft",
+      "Google",
+      "Yahoo",
+      "Airbnb",
+      "SAP",
+      "Alibaba",
+      "Oracle"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 440,
+    "Type": "Coding",
+    "Name": "Game of Life",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/GameOfLife",
+    "Companies": [
+      "Dropbox",
+      "Uber",
+      "Amazon",
+      "Google",
+      "Square",
+      "Microsoft",
+      "Bloomberg",
+      "Booking.com",
+      "Baidu",
+      "Apple",
+      "Snapchat",
+      "Two Sigma"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 441,
+    "Type": "Coding",
+    "Name": "Image Smoother",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ImageSmoother",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 442,
+    "Type": "Coding",
+    "Name": "Intersection of Two Arrays",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/IntersectionOfTwoArrays",
+    "Companies": [
+      "Facebook",
+      "Lyft",
+      "Amazon",
+      "LinkedIn",
+      "Yelp",
+      "Indeed",
+      "Oracle",
+      "Google",
+      "Microsoft",
+      "Apple",
+      "Bloomberg",
+      "Adobe",
+      "Tencent",
+      "Two Sigma"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Two Pointers",
+      "Binary Search",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 443,
+    "Type": "Coding",
+    "Name": "Longest Substring with At Most K Distinct Characters",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/LongestSubstringWithAtMostKDistinctCharacters",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Amazon",
+      "Quora",
+      "AppDynamics",
+      "Coupang"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Hash Table",
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 444,
+    "Type": "Coding",
+    "Name": "Max Consecutive Ones",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/MaxConsecutiveOnes",
+    "Companies": [
+      "Google",
+      "Amazon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 445,
+    "Type": "Coding",
+    "Name": "Max Consecutive Ones II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/MaxConsecutiveOnes2",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 446,
+    "Type": "Coding",
+    "Name": "Move Zeroes",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/MoveZeroes",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "SAP",
+      "Walmart Labs",
+      "Bloomberg",
+      "Microsoft",
+      "Apple",
+      "Uber",
+      "Paypal",
+      "Lyft",
+      "Yahoo",
+      "Oracle",
+      "eBay",
+      "Baidu"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 447,
+    "Type": "Coding",
+    "Name": "One Edit Distance",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/OneEditDistance",
+    "Companies": [
+      "Facebook",
+      "Uber",
+      "Microsoft",
+      "Yelp",
+      "Google",
+      "Twitter",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 448,
+    "Type": "Coding",
+    "Name": "Plus One",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/PlusOne",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Uber",
+      "Microsoft",
+      "Bloomberg",
+      "eBay",
+      "Adobe",
+      "Amazon",
+      "Airbnb"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 449,
+    "Type": "Coding",
+    "Name": "Read N Characters Given Read4",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ReadNCharactersGivenRead4",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Uber",
+      "Apple",
+      "Amazon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 450,
+    "Type": "Coding",
+    "Name": "Read N Characters Given Read4 II - Call multiple times",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ReadNCharactersGivenRead4_2_CallMultipleTimes",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Lyft",
+      "Rubric",
+      "Uber",
+      "Pinterest",
+      "Microsoft",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 451,
+    "Type": "Coding",
+    "Name": "Remove Duplicates from Sorted Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/RemoveDuplicatesFromSortedArray",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Uber",
+      "Amazon",
+      "Bloomberg",
+      "Cisco",
+      "Adobe",
+      "Yahoo",
+      "VMware",
+      "Walmart Labs",
+      "Tencent",
+      "Apple",
+      "Alibaba",
+      "Baidu",
+      "NetEase"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 452,
+    "Type": "Coding",
+    "Name": "Shortest Palindrome",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ShortestPalindrome",
+    "Companies": [
+      "Bloomberg",
+      "Two Sigma",
+      "Walmart Labs",
+      "Facebook",
+      "Adobe",
+      "Alibaba",
+      "Microsoft",
+      "Google",
+      "Pocket Gems"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 453,
+    "Type": "Coding",
+    "Name": "Spiral Matrix",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/SpiralMatrix",
+    "Companies": [
+      "Microsoft",
+      "Google",
+      "Bloomberg",
+      "Apple",
+      "Zillow",
+      "Amazon",
+      "Uber",
+      "Hulu",
+      "Paypal",
+      "Epic Systems",
+      "Yelp",
+      "eBay",
+      "Baidu",
+      "Adobe",
+      "Dataminr",
+      "JPMorgan",
+      "Facebook",
+      "Tencent",
+      "Walmart Labs",
+      "Yahoo",
+      "Redfin",
+      "ServiceNow",
+      "Oracle"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 454,
+    "Type": "Coding",
+    "Name": "Trapping Rain Water",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/TrappingRainWater",
+    "Companies": [
+      "Goldman Sachs",
+      "Facebook",
+      "Lyft",
+      "Amazon",
+      "Bloomberg",
+      "Google",
+      "Microsoft",
+      "Airbnb",
+      "Uber",
+      "Apple",
+      "Adobe",
+      "Dataminr",
+      "Grab",
+      "Qualtrics",
+      "Intuit",
+      "Snapchat",
+      "Wish",
+      "Alibaba",
+      "Twitter",
+      "eBay",
+      "Baidu",
+      "Zenefits",
+      "Intel",
+      "Palantir Technologies",
+      "TripAdvisor",
+      "Huawei"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers",
+      "Stack"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 455,
+    "Type": "Coding",
+    "Name": "Valid Number",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ValidNumber",
+    "Companies": [
+      "Facebook",
+      "LinkedIn",
+      "Apple",
+      "Zillow",
+      "Adobe",
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Math",
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 456,
+    "Type": "Coding",
+    "Name": "Valid Palindrome",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ValidPalindrome",
+    "Companies": [
+      "Facebook",
+      "Apple",
+      "Microsoft",
+      "Amazon",
+      "Google",
+      "Adobe",
+      "Yandex",
+      "TripAdvisor",
+      "Airbnb",
+      "Snapchat",
+      "Uber",
+      "Zenefits"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Two Pointers",
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 457,
+    "Type": "Coding",
+    "Name": "Valid Parentheses",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ValidParentheses",
+    "Companies": [
+      "Facebook",
+      "LinkedIn",
+      "Amazon",
+      "Bloomberg",
+      "Google",
+      "Microsoft",
+      "Twitter",
+      "Expedia",
+      "Uber",
+      "Akuna Capital",
+      "Apple",
+      "VMware",
+      "Paypal",
+      "Twilio",
+      "Mathworks",
+      "Samsung",
+      "Riot Games",
+      "Yandex",
+      "Lyft",
+      "Zillow",
+      "Alibaba",
+      "Cloudera",
+      "Adobe",
+      "Tencent",
+      "Blizzard",
+      "eBay",
+      "Baidu",
+      "Visa",
+      "Pure Storage",
+      "Indeed",
+      "TripleByte",
+      "ServiceNow",
+      "Yahoo",
+      "Capital One",
+      "Oracle",
+      "Huawei",
+      "Yelp",
+      "Zappos",
+      "Qualcomm",
+      "Gilt Groupe",
+      "Aetion",
+      "Yatra",
+      "Rubrik",
+      "Zynga",
+      "TripAdvisor",
+      "Booking.com",
+      "Lending Club",
+      "Zenefits"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Stack"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 458,
+    "Type": "Coding",
+    "Name": "Binary Search Tree Iterator",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/BinarySearchTreeIterator",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Microsoft",
+      "Bloomberg",
+      "Qualtrics",
+      "Cloudera",
+      "Uber",
+      "Google",
+      "Oracle",
+      "LinkedIn",
+      "Cisco",
+      "AppDynamics",
+      "Apple"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Stack",
+      "Tree",
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 459,
+    "Type": "Coding",
+    "Name": "Design Tic-Tac-Toe",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/DesignTicTacToe",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "Google",
+      "Facebook",
+      "Apple",
+      "TripleByte",
+      "Twitter"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 460,
+    "Type": "Coding",
+    "Name": "Moving Average from Data Stream",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/MovingAverageFromDataStream",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Bloomberg",
+      "Uber",
+      "Twitter",
+      "Amazon",
+      "Microsoft",
+      "Indeed"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Design",
+      "Queue"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 461,
+    "Type": "Coding",
+    "Name": "Peeking Iterator",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/PeekingIterator",
+    "Companies": [
+      "Apple",
+      "Amazon",
+      "Paypal",
+      "Google",
+      "Square",
+      "Microsoft",
+      "Morgan Stanley",
+      "Yahoo"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 462,
+    "Type": "Coding",
+    "Name": "Range Sum Query 2D - Mutable",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/RangeSumQuery2DMutable",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Houzz",
+      "Baidu"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 463,
+    "Type": "Coding",
+    "Name": "Zigzag Iterator",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/ZigzagIterator",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Apple",
+      "Groupon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 464,
+    "Type": "Coding",
+    "Name": "Decode Ways",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/DecodeWays",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Uber",
+      "Amazon",
+      "Bloomberg",
+      "Yahoo",
+      "LiveRamp",
+      "Expedia",
+      "Salesforce",
+      "Twitter",
+      "Databricks",
+      "Square",
+      "Pinterest",
+      "Apple",
+      "Goldman Sachs"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 465,
+    "Type": "Coding",
+    "Name": "Edit Distance",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/EditDistance",
+    "Companies": [
+      "Google",
+      "LinkedIn",
+      "Microsoft",
+      "Amazon",
+      "Bloomberg",
+      "Baidu",
+      "Yahoo",
+      "Apple",
+      "Alibaba",
+      "NetEase",
+      "Square",
+      "TripleByte",
+      "Cisco",
+      "Facebook",
+      "Snapchat",
+      "Adobe",
+      "Huawei",
+      "VMware"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 466,
+    "Type": "Coding",
+    "Name": "House Robber II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/HouseRobber2",
+    "Companies": [
+      "Google",
+      "Salesforce",
+      "Baidu",
+      "Adobe",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 467,
+    "Type": "Coding",
+    "Name": "Maximum Vacation Days",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/MaximumVacationDays",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Uber"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 468,
+    "Type": "Coding",
+    "Name": "Minimum Path Sum",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/MinimumPathSum",
+    "Companies": [
+      "Microsoft",
+      "Google",
+      "Amazon",
+      "Goldman Sachs",
+      "Bloomberg",
+      "Alibaba",
+      "Yelp"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 469,
+    "Type": "Coding",
+    "Name": "Sentence Screen Fitting",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/SentenceScreenFitting",
+    "Companies": [
+      "Google",
+      "Yelp"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 470,
+    "Type": "Coding",
+    "Name": "Word Break",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/WordBreak",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Google",
+      "Uber",
+      "Bloomberg",
+      "Yelp",
+      "Apple",
+      "Snapchat",
+      "Microsoft",
+      "Qualtrics",
+      "VMWare",
+      "Zillow",
+      "Oracle",
+      "Alibaba",
+      "Paypal",
+      "Yahoo",
+      "Twitter",
+      "Lyft",
+      "Adobe",
+      "Zenefits",
+      "Pinterest",
+      "eBay",
+      "Indeed",
+      "Pocket Gems",
+      "Square",
+      "Coupang"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 471,
+    "Type": "Coding",
+    "Name": "K Empty Slots",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/KEmptySlots",
+    "Companies": [
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array",
+      "Binary Search Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 472,
+    "Type": "Coding",
+    "Name": "License Key Formatting",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/LicenseKeyFormatting",
+    "Companies": [
+      "Google",
+      "Amazon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 473,
+    "Type": "Coding",
+    "Name": "Longest Univalue Path",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/LongestUnivaluePath",
+    "Companies": [
+      "Google",
+      "Alibaba",
+      "Amazon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Tree",
+      "Recursion"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 474,
+    "Type": "Coding",
+    "Name": "Next Closest Time",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/NextClosestTime",
+    "Companies": [
+      "Google",
+      "Facebook"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 475,
+    "Type": "Coding",
+    "Name": "Repeated String Match",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/RepeatedStringMatch",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 476,
+    "Type": "Coding",
+    "Name": "Insert into a Cyclic Sorted List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/LinkedList/InsertIntoACyclicSortedList",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 477,
+    "Type": "Coding",
+    "Name": "Merge k Sorted Lists",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/LinkedList/MergeKSortedLists",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "LinkedIn",
+      "Google",
+      "Facebook",
+      "Uber",
+      "Twitter",
+      "Airbnb",
+      "IXL"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Linked List",
+      "Divide and Conquer",
+      "Heap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 478,
+    "Type": "Coding",
+    "Name": "Maximum Product of Word Lengths",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Others/MaximumProductOfWordLengths",
+    "Companies": [
+      "Works Applications",
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 479,
+    "Type": "Coding",
+    "Name": "UTF-8 Validation",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Others/UTF8Validation",
+    "Companies": [
+      "Palantir Technologies",
+      "Google",
+      "Facebook",
+      "Apple",
+      "Uber",
+      "Nvidia"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 480,
+    "Type": "Coding",
+    "Name": "Android Unlock Patterns",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/AndroidUnlockPatterns",
+    "Companies": [
+      "Google",
+      "Snapchat",
+      "Microsoft",
+      "Apple"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Dynamic Programming",
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 481,
+    "Type": "Coding",
+    "Name": "Strobogrammatic Number II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/StrobogrammaticNumber2",
+    "Companies": [
+      "Google",
+      "Facebook"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Math",
+      "Recursion"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 482,
+    "Type": "Coding",
+    "Name": "Word Search II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/WordSearch2",
+    "Companies": [
+      "Amazon",
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Airbnb",
+      "Uber",
+      "Houzz",
+      "Snapchat",
+      "Yelp",
+      "Apple",
+      "Pocket Gems",
+      "Yahoo",
+      "Lyft"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Backtracking",
+      "Trie"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 483,
+    "Type": "Coding",
+    "Name": "Word Squares",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/WordSquares",
+    "Companies": [
+      "Oracle",
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Backtracking",
+      "Trie"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 484,
+    "Type": "Coding",
+    "Name": "Diagonal Traverse",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/DiagonalTraverse",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Bloomberg",
+      "Adobe",
+      "Amazon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 485,
+    "Type": "Coding",
+    "Name": "Evaluate Reverse Polish Notation",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/EvaluateReversePolishNotation",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Two Sigma",
+      "Google",
+      "Uber",
+      "Amazon",
+      "Pure Storage",
+      "Adobe",
+      "Yelp"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Stack"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 486,
+    "Type": "Coding",
+    "Name": "Find K Pairs with Smallest Sums",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/FindKPairsWithSmallestSums",
+    "Companies": [
+      "Amazon",
+      "Google",
+      "LinkedIn",
+      "Microsoft",
+      "Uber"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Heap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 487,
+    "Type": "Coding",
+    "Name": "Find K-th Smallest Pair Distance",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/FindKthSmallestPairDistance",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array",
+      "Binary Search",
+      "Heap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 488,
+    "Type": "Coding",
+    "Name": "Insert Interval",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/InsertInterval",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Uber",
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Twitter",
+      "Tableau",
+      "Square",
+      "Lyft",
+      "Dropbox"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 489,
+    "Type": "Coding",
+    "Name": "Kth Largest Element in an Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/KthLargestElementInAnArray",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Google",
+      "Microsoft",
+      "Goldman Sachs",
+      "Apple",
+      "Baidu",
+      "Tencent",
+      "Nvidia",
+      "LinkedIn",
+      "Alibaba",
+      "Bloomberg",
+      "Airbnb",
+      "eBay",
+      "Twitter",
+      "IXL",
+      "Snapchat",
+      "Yelp",
+      "Yahoo",
+      "Pocket Gems"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Divide and Conquer",
+      "Heap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 490,
+    "Type": "Coding",
+    "Name": "Longest Palindromic Substring",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/LongestPalindromicSubstring",
+    "Companies": [
+      "Amazon",
+      "Microsoft",
+      "Facebook",
+      "Google",
+      "Adobe",
+      "Apple",
+      "Yahoo",
+      "Alibaba",
+      "Airbnb",
+      "GoDaddy",
+      "Roblox",
+      "Baidu",
+      "Cisco",
+      "NetEase",
+      "IBM",
+      "JPMorgan",
+      "Yelp",
+      "eBay",
+      "Tencent",
+      "Uber",
+      "Bloomberg",
+      "Huawei",
+      "Twitter",
+      "Works Applications",
+      "Expedia",
+      "Lyft",
+      "Pure Storage",
+      "Sumologic",
+      "Zenefits",
+      "VMWare",
+      "VMWare",
+      "Goo",
+      "Qualtrics",
+      "Dropbox",
+      "Walmart Labs",
+      "Yandex",
+      "Paypal",
+      "Oracle",
+      "Salesforce"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 491,
+    "Type": "Coding",
+    "Name": "Merge Intervals",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/MergeIntervals",
+    "Companies": [
+      "Palantir Technologies",
+      "Facebook",
+      "Google",
+      "Bloomberg",
+      "Uber",
+      "Microsoft",
+      "LinkedIn",
+      "Amazon",
+      "Apple",
+      "Oracle",
+      "Cisco",
+      "Yelp",
+      "Goldman Sachs",
+      "Twitter",
+      "Salesforce",
+      "Yahoo",
+      "Nvidia",
+      "Dataminr",
+      "Paypal",
+      "Intuit",
+      "Zenefits",
+      "Snapchat",
+      "GoDaddy",
+      "Dropbox",
+      "Pinterest",
+      "Walmart Labs",
+      "SAP"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 492,
+    "Type": "Coding",
+    "Name": "Minimum Window Substring",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/MinimumWindowSubstring",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "LinkedIn",
+      "Amazon",
+      "Microsoft",
+      "Airbnb",
+      "Apple",
+      "Uber",
+      "Bloomberg",
+      "Walmart Labs",
+      "VMware",
+      "Alibaba",
+      "LiveRamp",
+      "Netsuite",
+      "Yahoo",
+      "Adobe",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Two Pointers",
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 493,
+    "Type": "Coding",
+    "Name": "Next Greater Element I",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/NextGreaterElement1",
+    "Companies": [
+      "Amazon",
+      "Bloomberg",
+      "Google",
+      "Mathworks",
+      "Adobe"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Stack"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 494,
+    "Type": "Coding",
+    "Name": "Pacific Atlantic Water Flow",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/PacificAtlanticWaterFlow",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "Oracle",
+      "Google",
+      "Uber",
+      "Expedia"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Depth-first Search",
+      "Breadth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 495,
+    "Type": "Coding",
+    "Name": "Range Module",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/RangeModule",
+    "Companies": [
+      "Google",
+      "Machine Zone",
+      "Coupang"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array",
+      "Segment Tree",
+      "Binary Search Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 496,
+    "Type": "Coding",
+    "Name": "Shortest Distance from All Buildings",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/ShortestDistanceFromAllBuildings",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Amazon",
+      "Zenefits"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Breadth-first search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 497,
+    "Type": "Coding",
+    "Name": "Sort Transformed Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/SortTransformedArray",
+    "Companies": [
+      "Google",
+      "Facebook"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Math",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 498,
+    "Type": "Coding",
+    "Name": "Sqrt(x)",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/SqrtOfX",
+    "Companies": [
+      "Google",
+      "LinkedIn",
+      "Microsoft",
+      "Bloomberg",
+      "Apple",
+      "Amazon",
+      "Facebook",
+      "Uber",
+      "Alibaba",
+      "Yahoo",
+      "Salesforce"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Math",
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 499,
+    "Type": "Coding",
+    "Name": "Closest Binary Search Tree Value",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/ClosestBinarySearchTreeValue",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "LinkedIn",
+      "eBay",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Binary Search",
+      "Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 500,
+    "Type": "Coding",
+    "Name": "Course Schedule",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/CourseSchedule",
+    "Companies": [
+      "Amazon",
+      "Facebook",
+      "Google",
+      "Goldman Sachs",
+      "Yelp",
+      "Intuit",
+      "Paypal",
+      "Microsoft",
+      "Uber",
+      "Oracle",
+      "LinkedIn",
+      "Apple",
+      "Zenefits"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Depth-first Search",
+      "Breadth-first Search",
+      "Graph",
+      "Topological Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 501,
+    "Type": "Coding",
+    "Name": "Evaluate Division",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/EvaluateDivision",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Uber"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Union Find",
+      "Graph"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 502,
+    "Type": "Coding",
+    "Name": "Inorder Successor in BST",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/InorderSuccessorInBst",
+    "Companies": [
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Facebook",
+      "Palantir Technologies",
+      "Arista Networks",
+      "Pocket Gems",
+      "Baidu"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 503,
+    "Type": "Coding",
+    "Name": "Redundant Connection II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/RedundantConnection2",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search",
+      "Union Find",
+      "Graph"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 504,
+    "Type": "Coding",
+    "Name": "Robot Room Cleaner",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/RobotRoomCleaner",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Amazon"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 505,
+    "Type": "Coding",
+    "Name": "Validate Binary Search Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/ValidateBinarySearchTree",
+    "Companies": [
+      "Facebook",
+      "Bloomberg",
+      "Microsoft",
+      "Amazon",
+      "Google",
+      "Uber",
+      "Capital One",
+      "TripAdvisor",
+      "LinkedIn",
+      "Apple",
+      "Walmart Labs",
+      "Nvidia",
+      "Nutanix",
+      "Qualtrics",
+      "VMware",
+      "Square",
+      "Snapchat",
+      "Baidu"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Google Interview",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 506,
+    "Type": "Coding",
+    "Name": "Best Time to Buy and Sell Stock II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/BestTimeToBuySellStock2",
+    "Companies": [
+      "Amazon",
+      "Facebook",
+      "Alibaba",
+      "Goldman Sachs",
+      "Adobe",
+      "Bloomberg",
+      "Microsoft",
+      "Intuit",
+      "Zappos",
+      "Google",
+      "Zenefits",
+      "Citadel",
+      "VMware",
+      "Baidu",
+      "Airbnb",
+      "Tencent",
+      "JPMorgan",
+      "Morgan Stanley",
+      "Oracle",
+      "Apple",
+      "LinkedIn",
+      "Palantir Technologies",
+      "Grab",
+      "Uber",
+      "Yahoo"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 507,
+    "Type": "Coding",
+    "Name": "Contains Duplicate",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/ContainsDuplicate",
+    "Companies": [
+      "Adobe",
+      "Microsoft",
+      "Google",
+      "Bloomberg",
+      "Amazon",
+      "Yahoo",
+      "Facebook",
+      "Baidu",
+      "Yelp",
+      "Airbnb",
+      "Palantir Technologies"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 508,
+    "Type": "Coding",
+    "Name": "Intersection of Two Arrays II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/IntersectionOfTwoArrays2",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Oracle",
+      "Yelp",
+      "Bloomberg",
+      "Amazon",
+      "Alibaba"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table",
+      "Two Pointers",
+      "Binary Search",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 509,
+    "Type": "Coding",
+    "Name": "Move Zeroes",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/MoveZeroes",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "SAP",
+      "Walmart Labs",
+      "Bloomberg",
+      "Microsoft",
+      "Apple",
+      "eBay",
+      "Uber",
+      "Paypal",
+      "Baidu",
+      "Lyft",
+      "Amazon",
+      "Yahoo",
+      "Oracle"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 510,
+    "Type": "Coding",
+    "Name": "Plus One",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/PlusOne",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Uber",
+      "Microsoft",
+      "Bloomberg",
+      "eBay",
+      "Adobe",
+      "Amazon",
+      "Airbnb"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 511,
+    "Type": "Coding",
+    "Name": "Remove Duplicates from Sorted Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/RemoveDuplicatesFromSortedArray",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Uber",
+      "Bloomberg",
+      "Cisco",
+      "Adobe",
+      "Yahoo",
+      "VMware",
+      "Walmart Labs",
+      "Apple",
+      "Alibaba",
+      "NetEase"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 512,
+    "Type": "Coding",
+    "Name": "Rotate Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/RotateArray",
+    "Companies": [
+      "Uber",
+      "Facebook",
+      "Amazon",
+      "Microsoft",
+      "Google",
+      "Oracle",
+      "Adobe",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 513,
+    "Type": "Coding",
+    "Name": "Rotate Image",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/RotateImage",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "Apple",
+      "Google",
+      "Nvidia",
+      "Facebook",
+      "Akuna Capital",
+      "Houzz",
+      "ServiceNow",
+      "Baidu",
+      "Wish",
+      "Adobe",
+      "Bloomberg",
+      "Epic Systems",
+      "Salesforce",
+      "Paypal"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 514,
+    "Type": "Coding",
+    "Name": "Single Number",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/SingleNumber",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Adobe",
+      "SAP",
+      "Alibaba",
+      "Amazon",
+      "Microsoft",
+      "Oracle",
+      "Twitter",
+      "Zillow",
+      "Expedia",
+      "Airbnb",
+      "Baidu",
+      "Riot Games",
+      "Zappos",
+      "VMware",
+      "Palantir Technologies"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table",
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 515,
+    "Type": "Coding",
+    "Name": "Two Sum",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/TwoSum",
+    "Companies": [
+      "Google",
+      "Adobe",
+      "Amazon",
+      "Apple",
+      "Microsoft",
+      "Facebook",
+      "Uber",
+      "Yahoo",
+      "Alibaba",
+      "Bloomberg",
+      "LinkedIn",
+      "Baidu",
+      "Morgan Stanley",
+      "SAP",
+      "Airbnb",
+      "Yandex",
+      "Goldman Sachs",
+      "Aetion",
+      "Paypal",
+      "Visa",
+      "Indeed",
+      "GoDaddy",
+      "Affirm",
+      "Box",
+      "eBay",
+      "Cisco",
+      "Oracle",
+      "Works Applications",
+      "Radius",
+      "Snapchat",
+      "Tencent",
+      "Zenefits",
+      "Samsung",
+      "Valve",
+      "BlackRock",
+      "Lyft",
+      "IBM",
+      "Citrix",
+      "NetEase",
+      "Expedia",
+      "Twitter",
+      "Huawei",
+      "Mathworks",
+      "Two Sigma",
+      "Intuit",
+      "Hulu",
+      "Coursera",
+      "Yelp",
+      "MAQ Software",
+      "Helix",
+      "Walmart Labs",
+      "Grab",
+      "Zappos",
+      "Nvidia",
+      "Fallible",
+      "Zillow",
+      "Pinterest",
+      "TripAdvisor",
+      "Symantec",
+      "IXL",
+      "Zynga",
+      "Intel",
+      "HTC",
+      "Riot Games",
+      "AppDynamics",
+      "Quora",
+      "Alation",
+      "Gilt Groupe",
+      "JPMorgan",
+      "Epic Systems",
+      "Dropbox",
+      "VMware",
+      "Jump Trading",
+      "Sina",
+      "Lending Club",
+      "Salesforce",
+      "Wish",
+      "LiveRamp",
+      "Pocket Gems",
+      "Groupon",
+      "Tableau",
+      "Deutsche Bank",
+      "Capital One",
+      "ServiceNow",
+      "Jane Street",
+      "Akuna Capital",
+      "Redfin",
+      "Drawbridge",
+      "Booking.com",
+      "Blizzard"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 516,
+    "Type": "Coding",
+    "Name": "Valid Sudoku",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/ValidSudoku",
+    "Companies": [
+      "Uber",
+      "Microsoft",
+      "Facebook",
+      "Pinterest",
+      "Apple",
+      "Amazon",
+      "Google",
+      "Bloomberg",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 517,
+    "Type": "Coding",
+    "Name": "Best Time to Buy and Sell Stock",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/DynamicProgramming/BestTimeToBuyAndSellStock",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 518,
+    "Type": "Coding",
+    "Name": "Climbing Stairs",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/DynamicProgramming/ClimbingStairs",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 519,
+    "Type": "Coding",
+    "Name": "Maximum Subarray",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/DynamicProgramming/MaximumSubarray",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Divide and Conquer",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 520,
+    "Type": "Coding",
+    "Name": "Delete Node in a Linked List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/DeleteNodeInALinkedList",
+    "Companies": [
+      "Microsoft",
+      "Paypal",
+      "Apple",
+      "Amazon",
+      "VMware",
+      "Google",
+      "Adobe",
+      "Bloomberg",
+      "Capital One",
+      "NetEase",
+      "Tencent",
+      "Baidu"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 521,
+    "Type": "Coding",
+    "Name": "Linked List Cycle",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/LinkedListCycle",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 522,
+    "Type": "Coding",
+    "Name": "Merge Two Sorted Lists",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/MergeTwoSortedLists",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 523,
+    "Type": "Coding",
+    "Name": "Palindrome Linked List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/PalindromeLinkedList",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 524,
+    "Type": "Coding",
+    "Name": "Remove Nth Node From End of List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/RemoveNthNodeFromEndOfList",
+    "Companies": [
+      "Microsoft",
+      "Google",
+      "Adobe",
+      "Bloomberg",
+      "Apple",
+      "Cisco",
+      "Uber",
+      "Facebook",
+      "Aetion",
+      "Amazon",
+      "Baidu",
+      "Expedia",
+      "Zenefits",
+      "eBay",
+      "Alibaba",
+      "ServiceNow"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Linked List",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 525,
+    "Type": "Coding",
+    "Name": "Reverse Linked List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/ReverseLinkedList",
+    "Companies": [
+      "Microsoft",
+      "Apple",
+      "Amazon",
+      "Facebook",
+      "Bloomberg",
+      "Yandex",
+      "Adobe",
+      "Mathworks",
+      "Google",
+      "Goldman Sachs",
+      "Cisco",
+      "Nvidia",
+      "VMware",
+      "Alibaba",
+      "Oracle",
+      "Baidu",
+      "Intuit",
+      "Intel",
+      "Paypal",
+      "Two Sigma",
+      "Tencent",
+      "Expedia",
+      "Yahoo",
+      "Walmart Labs",
+      "TripAdvisor",
+      "Qualcomm",
+      "Zynga",
+      "Zappos",
+      "Citrix",
+      "SAP",
+      "Nutanix",
+      "eBay",
+      "EMC",
+      "Snapchat",
+      "Zenefits",
+      "Yelp",
+      "Uber",
+      "Twitter"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 526,
+    "Type": "Coding",
+    "Name": "First Bad Version",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/SortingAndSearching/FirstBadVersion",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 527,
+    "Type": "Coding",
+    "Name": "Merge Sorted Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/SortingAndSearching/MergeSortedArray",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 528,
+    "Type": "Coding",
+    "Name": "Count and Say",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/CountAndSay",
+    "Companies": [
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Adobe",
+      "Bloomberg",
+      "Facebook",
+      "Apple",
+      "Intuit",
+      "eBay",
+      "Epic Systems",
+      "Airbnb",
+      "VMware",
+      "Salesforce"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 529,
+    "Type": "Coding",
+    "Name": "First Unique Character in a String",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/FirstUniqueCharacterInAString",
+    "Companies": [
+      "Bloomberg",
+      "Facebook",
+      "Amazon",
+      "Apple",
+      "Zillow",
+      "Goldman Sachs",
+      "Google",
+      "Microsoft",
+      "Yahoo",
+      "Airbnb",
+      "SAP",
+      "Alibaba",
+      "Oracle"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 530,
+    "Type": "Coding",
+    "Name": "Implement strStr()",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ImplementStrStr",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "Facebook",
+      "Apple",
+      "Bloomberg",
+      "Adobe",
+      "Pocket Gems",
+      "Tencent",
+      "Alibaba",
+      "Yahoo",
+      "Google",
+      "Baidu",
+      "Salesforce",
+      "Zillow"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 531,
+    "Type": "Coding",
+    "Name": "Longest Common Prefix",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/LongestCommonPrefix",
+    "Companies": [
+      "Adobe",
+      "Facebook",
+      "Apple",
+      "Google",
+      "Quora",
+      "Yahoo",
+      "Oracle",
+      "Pinterest",
+      "Microsoft",
+      "IXL",
+      "Airbnb",
+      "Yelp",
+      "Citrix",
+      "Amazon",
+      "Aetion",
+      "Alibaba",
+      "Baidu",
+      "Tencent",
+      "Expedia",
+      "Samsung",
+      "Deutsche Bank",
+      "VMware",
+      "Huawei"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 532,
+    "Type": "Coding",
+    "Name": "Reverse Integer",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ReverseInteger",
+    "Companies": [
+      "Adobe",
+      "Bloomberg",
+      "Google",
+      "Amazon",
+      "Microsoft",
+      "Apple",
+      "JPMorgan",
+      "Facebook",
+      "Yahoo",
+      "Lyft",
+      "NetEase",
+      "Alibaba",
+      "Aetion",
+      "Airbnb",
+      "Symantec",
+      "Baidu",
+      "Huawei",
+      "Oracle",
+      "Tencent",
+      "Twitter",
+      "LinkedIn",
+      "GoDaddy",
+      "eBay",
+      "VMware",
+      "Epic Systems",
+      "Pocket Gems",
+      "Quora",
+      "Works Applications",
+      "Zillow",
+      "HTC"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 533,
+    "Type": "Coding",
+    "Name": "Reverse String",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ReverseString",
+    "Companies": [
+      "Microsoft",
+      "Apple",
+      "Bloomberg",
+      "Adobe",
+      "Google",
+      "GoDaddy",
+      "Walmart Labs",
+      "Alibaba",
+      "Goldman Sachs",
+      "Tencent",
+      "eBay",
+      "Amazon",
+      "Facebook",
+      "Baidu",
+      "LinkedIn",
+      "Airbnb",
+      "VMware",
+      "IBM",
+      "Cisco"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 534,
+    "Type": "Coding",
+    "Name": "String to Integer (atoi)",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/StringToIntegerAtoi",
+    "Companies": [
+      "Microsoft",
+      "Facebook",
+      "Goldman Sachs",
+      "Google",
+      "Amazon",
+      "Apple",
+      "Adobe",
+      "Cisco",
+      "Redfin",
+      "Zillow",
+      "LinkedIn",
+      "Bloomberg",
+      "Yahoo",
+      "Baidu",
+      "Alibaba",
+      "VMware",
+      "Citrix",
+      "eBay",
+      "Airbnb",
+      "Tencent",
+      "Huawei",
+      "Uber"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String",
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 535,
+    "Type": "Coding",
+    "Name": "Valid Anagram",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ValidAnagram",
+    "Companies": [
+      "Bloomberg",
+      "Google",
+      "Microsoft",
+      "Apple",
+      "Yahoo",
+      "Uber",
+      "Facebook",
+      "Amazon",
+      "Goldman Sachs",
+      "Paypal",
+      "VMware",
+      "Snapchat",
+      "Samsung",
+      "Oracle",
+      "Cisco",
+      "Yelp",
+      "LeetCode"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Hash Table",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 536,
+    "Type": "Coding",
+    "Name": "Valid Palindrome",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ValidPalindrome",
+    "Companies": [
+      "Facebook",
+      "Microsoft",
+      "Amazon",
+      "Apple",
+      "Google",
+      "Adobe",
+      "Yandex",
+      "Airbnb",
+      "Snapchat",
+      "TripAdvisor",
+      "Uber",
+      "Zenefits"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 537,
+    "Type": "Coding",
+    "Name": "Binary Tree Level Order Traversal",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/BinaryTreeLevelOrderTraversal",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree",
+      "Breadth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 538,
+    "Type": "Coding",
+    "Name": "Convert Sorted Array to Binary Search Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/ConvertSortedArrayToBinarySearchTree",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 539,
+    "Type": "Coding",
+    "Name": "Maximum Depth of Binary Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/MaximumDepthOfBinaryTree",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 540,
+    "Type": "Coding",
+    "Name": "Symmetric Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/SymmetricTree",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search",
+      "Breadth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 541,
+    "Type": "Coding",
+    "Name": "Validate Binary Search Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/ValidateBinarySearchTree",
+    "Companies": [],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 542,
+    "Type": "Coding",
+    "Name": "103. Binary Tree Zigzag Level Order Traversal",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P103_BinaryTreeZigzagLevelOrderTraversal",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Amazon",
+      "Google",
+      "Microsoft",
+      "Apple",
+      "Uber",
+      "Bloomberg",
+      "Apple",
+      "Tencent",
+      "eBay",
+      "Alibaba"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Stack",
+      "Tree",
+      "Breadth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 543,
+    "Type": "Coding",
+    "Name": "122. Best Time to Buy and Sell Stock II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P122_BestTimeToBuySellStock2",
+    "Companies": [
+      "Amazon",
+      "Facebook",
+      "Alibaba",
+      "Goldman Sachs",
+      "Adobe",
+      "Bloomberg",
+      "Microsoft",
+      "Intuit",
+      "Zappos",
+      "Google",
+      "Zenefits",
+      "Citadel",
+      "VMware",
+      "Baidu",
+      "Airbnb",
+      "Tencent",
+      "JPMorgan",
+      "Morgan Stanley",
+      "Oracle",
+      "Apple",
+      "LinkedIn",
+      "Palantir Technologies",
+      "Grab",
+      "Uber",
+      "Yahoo"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 544,
+    "Type": "Coding",
+    "Name": "125. Valid Palindrome",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P125_ValidPalindrome",
+    "Companies": [
+      "Facebook",
+      "Microsoft",
+      "Amazon",
+      "Apple",
+      "Google",
+      "Adobe",
+      "Yandex",
+      "Airbnb",
+      "Snapchat",
+      "TripAdvisor",
+      "Uber",
+      "Zenefits"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 545,
+    "Type": "Coding",
+    "Name": "127. Word Ladder",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P127_WordLadder",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Amazon",
+      "Google",
+      "Microsoft",
+      "Twitter",
+      "Bloomberg",
+      "Lyft",
+      "Yelp",
+      "eBay",
+      "Hulu",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Breadth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 546,
+    "Type": "Coding",
+    "Name": "131. Palindrome Partitioning",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P131_PalindromePartitioning",
+    "Companies": [],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 547,
+    "Type": "Coding",
+    "Name": "136. Single Number",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P136_SingleNumber",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Adobe",
+      "SAP",
+      "Alibaba",
+      "Amazon",
+      "Microsoft",
+      "Oracle",
+      "Twitter",
+      "Zillow",
+      "Expedia",
+      "Airbnb",
+      "Baidu",
+      "Riot Games",
+      "Zappos",
+      "VMware",
+      "Palantir Technologies"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 548,
+    "Type": "Coding",
+    "Name": "149. Max Points on a Line",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P149_MaxPointsOnALine",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Google",
+      "Amazon",
+      "Adobe",
+      "Alibaba",
+      "Twitter",
+      "Apple"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 549,
+    "Type": "Coding",
+    "Name": "150. Evaluate Reverse Polish Notation",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P150_EvaluateReversePolishNotation",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Two Sigma",
+      "Google",
+      "Uber"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Stack"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 550,
+    "Type": "Coding",
+    "Name": "152. Maximum Product Subarray",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P152_MaximumProductSubarray",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Yelp",
+      "Amazon",
+      "Google",
+      "Pocket Gems"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 551,
+    "Type": "Coding",
+    "Name": "156. Binary Tree Upside Down",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P156_BinaryTreeUpsideDown",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 552,
+    "Type": "Coding",
+    "Name": "170. Two Sum III - Data structure design",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P170_TwoSum3_DataStructureDesign",
+    "Companies": [
+      "LinkedIn",
+      "Uber"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 553,
+    "Type": "Coding",
+    "Name": "173. Binary Search Tree Iterator",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P173_BinarySearchTreeIterator",
+    "Companies": [
+      "Facebook",
+      "Amazon",
+      "Microsoft",
+      "Bloomberg",
+      "Qualtrics",
+      "Cloudera",
+      "Uber",
+      "Google",
+      "Oracle",
+      "LinkedIn",
+      "Cisco",
+      "AppDynamics",
+      "Apple"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Stack",
+      "Tree",
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 554,
+    "Type": "Coding",
+    "Name": "187. Repeated DNA Sequences",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P187_RepeatedDnaSequences",
+    "Companies": [
+      "LinkedIn",
+      "Amazon"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Bit Manipulation"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 555,
+    "Type": "Coding",
+    "Name": "189. Rotate Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P189_RotateArray",
+    "Companies": [
+      "Uber",
+      "Facebook",
+      "Amazon",
+      "Microsoft",
+      "Google",
+      "Oracle",
+      "Adobe",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 556,
+    "Type": "Coding",
+    "Name": "198. House Robber",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P198_HouseRobber",
+    "Companies": [
+      "LinkedIn",
+      "Airbnb",
+      "Tencent",
+      "Alibaba",
+      "Samsung",
+      "Baidu",
+      "Pocket Gems",
+      "Amazon",
+      "Google"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 557,
+    "Type": "Coding",
+    "Name": "200. Number of Islands",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P200_NumberOfIslands",
+    "Companies": [
+      "Amazon",
+      "Lyft",
+      "Google",
+      "Facebook",
+      "Bloomberg",
+      "Uber",
+      "LinkedIn",
+      "Microsoft",
+      "Apple",
+      "Qualtrics",
+      "Yahoo",
+      "Twitter",
+      "Alibaba",
+      "AppDynamics",
+      "Yelp",
+      "Oracle",
+      "eBay",
+      "Expedia",
+      "Goldman Sachs",
+      "Affirm"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Depth-first Search",
+      "Breadth-first Search",
+      "Union Find"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 558,
+    "Type": "Coding",
+    "Name": "10. Regular Expression Matching",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P10_RegularExpressionMatching",
+    "Companies": [
+      "Facebook",
+      "Microsoft",
+      "Google",
+      "Coursera",
+      "Bloomberg",
+      "Apple"
+    ],
+    "Categories": [
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String",
+      "Dynamic Programming",
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 559,
+    "Type": "Coding",
+    "Name": "14. Longest Common Prefix",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P14_LongestCommonPrefix",
+    "Companies": [
+      "Adobe",
+      "Facebook",
+      "Apple",
+      "Google",
+      "Quora",
+      "Yahoo",
+      "Oracle",
+      "Pinterest",
+      "Microsoft",
+      "IXL",
+      "Airbnb",
+      "Yelp",
+      "Citrix",
+      "Amazon",
+      "Aetion",
+      "Alibaba",
+      "Baidu",
+      "Tencent",
+      "Expedia",
+      "Samsung",
+      "Deutsche Bank",
+      "VMware",
+      "Huawei"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 560,
+    "Type": "Coding",
+    "Name": "15. 3Sum",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P15_ThreeSum",
+    "Companies": [],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 561,
+    "Type": "Coding",
+    "Name": "18. 4Sum",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P18_FourSum",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 562,
+    "Type": "Coding",
+    "Name": "19. Remove Nth Node From End of List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P19_RemoveNthNodeFromEndOfList",
+    "Companies": [
+      "Microsoft",
+      "Google",
+      "Adobe",
+      "Bloomberg",
+      "Apple",
+      "Cisco",
+      "Uber",
+      "Facebook",
+      "Aetion",
+      "Amazon",
+      "Baidu",
+      "Expedia",
+      "Zenefits",
+      "eBay",
+      "Alibaba",
+      "ServiceNow"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Linked List",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 563,
+    "Type": "Coding",
+    "Name": "1. Two Sum",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P1_TwoSum",
+    "Companies": [
+      "Google",
+      "Adobe",
+      "Amazon",
+      "Apple",
+      "Microsoft",
+      "Facebook",
+      "Uber",
+      "Yahoo",
+      "Alibaba",
+      "Bloomberg",
+      "LinkedIn",
+      "Baidu",
+      "Morgan Stanley",
+      "SAP",
+      "Airbnb",
+      "Yandex",
+      "Goldman Sachs",
+      "Aetion",
+      "Paypal",
+      "Visa",
+      "Indeed",
+      "GoDaddy",
+      "Affirm",
+      "Box",
+      "eBay",
+      "Cisco",
+      "Oracle",
+      "Works Applications",
+      "Radius",
+      "Snapchat",
+      "Tencent",
+      "Zenefits",
+      "Samsung",
+      "Valve",
+      "BlackRock",
+      "Lyft",
+      "IBM",
+      "Citrix",
+      "NetEase",
+      "Expedia",
+      "Twitter",
+      "Huawei",
+      "Mathworks",
+      "Two Sigma",
+      "Intuit",
+      "Hulu",
+      "Coursera",
+      "Yelp",
+      "MAQ Software",
+      "Helix",
+      "Walmart Labs",
+      "Grab",
+      "Zappos",
+      "Nvidia",
+      "Fallible",
+      "Zillow",
+      "Pinterest",
+      "TripAdvisor",
+      "Symantec",
+      "IXL",
+      "Zynga",
+      "Intel",
+      "HTC",
+      "Riot Games",
+      "AppDynamics",
+      "Quora",
+      "Alation",
+      "Gilt Groupe",
+      "JPMorgan",
+      "Epic Systems",
+      "Dropbox",
+      "VMware",
+      "Jump Trading",
+      "Sina",
+      "Lending Club",
+      "Salesforce",
+      "Wish",
+      "LiveRamp",
+      "Pocket Gems",
+      "Groupon",
+      "Tableau",
+      "Deutsche Bank",
+      "Capital One",
+      "ServiceNow",
+      "Jane Street",
+      "Akuna Capital",
+      "Redfin",
+      "Drawbridge",
+      "Booking.com",
+      "Blizzard"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 564,
+    "Type": "Coding",
+    "Name": "21. Merge Two Sorted Lists",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P21_MergeTwoSortedLists",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "LinkedIn",
+      "Apple"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 565,
+    "Type": "Coding",
+    "Name": "23. Merge k Sorted Lists",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P23_MergeKSortedLists",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "LinkedIn",
+      "Google",
+      "Facebook",
+      "Uber",
+      "Twitter",
+      "Airbnb",
+      "IXL"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Linked List",
+      "Divide and Conquer",
+      "Heap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 566,
+    "Type": "Coding",
+    "Name": "26. Remove Duplicates from Sorted Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P26_RemoveDuplicatesFromSortedArray",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Uber",
+      "Bloomberg",
+      "Cisco",
+      "Adobe",
+      "Yahoo",
+      "VMware",
+      "Walmart Labs",
+      "Apple",
+      "Alibaba",
+      "NetEase"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 567,
+    "Type": "Coding",
+    "Name": "28. Implement strStr()",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P28_ImplementStrStr",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "Facebook",
+      "Apple",
+      "Bloomberg",
+      "Adobe",
+      "Pocket Gems",
+      "Tencent",
+      "Alibaba",
+      "Yahoo",
+      "Google",
+      "Baidu",
+      "Salesforce",
+      "Zillow"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 568,
+    "Type": "Coding",
+    "Name": "31. Next Permutation",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P31_NextPermutation",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Sumologic",
+      "Uber",
+      "Quora",
+      "Houzz",
+      "Samsung",
+      "Apple",
+      "Adobe",
+      "Rubrik",
+      "LinkedIn",
+      "Airbnb",
+      "Matlab"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 569,
+    "Type": "Coding",
+    "Name": "33. Search in Rotated Sorted Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P33_SearchInRotatedSortedArray",
+    "Companies": [
+      "Microsoft",
+      "LinkedIn",
+      "Facebook",
+      "Uber",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 570,
+    "Type": "Coding",
+    "Name": "34. Find First and Last Position of Element in Sorted Array",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P34_FindFirstAndLastPositionOfElementInSortedArray",
+    "Companies": [
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 571,
+    "Type": "Coding",
+    "Name": "35. Search Insert Position",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P35_SearchInsertPosition",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 572,
+    "Type": "Coding",
+    "Name": "36. Valid Sudoku",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P36_ValidSudoku",
+    "Companies": [
+      "Uber",
+      "Microsoft",
+      "Facebook",
+      "Pinterest",
+      "Apple",
+      "Amazon",
+      "Google",
+      "Bloomberg",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 573,
+    "Type": "Coding",
+    "Name": "38. Count and Say",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P38_CountAndSay",
+    "Companies": [
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Adobe",
+      "Bloomberg",
+      "Facebook",
+      "Apple",
+      "Intuit",
+      "eBay",
+      "Epic Systems",
+      "Airbnb",
+      "VMware",
+      "Salesforce"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 574,
+    "Type": "Coding",
+    "Name": "46. Permutations",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P46_Permutations",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Google",
+      "Amazon",
+      "Microsoft",
+      "Bloomberg",
+      "Yahoo"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 575,
+    "Type": "Coding",
+    "Name": "47. Permutations II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P47_Permutations2",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Tencent",
+      "Houzz",
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 576,
+    "Type": "Coding",
+    "Name": "48. Rotate Image",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P48_RotateImage",
+    "Companies": [
+      "Microsoft",
+      "Amazon",
+      "Apple",
+      "Google",
+      "Nvidia",
+      "Facebook",
+      "Akuna Capital",
+      "Houzz",
+      "ServiceNow",
+      "Baidu",
+      "Wish",
+      "Adobe",
+      "Bloomberg",
+      "Epic Systems",
+      "Salesforce",
+      "Paypal"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 577,
+    "Type": "Coding",
+    "Name": "4. Median of Two Sorted Arrays",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P4_MedianOfTwoSortedArrays",
+    "Companies": [
+      "Google",
+      "Amazon",
+      "Adobe",
+      "Microsoft",
+      "Apple",
+      "Goldman Sachs",
+      "Uber",
+      "Bloomberg",
+      "Walmart Labs",
+      "Facebook",
+      "Rubrik",
+      "Tencent",
+      "Alibaba",
+      "VMWare",
+      "Airbnb",
+      "Two Sigma",
+      "Baidu",
+      "NetEase",
+      "Twitter",
+      "Snapchat",
+      "Zillow",
+      "Pocket Gems",
+      "Aetion",
+      "Yahoo",
+      "Hulu",
+      "eBay",
+      "Lyft",
+      "Cloudera",
+      "Zappos",
+      "LinkedIn",
+      "Pinterest",
+      "Nutanix",
+      "Zenefits",
+      "Dropbox"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array",
+      "Binary Search",
+      "Divide and Conquer"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 578,
+    "Type": "Coding",
+    "Name": "50. Pow(x, n)",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P50_Pow_x_n",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Amazon",
+      "Google",
+      "Microsoft",
+      "Bloomberg",
+      "Alibaba"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Math",
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 579,
+    "Type": "Coding",
+    "Name": "53. Maximum Subarray",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P53_MaximumSubarray",
+    "Companies": [
+      "Facebook",
+      "Microsoft",
+      "Amazon",
+      "eBay",
+      "Uber",
+      "LinkedIn",
+      "Apple",
+      "NetEase",
+      "Tencent",
+      "Adobe",
+      "Google",
+      "Alibaba",
+      "Hulu",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Divide and Conquer",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 580,
+    "Type": "Coding",
+    "Name": "56. Merge Intervals",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P56_MergeIntervals",
+    "Companies": [
+      "Facebook",
+      "Palantir Technologies",
+      "Google",
+      "Amazon",
+      "Uber",
+      "LinkedIn",
+      "Apple",
+      "Microsoft",
+      "Bloomberg",
+      "Yelp",
+      "Zenefits",
+      "Twitter"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 581,
+    "Type": "Coding",
+    "Name": "57. Insert Interval",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P57_InsertInterval",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Uber",
+      "Google",
+      "Microsoft",
+      "Amazon",
+      "Twitter"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Array",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 582,
+    "Type": "Coding",
+    "Name": "65. Valid Number",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P65_ValidNumber",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Adobe",
+      "Google"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Math",
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 583,
+    "Type": "Coding",
+    "Name": "66. Plus One",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P66_PlusOne",
+    "Companies": [
+      "Google",
+      "Facebook",
+      "Uber",
+      "Microsoft",
+      "Bloomberg",
+      "eBay",
+      "Adobe",
+      "Amazon",
+      "Airbnb"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 584,
+    "Type": "Coding",
+    "Name": "68. Text Justification",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P68_TextJustification",
+    "Companies": [
+      "Apple",
+      "Microsoft",
+      "Uber",
+      "Google",
+      "Facebook",
+      "Snapchat",
+      "Amazon",
+      "LinkedIn",
+      "Airbnb"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 585,
+    "Type": "Coding",
+    "Name": "76. Minimum Window Substring",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P76_MinimumWindowSubstring",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "LinkedIn",
+      "Amazon",
+      "Microsoft",
+      "Airbnb",
+      "Apple",
+      "Uber",
+      "Bloomberg",
+      "Walmart Labs",
+      "VMware",
+      "Alibaba",
+      "LiveRamp",
+      "Netsuite",
+      "Yahoo",
+      "Adobe",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Two Pointers",
+      "String"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 586,
+    "Type": "Coding",
+    "Name": "7. Reverse Integer",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P7_ReverseInteger",
+    "Companies": [
+      "Adobe",
+      "Bloomberg",
+      "Google",
+      "Amazon",
+      "Microsoft",
+      "Apple",
+      "JPMorgan",
+      "Facebook",
+      "Yahoo",
+      "Lyft",
+      "NetEase",
+      "Alibaba",
+      "Aetion",
+      "Airbnb",
+      "Symantec",
+      "Baidu",
+      "Huawei",
+      "Oracle",
+      "Tencent",
+      "Twitter",
+      "LinkedIn",
+      "GoDaddy",
+      "eBay",
+      "VMware",
+      "Epic Systems",
+      "Pocket Gems",
+      "Quora",
+      "Works Applications",
+      "Zillow",
+      "HTC"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 587,
+    "Type": "Coding",
+    "Name": "8. String to Integer (atoi)",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P8_StringToIntegerAtoi",
+    "Companies": [
+      "Microsoft",
+      "Facebook",
+      "Goldman Sachs",
+      "Google",
+      "Amazon",
+      "Apple",
+      "Adobe",
+      "Cisco",
+      "Redfin",
+      "Zillow",
+      "LinkedIn",
+      "Bloomberg",
+      "Yahoo",
+      "Baidu",
+      "Alibaba",
+      "VMware",
+      "Citrix",
+      "eBay",
+      "Airbnb",
+      "Tencent",
+      "Huawei",
+      "Uber"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String",
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 588,
+    "Type": "Coding",
+    "Name": "205. Isomorphic Strings",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P205_IsomorphicStrings",
+    "Companies": [
+      "LinkedIn",
+      "Google",
+      "Bloomberg",
+      "Yahoo",
+      "eBay"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 589,
+    "Type": "Coding",
+    "Name": "206. Reverse Linked List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P206_ReverseLinkedList",
+    "Companies": [
+      "Microsoft",
+      "Apple",
+      "Amazon",
+      "Facebook",
+      "Bloomberg",
+      "Yandex",
+      "Adobe",
+      "Mathworks",
+      "Google",
+      "Goldman Sachs",
+      "Cisco",
+      "Nvidia",
+      "VMware",
+      "Alibaba",
+      "Oracle",
+      "Baidu",
+      "Intuit",
+      "Intel",
+      "Paypal",
+      "Two Sigma",
+      "Tencent",
+      "Expedia",
+      "Yahoo",
+      "Walmart Labs",
+      "TripAdvisor",
+      "Qualcomm",
+      "Zynga",
+      "Zappos",
+      "Citrix",
+      "SAP",
+      "Nutanix",
+      "eBay",
+      "EMC",
+      "Snapchat",
+      "Zenefits",
+      "Yelp",
+      "Uber",
+      "Twitter"
+    ],
+    "Categories": [
+      "Explore -> Interview -> Top Interview Questions - Easy",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 590,
+    "Type": "Coding",
+    "Name": "211. Add and Search Word - Data structure design",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P211_AddAndSearchWord_DataStructureDesign",
+    "Companies": [
+      "Facebook",
+      "Amazon"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Backtracking",
+      "Design",
+      "Trie"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 591,
+    "Type": "Coding",
+    "Name": "217. Contains Duplicate",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P217_ContainsDuplicate",
+    "Companies": [
+      "Adobe",
+      "Microsoft",
+      "Google",
+      "Bloomberg",
+      "Amazon",
+      "Yahoo",
+      "Facebook",
+      "Baidu",
+      "Yelp",
+      "Airbnb",
+      "Palantir Technologies"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 592,
+    "Type": "Coding",
+    "Name": "236. Lowest Common Ancestor of a Binary Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P236_LowestCommonAncestorOfABinaryTree",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Tencent",
+      "Bloomberg",
+      "Uber",
+      "Amazon",
+      "Facebook",
+      "Apple"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 593,
+    "Type": "Coding",
+    "Name": "237. Delete Node in a Linked List",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P237_DeleteNodeInALinkedList",
+    "Companies": [
+      "Microsoft",
+      "Paypal",
+      "Apple",
+      "Amazon",
+      "VMware",
+      "Google",
+      "Adobe",
+      "Bloomberg",
+      "Capital One",
+      "NetEase",
+      "Tencent",
+      "Baidu"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Linked List"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 594,
+    "Type": "Coding",
+    "Name": "238. Product of Array Except Self",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P238_ProductOfArrayExceptSelf",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Yelp",
+      "Expedia",
+      "Zenefits",
+      "Google",
+      "Hulu",
+      "Apple",
+      "Amazon",
+      "Facebook",
+      "Lyft"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 595,
+    "Type": "Coding",
+    "Name": "242. Valid Anagram",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P242_ValidAnagram",
+    "Companies": [
+      "Bloomberg",
+      "Google",
+      "Microsoft",
+      "Apple",
+      "Yahoo",
+      "Uber",
+      "Facebook",
+      "Amazon",
+      "Goldman Sachs",
+      "Paypal",
+      "VMware",
+      "Snapchat",
+      "Samsung",
+      "Oracle",
+      "Cisco",
+      "Yelp",
+      "LeetCode"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 596,
+    "Type": "Coding",
+    "Name": "243. Shortest Word Distance",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P243_ShortestWordDistance",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Indeed"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 597,
+    "Type": "Coding",
+    "Name": "244. Shortest Word Distance 2",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P244_ShortedWordDistance2",
+    "Companies": [
+      "LinkedIn",
+      "Uber",
+      "Indeed",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 598,
+    "Type": "Coding",
+    "Name": "245. Shortest Word Distance 3",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P245_ShortestWordDistance3",
+    "Companies": [
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 599,
+    "Type": "Coding",
+    "Name": "254. Factor Combinations",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P254_FactorCombinations",
+    "Companies": [
+      "LinkedIn",
+      "Bloomberg",
+      "Uber"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Backtracking"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 600,
+    "Type": "Coding",
+    "Name": "256. Paint House",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P256_PaintHouse",
+    "Companies": [
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 601,
+    "Type": "Coding",
+    "Name": "272. Closest Binary Search Tree Value II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P272_ClosestBinarySearchTreeValue2",
+    "Companies": [
+      "LinkedIn",
+      "ForUsAll"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Stack",
+      "Tree"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 602,
+    "Type": "Coding",
+    "Name": "277. Find the Celebrity",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P277_FindTheCelebrity",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Microsoft",
+      "Pinterest",
+      "Apple",
+      "Yahoo"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 603,
+    "Type": "Coding",
+    "Name": "283. Move Zeroes",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P283_MoveZeroes",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "SAP",
+      "Walmart Labs",
+      "Bloomberg",
+      "Microsoft",
+      "Apple",
+      "eBay",
+      "Uber",
+      "Paypal",
+      "Baidu",
+      "Lyft",
+      "Amazon",
+      "Yahoo",
+      "Oracle"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 604,
+    "Type": "Coding",
+    "Name": "297. Serialize and Deserialize Binary Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P297_SerializeAndDeserializeBinaryTree",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Amazon",
+      "Google",
+      "Microsoft",
+      "Intuit",
+      "Uber",
+      "Bloomberg",
+      "Apple",
+      "Yahoo"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Tree",
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 605,
+    "Type": "Coding",
+    "Name": "311. Sparse Matrix Multiplication",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P311_SparseMatrixMultiplication",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Google",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 606,
+    "Type": "Coding",
+    "Name": "339. Nested List Weight Sum",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P339_NestedListWeightSum",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Snapchat"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 607,
+    "Type": "Coding",
+    "Name": "344. Reverse String",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P344_ReverseString",
+    "Companies": [
+      "Microsoft",
+      "Apple",
+      "Bloomberg",
+      "Adobe",
+      "Google",
+      "GoDaddy",
+      "Walmart Labs",
+      "Alibaba",
+      "Goldman Sachs",
+      "Tencent",
+      "eBay",
+      "Amazon",
+      "Facebook",
+      "Baidu",
+      "LinkedIn",
+      "Airbnb",
+      "VMware",
+      "IBM",
+      "Cisco"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Two Pointers"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 608,
+    "Type": "Coding",
+    "Name": "350. Intersection of Two Arrays II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P350_IntersectionOfTwoArrays2",
+    "Companies": [
+      "Facebook",
+      "Google",
+      "Oracle",
+      "Yelp",
+      "Bloomberg",
+      "Amazon",
+      "Alibaba"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Hash Table",
+      "Two Pointers",
+      "Binary Search",
+      "Sort"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 609,
+    "Type": "Coding",
+    "Name": "364. Nested List Weight Sum II",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P364_NestedListWeightSum2",
+    "Companies": [
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 610,
+    "Type": "Coding",
+    "Name": "366. Find Leaves of Binary Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P366_FindLeavesOfBinaryTree",
+    "Companies": [
+      "LinkedIn",
+      "Pocket Gems",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 611,
+    "Type": "Coding",
+    "Name": "367. Valid Perfect Square",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P367_ValidPerfectSquare",
+    "Companies": [
+      "LinkedIn",
+      "Facebook",
+      "Microsoft"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Math",
+      "Binary Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 612,
+    "Type": "Coding",
+    "Name": "387. First Unique Character in a String",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P387_FirstUniqueCharacterInAString",
+    "Companies": [
+      "Bloomberg",
+      "Facebook",
+      "Amazon",
+      "Apple",
+      "Zillow",
+      "Goldman Sachs",
+      "Google",
+      "Microsoft",
+      "Yahoo",
+      "Airbnb",
+      "SAP",
+      "Alibaba",
+      "Oracle"
+    ],
+    "Categories": [
+      "Explore -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "String",
+      "Hash Table"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 613,
+    "Type": "Coding",
+    "Name": "464. Can I Win",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P401_P500/P464_CanIWin",
+    "Companies": [
+      "LinkedIn",
+      "Google"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Dynamic Programming",
+      "Minmax"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 614,
+    "Type": "Coding",
+    "Name": "515. Find Largest Value in Each Tree Row",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P501_P600/P515_FindLargestValueInEachTreeRow",
+    "Companies": [
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Tree",
+      "Depth-first Search",
+      "Breadth-first Search"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 615,
+    "Type": "Coding",
+    "Name": "605. Can Place Flowers",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P605_CanPlaceFlowers",
+    "Companies": [
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 616,
+    "Type": "Coding",
+    "Name": "633. Sum of Square Numbers",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P633_SumOfSquareNumbers",
+    "Companies": [
+      "LinkedIn",
+      "Facebook"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 617,
+    "Type": "Coding",
+    "Name": "647. Palindromic Substrings",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P647_PalindromicSubstrings",
+    "Companies": [
+      "LinkedIn",
+      "Twitter",
+      "Pure Storage",
+      "Facebook",
+      "Amazon",
+      "Expedia",
+      "Google",
+      "Microsoft",
+      "Apple",
+      "Uber"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "String",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 618,
+    "Type": "Coding",
+    "Name": "671. Second Minimum Node In a Binary Tree",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P671_SecondMinimumNodeInABinaryTree",
+    "Companies": [
+      "LinkedIn",
+      "Microsoft",
+      "Apple"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 619,
+    "Type": "Coding",
+    "Name": "698. Partition to K Equal Sum Subsets",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P698_PartitionToKEqualSumSubsets",
+    "Companies": [
+      "LinkedIn",
+      "Bloomberg"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Dynamic Programming",
+      "Recursion"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 620,
+    "Type": "Coding",
+    "Name": "716. Max Stack",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P701_P800/P716_MaxStack",
+    "Companies": [
+      "LinkedIn",
+      "Lyft",
+      "Google",
+      "Pure Storage"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Design"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 621,
+    "Type": "Coding",
+    "Name": "730. Count Different Palindromic Subsequences",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P701_P800/P730_CountDifferentPalindromicSubsequences",
+    "Companies": [
+      "LinkedIn"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String",
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 622,
+    "Type": "Coding",
+    "Name": "921. Minimum Add to Make Parentheses Valid",
+    "Origin": "LeetCode",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P901_P1000/P921_MinimumAddToMakeParenthesesValid",
+    "Companies": [
+      "Facebook"
+    ],
+    "Categories": [
+      "Problems -> Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Stack",
+      "Greedy"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 623,
+    "Type": "Coding",
+    "Name": "Binary Tree to Doubly Linked List",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/BinaryTreeToDoublyLinkedList",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Binary Tree"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 624,
+    "Type": "Coding",
+    "Name": "Clone a Linked List with Next and Random Pointers",
+    "Origin": "",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/CloneLinkedListWithNextAndRandomPointer",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Linked List",
+      "HashMap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 625,
+    "Type": "Coding",
+    "Name": "Common Letters in Input Strings",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/CommonLettersInInputStrings",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "HashMap",
+      "Strings"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 626,
+    "Type": "Coding",
+    "Name": "Find if Number is Little or Big Endian",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/FindNumberLittleOrBigEndian",
+    "Companies": [
+      "Aruba Networks"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 627,
+    "Type": "Coding",
+    "Name": "Implement Queue using Stack",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/ImplementQueueUsingStack",
+    "Companies": [
+      "Aruba Networks"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 628,
+    "Type": "Coding",
+    "Name": "In-memory Database with Nested Transaction Support",
+    "Origin": "",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/InMemoryDatabaseWithNestedTransactions",
+    "Companies": [
+      "Xob"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 629,
+    "Type": "Coding",
+    "Name": "Index Of Last Occurrence Of Element In Array",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/IndexOfLastOccurrenceOfElementInArray",
+    "Companies": [
+      "Apple"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 630,
+    "Type": "Coding",
+    "Name": "Kth Largest Element In Bst",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/KthLargestElementInBst",
+    "Companies": [
+      "Aruba Networks"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 631,
+    "Type": "Coding",
+    "Name": "Level Order Traversal Binary Tree Level By Level",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/LevelOrderTraversalBinaryTreeLevelByLevel",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Binary Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 632,
+    "Type": "Coding",
+    "Name": "Level Order Traversal Of Binary Tree in Single Line",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/LevelOrderTraversalBinaryTreeSingleLine",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Binary Tree"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 633,
+    "Type": "Coding",
+    "Name": "Map Words List to Grid",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/MapWordsListToGrid",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 634,
+    "Type": "Coding",
+    "Name": "Mapping between Message and Code",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/MappingBetweenMessageAndCode",
+    "Companies": [
+      "GoDaddy"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "HashMap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 635,
+    "Type": "Coding",
+    "Name": "Find the number of distinct islands",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/NumberOfDistinctIslands",
+    "Companies": [
+      "Qualtrics"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Depth-first Search",
+      "Breadth-first Search",
+      "Union Find"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 636,
+    "Type": "Coding",
+    "Name": "Remove Duplicates and Return List",
+    "Origin": "",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/RemoveDuplicatesAndReturnList",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Array",
+      "HashMap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 637,
+    "Type": "Coding",
+    "Name": "Remove Duplicates and Return Weighted List",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/RemoveDuplicatesAndReturnWeightedList",
+    "Companies": [
+      "Google"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array",
+      "HashMap"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 638,
+    "Type": "Coding",
+    "Name": "Reverse a String",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/ReverseString",
+    "Companies": [
+      "Aruba Networks"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Strings"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 639,
+    "Type": "Coding",
+    "Name": "Rotate the Bits of a Number",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/RotateTheBitsOfANumber",
+    "Companies": [
+      "Aruba Networks"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Math"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 640,
+    "Type": "Coding",
+    "Name": "Seed Records Per Bin",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/SeedRecordsPerBin",
+    "Companies": [
+      "The Climate Corporation"
+    ],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [],
+    "Languages": [
+      "csharp"
+    ]
+  },
+  {
+    "Id": 641,
+    "Type": "Coding",
+    "Name": "Simple Product Sorting",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/SortCommaSeparatedProducts",
+    "Companies": [
+      "Shopify"
+    ],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Arrays",
+      "Sorting"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 642,
+    "Type": "Coding",
+    "Name": "Swap Two Pointers",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/SwapTwoPointers",
+    "Companies": [
+      "Aruba Networks"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Pointers"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 643,
+    "Type": "Coding",
+    "Name": "Top Three Sequence Visited",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/TopThreeSequenceVisited",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 644,
+    "Type": "Coding",
+    "Name": "Truck Loading Find Total Weight",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/TruckLoadingTotalWeight",
+    "Companies": [
+      "Wayfair"
+    ],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java",
+      "csharp"
+    ]
+  },
+  {
+    "Id": 645,
+    "Type": "Coding",
+    "Name": "Blum-Floyd-Pratt-Rivest-Tarjan Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/BlumFloydPrattRivestTarjanAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Array"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 646,
+    "Type": "Coding",
+    "Name": "Edmonds\u2013Karp Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/EdmondsKarpAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 647,
+    "Type": "Coding",
+    "Name": "Ford\u2013Fulkerson Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/FordFulkersonAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 648,
+    "Type": "Coding",
+    "Name": "Kadane's Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/KadanesAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Breadth-first Search"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 649,
+    "Type": "Coding",
+    "Name": "Knuth\u2013Morris\u2013Pratt Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/KnuthMorrisPrattAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String",
+      "Array"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 650,
+    "Type": "Coding",
+    "Name": "Krushal's Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/KruskalsAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "Tree",
+      "Graph"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 651,
+    "Type": "Coding",
+    "Name": "Lee Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/LeeAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Breadth-first Search"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 652,
+    "Type": "Coding",
+    "Name": "Manacher's Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/ManachersAlgorithm",
+    "Companies": [],
+    "Categories": [
+      "Known Algorithms -> Named Algorithms",
+      "Difficulty -> Hard"
+    ],
+    "Tags": [
+      "String"
+    ],
+    "Languages": []
+  },
+  {
+    "Id": 653,
+    "Type": "Systems Design",
+    "Name": "Design an automated parking garage with object models and APIs",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/AutomatedParkingGarage",
+    "Companies": [
+      "Wayfair"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Object Oriented Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 654,
+    "Type": "Systems Design",
+    "Name": "Design the Backend for an Online Retailer",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/DesignBackendForOnlineRetailer",
+    "Companies": [
+      "Amazon"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 655,
+    "Type": "Systems Design",
+    "Name": "Design a Paywall for a News Portal",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/DesignPaywall",
+    "Companies": [
+      "Qualtrics"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 656,
+    "Type": "Systems Design",
+    "Name": "Elevator with Scheduling Algorithm",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/Elevator",
+    "Companies": [
+      "Box"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design",
+      "Object Oriented Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 657,
+    "Type": "Systems Design",
+    "Name": "Images Deduplicator",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/ImagesDedeplicator",
+    "Companies": [
+      "Netflix"
+    ],
+    "Categories": [
+      "Difficulty -> Medium"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 658,
+    "Type": "Systems Design",
+    "Name": "Scaling Read Requests",
+    "Origin": "Miscellaneous",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/ScalingReadRequests",
+    "Companies": [],
+    "Categories": [
+      "Difficulty -> Easy"
+    ],
+    "Tags": [
+      "Distributed Systems Design"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 659,
+    "Type": "Coding",
+    "Name": "All K Subsequence Maximums",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Blog/SlidingWindow/AllKSubsequenceMaximums",
+    "Companies": [],
+    "Categories": [],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 660,
+    "Type": "Coding",
+    "Name": "Maximum Sum Subsequence",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Blog/SlidingWindow/MaximumSumSubsequence",
+    "Companies": [],
+    "Categories": [],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 661,
+    "Type": "Coding",
+    "Name": "Moving Average",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Blog/SlidingWindow/MovingAverage",
+    "Companies": [],
+    "Categories": [],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 662,
+    "Type": "Behavioral",
+    "Name": "Behavioral Question Set 10",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet10",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 663,
+    "Type": "Behavioral",
+    "Name": "Behavioral Question Set 2",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet2",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 664,
+    "Type": "Behavioral",
+    "Name": "Behavioral Question Set 3",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet3",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 665,
+    "Type": "Behavioral",
+    "Name": "Behavioral Question Set 4",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet4",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 666,
+    "Type": "Coding",
+    "Name": "Array Quadruplet",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/ArrayQuadruplet",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 667,
+    "Type": "Coding",
+    "Name": "Basic Regex Parser",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/BasicRegexParser",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": []
+  },
+  {
+    "Id": 668,
+    "Type": "Coding",
+    "Name": "BST Successor Search",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/BstSuccessorSearch",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 669,
+    "Type": "Coding",
+    "Name": "Decrypt Message",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/DecryptMessage",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 670,
+    "Type": "Coding",
+    "Name": "Number of Paths",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/NumberOfPaths",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [
+      "Dynamic Programming"
+    ],
+    "Languages": [
+      "Java"
+    ]
+  },
+  {
+    "Id": 671,
+    "Type": "Systems Design",
+    "Name": "Key-Value Cache for Search Engine",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/KeyValueCacheForSearchEngine",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 672,
+    "Type": "Systems Design",
+    "Name": "Sales Rank",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/SalesRank",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 673,
+    "Type": "Systems Design",
+    "Name": "Scale on the Cloud",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/ScaleOnTheCloud",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 674,
+    "Type": "Systems Design",
+    "Name": "Social Graph",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/SocialGraph",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 675,
+    "Type": "Systems Design",
+    "Name": "Twitter",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/Twitter",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 676,
+    "Type": "Systems Design",
+    "Name": "Web Crawler",
+    "Origin": "Pramp",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/WebCrawler",
+    "Companies": [],
+    "Categories": [
+      "Difficulty"
+    ],
+    "Tags": [],
+    "Languages": ""
+  },
+  {
+    "Id": 677,
+    "Type": "Course",
+    "Name": "AWS Certified Solutions Architect - Associate",
+    "Origin": "Udemy",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Udemy/src/acloudguru-aws-certified-solutions-architect-associate",
+    "Companies": [],
+    "Categories": [
+      "Courses -> AWS Certified Solutions Architect - Associate",
+      "Instructors -> Ryan Kroonenburg",
+      "Instructors -> Faye Ellis"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Cloud Computing",
+      "Amazon Web Services"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 678,
+    "Type": "Course",
+    "Name": "The Ultimate Hands-On Hadoop - Tame your Big Data!",
+    "Origin": "Udemy",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Udemy/src/the-ultimate-handson-hadoop-tame-your-big-data",
+    "Companies": [],
+    "Categories": [
+      "Courses -> The Ultimate Hands-On Hadoop - Tame your Big Data!",
+      "Instructors -> Frank Kane"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Big Data"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 679,
+    "Type": "Course",
+    "Name": "Ultimate AWS Certified Solutions Architect Associate",
+    "Origin": "Udemy",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Udemy/src/ultimate-aws-certified-solutions-architect-associate",
+    "Companies": [],
+    "Categories": [
+      "Courses -> Ultimate AWS Certified Solutions Architect Associate",
+      "Instructors -> Stephane Maarek"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Cloud Computing",
+      "Amazon Web Services"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 680,
+    "Type": "Reading",
+    "Name": "Building Microservices -  Designing Fine-Grained Systems",
+    "Origin": "Notes - Book",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/building-microservices_designing-fine-grained-systems",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Authors -> Sam Neuman"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Cloud Computing",
+      "DevOps",
+      "Microservices"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 681,
+    "Type": "Reading",
+    "Name": "Designing Data Intensive Applications",
+    "Origin": "Notes - Book",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/designing-data-intensive-applications",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Authors -> Martin Kleppmann"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Cloud Computing",
+      "Databases"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 682,
+    "Type": "Reading",
+    "Name": "Distributed systems for fun and profit",
+    "Origin": "Notes - Book",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/distributed-systems-for-fun-and-profit",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Authors -> Mikito Takada -> alias -> mixu"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Cloud Computing"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 683,
+    "Type": "Reading",
+    "Name": "I Heart Logs: Event Data, Stream Processing, and Data Integration",
+    "Origin": "Notes - Book",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/i-heart-logs_event-data-stream-processing-data-integration",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Authors -> Jay Kreps"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Event Data",
+      "Data Integration",
+      "Stream Processing"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 684,
+    "Type": "Reading",
+    "Name": "Production-Ready Microservices",
+    "Origin": "Notes - Book",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/production-ready-microservices",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Authors -> Susan Fowler"
+    ],
+    "Tags": [
+      "Distributed Systems",
+      "Cloud Computing",
+      "Microservices",
+      "DevOps",
+      "Site Reliability Engineering"
+    ],
+    "Languages": ""
+  },
+  {
+    "Id": 685,
+    "Type": "Reading",
+    "Name": "Scaling Teams: Strategies for Building Successful Teams and Organizations",
+    "Origin": "Notes - Book",
+    "Link": "https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/scaling-teams_strategies-for-building-successful-teams-and-organizations",
+    "Companies": [],
+    "Categories": [
+      "Books",
+      "Authors -> Alexander Grosse",
+      "Authors -> David Loftesness"
+    ],
+    "Tags": [
+      "Engineering Leadership"
+    ],
+    "Languages": ""
+  }
+]
\ No newline at end of file
diff --git a/problems_list.md b/problems_list.md
new file mode 100644
index 0000000..015df9b
--- /dev/null
+++ b/problems_list.md
@@ -0,0 +1,689 @@
+# List of problems
+
+| Id | Type | Name | Origin | Companies | Categories | Tags | Languages |
+|-----------------------|---------------------|---------------------|-----------------------|--------------------------|---------------------------|---------------------|--------------------------|
+| 1 | Coding | [Median of Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ByteByByte/src/CodingInterviewQuestions/Array/P1_MedianOfArrays) | Byte by Byte |  | Difficulty -> Medium | Array, Searching | Java |
+| 2 | Coding | [0-1 Knapsack](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ByteByByte/src/CodingInterviewQuestions/Array/P2_01Knapsack) | Byte by Byte |  | Difficulty -> Medium | Array, Dynamic Programming | Java |
+| 3 | Coding | [BTree Printer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/BTreePrinter) | Cracking the Coding Interview |  | Books |  | Java |
+| 4 | Coding | [Linked List Node](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/LinkedListNode) | Cracking the Coding Interview |  | Books |  | Java |
+| 5 | Coding | [Tree Node](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/TreeNode) | Cracking the Coding Interview |  | Books |  | Java |
+| 6 | Coding | [Trie](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/Trie) | Cracking the Coding Interview |  | Books |  | Java |
+| 7 | Coding | [Trie Node](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/Helper/TrieNode) | Cracking the Coding Interview |  | Books |  | Java |
+| 8 | Coding | [ArrayList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q0_Introduction/ArrayList) | Cracking the Coding Interview |  | Books, Known Data Structures |  | Java |
+| 9 | Coding | [HashTable](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q0_Introduction/HashTable) | Cracking the Coding Interview |  | Books, Known Data Structures |  | Java |
+| 10 | Coding | [StringBuilder](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q0_Introduction/StringBuilder) | Cracking the Coding Interview |  | Books, Known Data Structures |  | Java |
+| 11 | Coding | [Q1 Is Unique](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q1_IsUnique) | Cracking the Coding Interview |  | Books | Arrays, Strings | Java |
+| 12 | Coding | [Q2 Check Permutation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q2_CheckPermutation) | Cracking the Coding Interview |  | Books | Arrays, Strings | Java |
+| 13 | Coding | [Q3 URLify](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q3_URLify) | Cracking the Coding Interview |  | Books | Arrays, Strings | Java |
+| 14 | Coding | [Q4 Palindrome Permutation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch01_ArraysAndStrings/Q4_PalindromePermutation) | Cracking the Coding Interview |  | Books | Arrays, Strings | Java |
+| 15 | Coding | [Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/CrackingTheCodingInterview/src/Book/IX_InterviewQuestions/DataStructures/Ch02_LinkedLists) | Cracking the Coding Interview |  | Books | Linked Lists | Python |
+| 16 | Coding | [1. Two Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P1_TwoSum) | Daily Coding Problem | Google | Difficulty -> Easy | Array, Hash Table | Java |
+| 17 | Coding | [2. Product of Array Except Self](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P2_ProductOfArrayExceptSelf) | Daily Coding Problem | Uber | Difficulty -> Medium | Array | Java |
+| 18 | Coding | [3. Serialize and Deserialize Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P3_SerializeAndDeserializeBinaryTree) | Daily Coding Problem | Google | Difficulty -> Hard | Tree, Design | Java |
+| 19 | Coding | [4. First Missing Positive](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P4_FirstMissingPositive) | Daily Coding Problem | Stripe | Difficulty -> Hard | Array | Java |
+| 20 | Coding | [5. First and Last Element of Pair](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P1_P100/P5_FirstAndLastElementOfPair) | Daily Coding Problem | Jane Street | Difficulty -> Easy |  | Java |
+| 21 | Coding | [205. Next Permutation Of Integer In Absolute Order](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyCodingProblem/src/P201_300/P205_NextPermutationOfIntegerInAbsoluteOrder) | Daily Coding Problem | IBM | Difficulty -> Medium | Array | Java |
+| 22 | Coding | [1. Add two numbers as a linked list](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P1_AddTwoNumbersAsALinkedList) | Daily Interview Pro | Microsoft | Difficulty -> Medium | Linked List | Java |
+| 23 | Coding | [2. Longest Substring Without Repeating Characters](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P2_LongestSubstringWithoutRepeatingCharacters) | Daily Interview Pro | Microsoft | Difficulty -> Hard | Arrays, Sliding Window | Java |
+| 24 | Coding | [3. Longest Palindromic Substring](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P3_LongestPalindromicSubstring) | Daily Interview Pro | Twitter | Difficulty -> Medium | Arrays | Java |
+| 25 | Coding | [4. Validate Balanced Parentheses](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/DailyInterviewPro/src/P1_P100/P4_ValidateBalancedParentheses) | Daily Interview Pro | Uber | Difficulty -> Medium | Arrays | Java |
+| 26 | Course | [Grokking the Coding Interview: Patterns for Coding Questions](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions |  |  |
+| 27 | Coding | [Maximum Sum Subarray of Size K](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P1_MaximumSumSubarrayOfSizeK) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Sliding Window | Arrays | Java, Python |
+| 28 | Coding | [Smallest Subarray with a given sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P2_SmallestSubarrayWithAGivenSum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Sliding Window | Arrays | Java, Python |
+| 29 | Coding | [Longest Substring with K Distinct Character](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P3_LongestSubstringWithKDistinctCharacters) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Sliding Window | Arrays | Java |
+| 30 | Coding | [Fruits into Baskets](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P4_FruitsIntoBaskets) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Sliding Window | Arrays | Java |
+| 31 | Coding | [No-repeat Substring](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P5_NoRepeatSubstring) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Sliding Window | Arrays | Java |
+| 32 | Coding | [Longest Substring with Same Letters after Replacement](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P6_LongestSubstringWithSameLettersAfterReplacement) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Sliding Window | Arrays | Java |
+| 33 | Coding | [Longest Subarray with Ones after Replacement](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/P7_LongestSubarrayWithOnesAfterReplacement) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Sliding Window | Arrays | Java |
+| 34 | Coding | [Permutation in a String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC1_PermutationInAString) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Sliding Window | Arrays | Java |
+| 35 | Coding | [String Anagrams](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC2_StringAnagrams) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Sliding Window | Arrays | Java |
+| 36 | Coding | [Smallest Window containing Substring](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC3_SmallestWindowContainingSubstring) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Sliding Window | Arrays | Java |
+| 37 | Coding | [Words Concatenation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/PC4_WordsConcatenation) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Sliding Window | Arrays | Java |
+| 38 | Coding | [Average of Subarray of Size K](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch02_Pattern_SlidingWindow/_Introduction_P0_AverageOfSubarrayOfSizeK) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Sliding Window | Arrays | Java, Python |
+| 39 | Coding | [Pair with Target Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P1_PairWithTargetSum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Two Pointers | Arrays, Hash Table | Java |
+| 40 | Coding | [Remove Duplicates](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P2_RemoveDuplicates) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Two Pointers | Arrays | Java |
+| 41 | Coding | [Remove All Instances of K](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P2_RemoveDuplicates/Variants/P1_RemoveAllInstancesOfK) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Two Pointers | Arrays | Java |
+| 42 | Coding | [Squaring a Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P3_SquaringASortedArray) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Two Pointers | Arrays | Java |
+| 43 | Coding | [Triplet Sum to Zero](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P4_TripletSumToZero) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 44 | Coding | [Triplet Sum Close to Target](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P5_TripleSumCloseToTarget) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 45 | Coding | [Triplets with Smaller Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P6_TripletsWithSmallerSum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 46 | Coding | [Return Triplets with Smaller Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P6_TripletsWithSmallerSum/_Variants/P1_ReturnTripletsWithSmallerSum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 47 | Coding | [Subarrays with Product Less than a Target](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P7_SubarraysWithProductLessThanATarget) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 48 | Coding | [Dutch National Flag Problem](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/P8_DutchNationalFlagProblem) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 49 | Coding | [Quadruple Sum to Target](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC1_QuadrupleSumToTarget) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 50 | Coding | [Comparing Strings containing Backspaces](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC2_ComparingStringsContainingBackspaces) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 51 | Coding | [Minimum Window Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC3_MinimumWindowSort) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 52 | Coding | [Maximum Trapping Water](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch03_TwoPointers/PC4_MaximumTrappingWater) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Pointers | Arrays | Java |
+| 53 | Coding | [LinkedList Cycle](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P1_LinkedListCycle) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Fast and Slow Pointers | Linked List | Java |
+| 54 | Coding | [Length of Linked List Cycle](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P1_LinkedListCycle/_Variants/P1_LengthOfLinkedListCycle) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Fast and Slow Pointers | Linked List | Java |
+| 55 | Coding | [Start of LinkedList Cycle](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P2_StartOfLinkedListCycle) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Fast and Slow Pointers | Linked List | Java |
+| 56 | Coding | [Happy Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P3_HappyNumber) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Fast and Slow Pointers |  | Java |
+| 57 | Coding | [Middle of the LinkedList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/P4_MiddleOfTheLinkedList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Fast and Slow Pointers | Linked List | Java |
+| 58 | Coding | [Palindrome LinkedList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/PC1_PalindromeLinkedList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Fast and Slow Pointers | Linked List | Java |
+| 59 | Coding | [Rearrange a LinkedList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/PC2_RearrangeALinkedList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Fast and Slow Pointers | Linked List | Java |
+| 60 | Coding | [Cycle in a Circular Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch04_FastAndSlowPointers/PC3_CycleInACircularArray) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Fast and Slow Pointers | Arrays | Java |
+| 61 | Coding | [Merge Intervals](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P1_MergeIntervals) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Merge Intervals | Arrays | Java |
+| 62 | Coding | [Find If Intervals Overlap](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P1_MergeIntervals/_Variants/FindIfIntervalsOverlap) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Merge Intervals | Arrays | Java |
+| 63 | Coding | [Insert Interval](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P2_InsertInterval) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Merge Intervals | Arrays | Java |
+| 64 | Coding | [Intervals Intersection](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P3_IntervalsIntersection) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Merge Intervals | Arrays | Java |
+| 65 | Coding | [Conflicting Appointments](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P4_ConflictingAppointments) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Merge Intervals | Arrays | Java |
+| 66 | Coding | [Find All Conflicting Appointments](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/P4_ConflictingAppointments/_Variants/P1_FindAllConflictingAppointments) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Merge Intervals | Arrays | Java |
+| 67 | Coding | [Minimum Meeting Rooms](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC1_MinimumMeetingRooms) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Merge Intervals | Arrays | Java |
+| 68 | Coding | [Maximum Number Of Intervals Overlap Point](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC1_MinimumMeetingRooms/_Variants/P1_MaximumNumberOfIntervalsOverlapPoint) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Merge Intervals | Arrays | Java |
+| 69 | Coding | [Minimum Number of Platforms for Train Station](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC1_MinimumMeetingRooms/_Variants/P2_MinimumNumberOfPlatformsForTrainStation) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Merge Intervals | Arrays | Java |
+| 70 | Coding | [Maximum CPU Load](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC2_MaximumCpuLoad) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Merge Intervals | Arrays | Java |
+| 71 | Coding | [Employee Free Time](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch05_MergeIntervals/PC3_EmployeeFreeTime) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Merge Intervals | Arrays | Java |
+| 72 | Coding | [Cyclic Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P1_CyclicSort) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Cyclic Sort | Arrays | Java |
+| 73 | Coding | [Find the Missing Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P2_FindTheMissingNumber) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Cyclic Sort | Arrays | Java |
+| 74 | Coding | [Find all Missing Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P3_FindAllMissingNumbers) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Cyclic Sort | Arrays | Java |
+| 75 | Coding | [Find the Duplicate Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P4_FindTheDuplicateNumber) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Cyclic Sort | Arrays | Java |
+| 76 | Coding | [Find all Duplicate Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/P5_FindAllDuplicateNumbers) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Cyclic Sort | Arrays | Java |
+| 77 | Coding | [Find the Corrupt Pair](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/PC1_FindTheCorruptPair) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Cyclic Sort | Arrays | Java |
+| 78 | Coding | [Find the Smallest Missing Positive Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/PC2_FindTheSmallestMissingPositiveNumber) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Cyclic Sort | Arrays | Java |
+| 79 | Coding | [Find the First K Missing Positive Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch06_CyclicSort/PC3_FindTheFirstKMissingPositiveNumbers) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Cyclic Sort | Arrays | Java |
+| 80 | Coding | [Reverse a LinkedList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P1_ReverseALinkedList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> In-place Reversal of a LinkedList | LinkedList | Java |
+| 81 | Coding | [Reverse a Sub-list](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P2_ReverseASubList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> In-place Reversal of a LinkedList | LinkedList | Java |
+| 82 | Coding | [Reverse First K Elements of a LinkedList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P2_ReverseASubList/_Variants/P1_ReverseFirstKElementsOfLinkedList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> In-place Reversal of a LinkedList | LinkedList | Java |
+| 83 | Coding | [Reverse LinkedList based on Even or Odd Size](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P2_ReverseASubList/_Variants/P2_ReverseLinkedListEvenOddSize) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> In-place Reversal of a LinkedList | LinkedList | Java |
+| 84 | Coding | [Reverse every K-element Sub-list](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/P3_ReverseEveryKElementSubList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> In-place Reversal of a LinkedList | LinkedList | Java |
+| 85 | Coding | [Reverse alternating K-element Sub-list](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/PC1_ReverseAlternatingKElementSubList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> In-place Reversal of a LinkedList | LinkedList | Java |
+| 86 | Coding | [Rotate a LinkedList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch07_InPlaceReversalOfALinkedList/PC2_RotateALinkedList) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> In-place Reversal of a LinkedList | LinkedList | Java |
+| 87 | Coding | [Binary Tree Level Order Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P1_BinaryTreeLevelOrderTraversal) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 88 | Coding | [Reverse Level Order Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P2_ReverseLevelOrderTraversal) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 89 | Coding | [Zigzag Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P3_ZigzagTraversal) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 90 | Coding | [Level Averages in a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P4_LevelAveragesInABinaryTree) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 91 | Coding | [Largest Value on Each Level of a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P4_LevelAveragesInABinaryTree/_Variants/P1_LargestValueOnEachLevelOfABinaryTree) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 92 | Coding | [Minimum Depth of a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P5_MinimumDepthOfABinaryTree) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 93 | Coding | [Maximum Depth of a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P5_MinimumDepthOfABinaryTree/_Variants/P1_MaximumDepthOfABinaryTree) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 94 | Coding | [Level Order Successor](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P6_LevelOrderSuccessor) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 95 | Coding | [Connect Level Order Siblings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/P7_ConnectLevelOrderSiblings) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 96 | Coding | [Connect All Level Order Siblings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/PC1_ConnectAllLevelOrderSiblings) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 97 | Coding | [Right View of a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/PC2_RightViewOfABinaryTree) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 98 | Coding | [Left View of a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch08_TreeBreadthFirstSearch/PC2_RightViewOfABinaryTree/_Variants/P1_LeftViewOfABinaryTree) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Breadth First Search | Binary Tree, Breadth First Search | Java |
+| 99 | Coding | [Binary Tree Path Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P1_BinaryTreePathSum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 100 | Coding | [All Paths for a Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P2_AllPathsForASum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 101 | Coding | [All Root to Leaf Paths](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P2_AllPathsForASum/_Variants/P1_AllRootToLeafPaths) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 102 | Coding | [Root to Leaf Path with Maximum Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P2_AllPathsForASum/_Variants/P2_RootToLeafPathMaxSum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 103 | Coding | [Sum of Path Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P3_SumOfPathNumbers) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 104 | Coding | [Path With Given Sequence](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P4_PathWithGivenSequence) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 105 | Coding | [Count Paths for a Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/P5_CountPathsForASum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 106 | Coding | [Tree Diameter](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/PC1_TreeDiameter) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 107 | Coding | [Path with Maximum Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch09_TreeDepthFirstSearch/PC2_PathWithMaximumSum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Tree Depth First Search | Binary Tree, Depth First Search | Java |
+| 108 | Coding | [Find the Median of a Number Stream](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/P1_FindTheMedianOfANumberStream) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Two Heaps | Two Heaps | Java |
+| 109 | Coding | [Sliding Window Median](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/P2_SlidingWindowMedian) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Two Heaps | Two Heaps | Java |
+| 110 | Coding | [Maximize Capital](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/P3_MaximizeCapital) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Two Heaps | Two Heaps | Java |
+| 111 | Coding | [Next Interval](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch10_TwoHeaps/PC1_NextInterval) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Two Heaps | Two Heaps | Java |
+| 112 | Coding | [Subsets](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P1_Subsets) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Subsets | Subsets | Java |
+| 113 | Coding | [Subsets With Duplicates](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P2_SubsetsWithDuplicates) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Subsets | Subsets | Java |
+| 114 | Coding | [Permutations](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P3_Permutations) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Subsets | Subsets | Java |
+| 115 | Coding | [String Permutations by changing case](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P4_StringPermutationsByChangingCase) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Subsets | Subsets | Java |
+| 116 | Coding | [Balanced Parentheses](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P5_BalancedParentheses) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Subsets | Subsets | Java |
+| 117 | Coding | [Unique Generalized Abbreviations](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/P6_UniqueGeneralizedAbbreviations) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Subsets | Subsets | Java |
+| 118 | Coding | [Evaluate Expression](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/PC1_EvaluateExpression) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Subsets | Subsets | Java |
+| 119 | Coding | [Structurally Unique Binary Search Trees](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/PC2_StructurallyUniqueBinarySearchTrees) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Subsets | Subsets | Java |
+| 120 | Coding | [Count of Structurally Unique Binary Search Trees](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch11_Subsets/PC3_CountOfStructurallyUniqueBinarySearchTrees) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Subsets | Subsets | Java |
+| 121 | Coding | [Order-agnostic Binary Search](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P1_OrderAgnosticBinarySearch) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 122 | Coding | [Ceiling of a Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P2_CeilingOfANumber) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 123 | Coding | [Floor of a Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P2_CeilingOfANumber/_Variants/P1_FloorOfANumber) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 124 | Coding | [Next Letter](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P3_NextLetter) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 125 | Coding | [Number Range](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P4_NumberRange) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 126 | Coding | [Search in a Sorted Infinite Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P5_SearchInASortedInfiniteArray) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 127 | Coding | [Minimum Difference Element](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P6_MinimumDifferenceElement) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 128 | Coding | [Bitonic Array Maximum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/P7_BitonicArrayMaximum) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 129 | Coding | [Search Bitonic Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC1_SearchBitonicArray) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 130 | Coding | [Search in Rotated Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC2_SearchInRotatedArray) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 131 | Coding | [Search in Rotated Array with Duplicates](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC2_SearchInRotatedArray/_Variants/P1_SearchInRotatedArrayWithDuplicates) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 132 | Coding | [Rotation Count](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC3_RotationCount) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 133 | Coding | [Rotation Count with Duplicates](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch12_ModifiedBinarySearch/PC3_RotationCount/_Variants/P1_RotationCountWithDuplicates) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Modified Binary Search | Modified Binary Search | Java |
+| 134 | Coding | [Sum of Elements](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P10_SumOfElements) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Top K Elements | Top K Elements | Java |
+| 135 | Coding | [Rearrange String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P11_RearrangeString) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Top K Elements | Top K Elements | Java |
+| 136 | Coding | [Top 'K' Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P1_TopKNumbers) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Top K Elements | Top K Elements | Java |
+| 137 | Coding | [Kth Smallest Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P2_KthSmallestNumber) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Top K Elements | Top K Elements | Java |
+| 138 | Coding | ['K' Closest Points to the Origin](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P3_KClosestPointsToTheOrigin) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Top K Elements | Top K Elements | Java |
+| 139 | Coding | [Connect Ropes](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P4_ConnectRopes) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Easy, Pattern -> Top K Elements | Top K Elements | Java |
+| 140 | Coding | [Top 'K' Frequent Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P5_TopKFrequentNumbers) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Top K Elements | Top K Elements | Java |
+| 141 | Coding | [Frequency Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P6_FrequencySort) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Top K Elements | Top K Elements | Java |
+| 142 | Coding | [Kth Largest Number in a Stream](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P7_KthLargestNumberInAStream) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Top K Elements | Top K Elements | Java |
+| 143 | Coding | ['K' Closest Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P8_KClosestNumbers) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Top K Elements | Top K Elements | Java |
+| 144 | Coding | [Maximum Distinct Elements](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/P9_MaximumDistinctEKements) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> Top K Elements | Top K Elements | Java |
+| 145 | Coding | [Rearrange String K Distance Apart](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/PC1_RearrangeStringKDistanceApart) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Top K Elements | Top K Elements | Java |
+| 146 | Coding | [Scheduling Tasks](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/PC2_SchedulingTasks) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Top K Elements | Top K Elements | Java |
+| 147 | Coding | [Frequency Stack](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch14_TopKElements/PC3_FrequencyStack) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> Top K Elements | Top K Elements | Java |
+| 148 | Coding | [Merge K Sorted Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P1_MergeKSortedLists) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> K Way Merge | K Way Merge | Java |
+| 149 | Coding | [Kth Smallest Number in M Sorted Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P2_KthSmallestNumberInMSortedLists) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> K Way Merge | K Way Merge | Java |
+| 150 | Coding | [Median Among M Sorted Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P2_KthSmallestNumberInMSortedLists/_Variants/P1_MedianAmongMSortedArrays) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> K Way Merge | K Way Merge | Java |
+| 151 | Coding | [Merge K Sorted Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P2_KthSmallestNumberInMSortedLists/_Variants/P2_MergeKSortedArrays) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> K Way Merge | K Way Merge | Java |
+| 152 | Coding | [Kth Smallest Number in a Sorted Matrix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P3_KthSmallestNumberInASortedMatrix) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> K Way Merge | K Way Merge | Java |
+| 153 | Coding | [Smallest Number Range](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/P4_SmallestNumberRange) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> K Way Merge | K Way Merge | Java |
+| 154 | Coding | [K Pairs with Largest Sums](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch15_KWayMerge/PC1_KPairsWithLargestSums) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Hard, Pattern -> K Way Merge | K Way Merge | Java |
+| 155 | Coding | [0/1 Knapsack](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch16_01Knapsack_DynamicProgramming/P1_01Knapsack) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> 0/1 Knapsack (Dynamic Programming) | 0/1 Knapsack, Dynamic Programming | Java |
+| 156 | Coding | [Equal Subset Sum Partition](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheCodingInterview/Ch16_01Knapsack_DynamicProgramming/P2_EqualSubsetSumPartition) | Educative |  | Courses -> Grokking the Coding Interview: Patterns for Coding Questions, Difficulty -> Medium, Pattern -> 0/1 Knapsack (Dynamic Programming) | Dynamic Programming | Java |
+| 157 | Course | [Grokking the System Design Interview](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview) | Educative |  | Courses -> Grokking the System Design Interview | Distributed Systems Design |  |
+| 158 | Systems Design | [Designing an API Rate Limiter](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/ApiRateLimiter) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 159 | Systems Design | [Designing Dropbox](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Dropbox) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 160 | Systems Design | [Designing Facebook Messenger](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/FacebookMessenger) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 161 | Systems Design | [Designing Facebook's Newsfeed](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/FacebookNewsfeed) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Hard | Distributed Systems Design |  |
+| 162 | Systems Design | [Designing Instagram](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Instagram) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 163 | Systems Design | [Designing Pastebin](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Pastebin) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Easy | Distributed Systems Design |  |
+| 164 | Systems Design | [Design Ticketmaster](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Ticketmaster) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Hard | Distributed Systems Design |  |
+| 165 | Systems Design | [Designing Twitter](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/Twitter) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 166 | Systems Design | [Designing Twitter Search](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/TwitterSearch) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 167 | Systems Design | [Designing Typeahead Suggestion](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/TypeaheadSuggestion) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 168 | Systems Design | [Designing a URL Shortening service like TinyURL](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/URLShorteningServiceLikeTinyURL) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Easy | Distributed Systems Design |  |
+| 169 | Systems Design | [Designing Uber backend](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/UberBackend) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Hard | Distributed Systems Design |  |
+| 170 | Systems Design | [Designing a Web Crawler](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/WebCrawler) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Hard | Distributed Systems Design |  |
+| 171 | Systems Design | [Designing Yelp or Nearby Friends](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/YelpOrNearlyFriends) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Hard | Distributed Systems Design |  |
+| 172 | Systems Design | [Designing Youtube or Netflix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/EducativeIo/Courses/GrokkingTheSystemDesignInterview/02-SystemDesignProblems/YoutubeOrNetflix) | Educative |  | Courses -> Grokking the System Design Interview, Difficulty -> Medium | Distributed Systems Design |  |
+| 173 | Coding | [Q0 Boot Camp](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q0_BootCamp) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 174 | Coding | [Q1 Compute Parity Of Word](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q1_ComputeParityOfWord) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 175 | Coding | [Q2 Swap Bits](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q2_SwapBits) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 176 | Coding | [Q3 Reverse Bits](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q3_ReverseBits) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 177 | Coding | [Q4 Find Closest Int With Same Weight](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q4_FindClosestIntWithSameWeight) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 178 | Coding | [Q5 Multiply Without Arithmetical Operators](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q5_MultiplyWithoutArithmeticalOperators) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 179 | Coding | [Q6 Compute Division](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q6_ComputeDivision) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 180 | Coding | [Q7 Compute Power](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q7_ComputePower) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 181 | Coding | [Q8 Reverse Digits](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q8_ReverseDigits) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 182 | Coding | [Q9 Decimal Integer Palindrome Check](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C5_PrimitiveTypes/Q9_DecimalIntegerPalindromeCheck) | Elements of Programming Interviews |  | Books | Primitive Types | Java |
+| 183 | Coding | [Computing An Alternation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/ComputingAnAlternation) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 184 | Coding | [Q0 Boot Camp](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q0_BootCamp) | Elements of Programming Interviews |  | Books | Arrays | Java, Python |
+| 185 | Coding | [Q10 Compute The Next Permutation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q10_ComputeTheNextPermutation) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 186 | Coding | [Previous Permutation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q10_ComputeTheNextPermutation/Variants/PreviousPermutation) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 187 | Coding | [kth Permutation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q10_ComputeTheNextPermutation/Variants/kthPermutation) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 188 | Coding | [Q11 Sample Offline Data](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q11_SampleOfflineData) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 189 | Coding | [Q12 Sample Online Data](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q12_SampleOnlineData) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 190 | Coding | [Q13 Compute Random Permutation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q13_ComputeRandomPermutation) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 191 | Coding | [Q14 Compute Random Subset](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q14_ComputeRandomSubset) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 192 | Coding | [Q1 Dutch National Flag](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q1_DutchNationalFlag) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 193 | Coding | [Q2 Increment An Arbitrary Precision Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q2_IncrementAnArbitraryPrecisionInteger) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 194 | Coding | [Q3 Multiply Two Arbitrary Precision Integers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q3_MultiplyTwoArbitraryPrecisionIntegers) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 195 | Coding | [Q4 Advancing Through An Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q4_AdvancingThroughAnArray) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 196 | Coding | [Min Number Of Steps](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q4_AdvancingThroughAnArray/Variants/MinNumberOfSteps) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 197 | Coding | [Q5 Delete Duplicates From Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q5_DeleteDuplicatesFromSortedArray) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 198 | Coding | [Limit Duplicates](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q5_DeleteDuplicatesFromSortedArray/Variants/LimitDuplicates) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 199 | Coding | [Q6 Buy And Sell Stock Once](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q6_BuyAndSellStockOnce) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 200 | Coding | [Q7 Buy And Sell Stock Twice](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q7_BuyAndSellStockTwice) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 201 | Coding | [Q8 Enumerate All Primes To N](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q8_EnumerateAllPrimesToN) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 202 | Coding | [Q9 Permute Elements Of Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/ElementsOfProgrammingInterviews/src/Book/C6_Arrays/Q9_PermuteElementsOfArray) | Elements of Programming Interviews |  | Books | Arrays | Java |
+| 203 | Coding | [Binary Search On Array Of Integers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/BinarySearchOnArrayOfIntegers) | Firecode | Oracle | Level1 | Strings, Arrays | Java |
+| 204 | Coding | [Find the First Non Duplicate Character in a String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/FindFirstNonDuplicateCharacterInAString) | Firecode | Oracle | Level1 | Strings, Hash Tables | Java |
+| 205 | Coding | [Flip It](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/FlipIt) | Firecode | Infosys | Level1 | Arrays, Multi Dimensional Arrays | Java |
+| 206 | Coding | [Palindrome Tester](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/PalindromeTester) | Firecode |  | Level1 | Strings, Arrays | Java |
+| 207 | Coding | [Repeated Elements In An Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/RepeatedElementsInAnArray) | Firecode | Bloomberg | Level1 | Arrays | Java |
+| 208 | Coding | [Reverse A String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Firecode/src/Problems/Level1/ReverseAString) | Firecode | Microsoft | Level1 | Strings | Java |
+| 209 | Coding | [Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/BillRyan/src/AlgorithmExercise/Part1_Basics/BasicDataStructure/BinaryTree) | GitHub Repository |  | GitHub -> billryan - yuanbin -> Algorithm Exercise | Binary Tree | Java |
+| 210 | Coding | [Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/BillRyan/src/AlgorithmExercise/Part1_Basics/BasicDataStructure/LinkedList) | GitHub Repository |  | GitHub -> billryan - yuanbin -> Algorithm Exercise | Linked List | Java |
+| 211 | Reading | [System Design Interview](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview) | GitHub Repository |  | GitHub -> checkcheckzz -> System Design Interview | Distributed Systems Design, Object Oriented Design |  |
+| 212 | Reading | [Fallacies of Distributed Systems](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/FallaciesOfDistributedSystems) | Notes - Article |  | GitHub -> checkcheckzz -> System Design Interview, Articles, Authors -> Arnon Rotem-Gal-Oz | Distributed Systems Design |  |
+| 213 | Reading | [How to Ace a Systems Design Interview](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/HowToRockASystemsDesignInterview) | Notes - Blog Post |  | GitHub -> checkcheckzz -> System Design Interview, Blogs -> Palantir Blog |  |  |
+| 214 | Reading | [Introduction to architecting systems for scale](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/IntroductionToArchitectingSystemsForScale) | Notes - Blog Post |  | GitHub -> checkcheckzz -> System Design Interview, Blogs -> Irrational Exuberance!, Authors -> Will Larson | Distributed Systems Design |  |
+| 215 | Reading | [Numbers Everyone Should Know](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/NumbersEveryoneShouldKnow) | Notes - Blog Post |  | GitHub -> checkcheckzz -> System Design Interview, Blogs -> Everything is Data, Authors -> Neil Conway | Distributed Systems Design |  |
+| 216 | Reading | [Scalability for Dummies](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/ScalabilityForDummies) | Notes - Blog Post |  | GitHub -> checkcheckzz -> System Design Interview, Blogs -> Le Cloud Blog, Authors -> Sebastian Kreutzberger | Distributed Systems Design |  |
+| 217 | Reading | [Scalable System Design Patterns](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/ScalableSystemDesignPatterns) | Notes - Blog Post |  | GitHub -> checkcheckzz -> System Design Interview, Blogs -> Pragmatic Programming Techniques, Authors -> Ricky Ho | Distributed Systems Design |  |
+| 218 | Reading | [Scalable Web Architecture and Distributed Systems](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/GitHubRepository/checkcheckzz/system-design-interview/02_BasicKnowledgeAboutSystemDesign/ScalableWebArchitectureAndDistributedSystems) | Notes - Book Chapter |  | GitHub -> checkcheckzz -> System Design Interview, Books -> The Architecture of Open Source Applications, Volume II, Authors -> Kate Matsudaira | Distributed Systems Design |  |
+| 219 | Coding | [Number Of Strings From Encoded Alphabet](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Glassdoor/src/Facebook/NumberOfStringsFromEncodedAlphabet) | Glassdoor | Facebook |  | Strings | Python |
+| 220 | Coding | [HackerRank In A String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/HackerRankInAString) | HackerRank |  | Contests -> RookieRank 2 |  | Java |
+| 221 | Coding | [KnightL On A Chessboard](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/KnightLOnAChessboard) | HackerRank |  | Contests -> RookieRank 2 |  | Java |
+| 222 | Coding | [Migratory Birds](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/MigratoryBirds) | HackerRank |  | Contests -> RookieRank 2 |  | Java |
+| 223 | Coding | [Minimum Absolute Difference In An Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Contests/RookieRank2/MinimumAbsoluteDifferenceInAnArray) | HackerRank |  | Contests -> RookieRank 2 |  | Java |
+| 224 | Coding | [Dam Design](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Miscellaneous/DamDesign) | HackerRank |  | Difficulty -> Easy | Arrays | Python |
+| 225 | Coding | [Divisible Sum Pairs](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Implementation/DivisibleSumPairs) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Implementation, Difficulty -> Easy |  | Java |
+| 226 | Coding | [A Very Big Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/AVeryBigSum) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 227 | Coding | [Circular Array Rotation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/CircularArrayRotation) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 228 | Coding | [Compare The Triplets](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/CompareTheTriplets) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 229 | Coding | [Diagonal Difference](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/DiagonalDifference) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 230 | Coding | [Plus Minus](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/PlusMinus) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 231 | Coding | [Simple Array Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/SimpleArraySum) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 232 | Coding | [Solve Me First](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/SolveMeFirst) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 233 | Coding | [Staircase](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/Staircase) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 234 | Coding | [Time Conversion](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/Algorithms/Warmup/TimeConversion) | HackerRank |  | Tracks -> Problem Solving -> Algorithms -> Warmup |  | Java |
+| 235 | Coding | [Arrays_DS](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/DataStructures/Arrays/Arrays_DS) | HackerRank |  | Tracks -> Problem Solving -> Data Structures | Arrays | Java |
+| 236 | Coding | [2DArray_DS](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/DataStructures/Arrays/TwoDArray_DS) | HackerRank |  | Tracks -> Problem Solving -> Data Structures | Arrays | Java |
+| 237 | Coding | [Reverse A Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/ProblemSolving/DataStructures/LinkedLists/ReverseALinkedList) | HackerRank |  | Tracks -> Problem Solving -> Data Structures | Linked Lists | Java |
+| 238 | Coding | [D0 Hello World](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D0_HelloWorld) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 239 | Coding | [D10 Binary Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D10_BinaryNumbers) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 240 | Coding | [D11 2D Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D11_2DArrays) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 241 | Coding | [D12 Inheritance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D12_Inheritance) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 242 | Coding | [D13 Abstract Classes](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D13_AbstractClasses) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 243 | Coding | [D14 Scope](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D14_Scope) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 244 | Coding | [D15 Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D15_LinkedList) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 245 | Coding | [D16 Exceptions String To Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D16_Exceptions_StringToInteger) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 246 | Coding | [D17 More Exceptions](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D17_MoreExceptions) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 247 | Coding | [D18 Queues And Stacks](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D18_QueuesAndStacks) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 248 | Coding | [D19 Interfaces](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D19_Interfaces) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 249 | Coding | [D1 Data Types](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D1_DataTypes) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 250 | Coding | [D20 Sorting](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D20_Sorting) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 251 | Coding | [D21 Generics](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D21_Generics) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 252 | Coding | [D22 Binary Search Trees](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D22_BinarySearchTrees) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 253 | Coding | [D23 BST Level Order Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D23_BSTLevelOrderTraversal) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 254 | Coding | [D24 More Linked Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D24_MoreLinkedLists) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 255 | Coding | [D25 Running Time And Complexity](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D25_RunningTimeAndComplexity) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 256 | Coding | [D26 Nested Logic](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D26_NestedLogic) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 257 | Coding | [D27 Testing](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D27_Testing) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 258 | Coding | [D28 RegEx Patterns And Intro To Databases](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D28_RegExPatternsAndIntroToDatabases) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 259 | Coding | [D29 Bitwise AND](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D29_BitwiseAND) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 260 | Coding | [D2 Operators](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D2_Operators) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 261 | Coding | [D3 Intro To Conditional Statements](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D3_IntroToConditionalStatements) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 262 | Coding | [D4 Class Vs Instance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D4_ClassVsInstance) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 263 | Coding | [D5 Loops](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D5_Loops) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 264 | Coding | [D6 Lets Review](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D6_LetsReview) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 265 | Coding | [D7 Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D7_Arrays) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 266 | Coding | [D8 Dictionaries And Maps](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D8_DictionariesAndMaps) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 267 | Coding | [D9 Recursion](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/HackerRank/src/Tracks/Tutorials/ThirtyDaysOfCode/D9_Recursion) | HackerRank |  | Tracks -> Tutorials -> Thirty Days of Code |  | Java |
+| 268 | Coding | [amortized1](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/AmortizedComplexity/amortized1) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 269 | Coding | [choose4](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/choose4) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 270 | Coding | [loop_cmpl](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/loop_cmpl) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 271 | Coding | [nested_cmpl](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/nested_cmpl) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 272 | Coding | [nested_cmpl2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/BasicPrimer/nested_cmpl2) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 273 | Coding | [choose1](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/CompareFunctions/choose1) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 274 | Coding | [choose2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/CompareFunctions/choose2) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 275 | Coding | [choose3](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/CompareFunctions/choose3) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 276 | Coding | [rec_cmpl1](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/FunctionCallingItself/rec_cmpl1) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 277 | Coding | [rec_cmpl2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/FunctionCallingItself/rec_cmpl2) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 278 | Coding | [rec_cmpl3](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/FunctionCallingItself/rec_cmpl3) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 279 | Coding | [gcd_cmpl](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/gcd_cmpl) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 280 | Coding | [loop_cmpl2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/loop_cmpl2) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 281 | Coding | [nested_cmpl3](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/nested_cmpl3) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 282 | Coding | [while_cmpl](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level1_TimeComplexity/Problems/Math/while_cmpl) | InterviewBit |  | Courses -> Programming | Time Complexity |  |
+| 283 | Coding | [Spiral Order Matrix 1](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Examples/SpiralOrderMatrix1) | InterviewBit | Microsoft, JPMorgan, Amazon, Flipkart | Courses -> Programming | Arrays | Java |
+| 284 | Coding | [Array Bug](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Primers/ArrayBug) | InterviewBit |  | Courses -> Programming | Arrays | Java |
+| 285 | Coding | [Array 2D](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Primers/Array_2D) | InterviewBit |  | Courses -> Programming | Arrays | Java |
+| 286 | Coding | [Array Impl 1](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Primers/Array_impl1) | InterviewBit |  | Courses -> Programming | Arrays | Java |
+| 287 | Coding | [Largest Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/Arrangement/LargestNumber) | InterviewBit | Amazon | Courses -> Programming | Arrays | Java |
+| 288 | Coding | [Rotate Matrix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/Arrangement/RotateMatrix) | InterviewBit | Google, Facebook, Amazon | Courses -> Programming | Arrays | Java |
+| 289 | Coding | [Add One To Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/ArrayMath/AddOneToNumber) | InterviewBit | Google | Courses -> Programming | Arrays | Java |
+| 290 | Coding | [Min Steps In Infinite Grid](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/ArrayMath/MinStepsInInfiniteGrid) | InterviewBit | Directi | Courses -> Programming | Arrays | Java |
+| 291 | Coding | [Noble Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/Bucketing/NobleInteger) | InterviewBit |  | Courses -> Programming | Arrays | Java |
+| 292 | Coding | [Wave Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/BucketingOrSorting/WaveArray) | InterviewBit | Google, Adobe | Courses -> Programming | Arrays | Java |
+| 293 | Coding | [First Missing Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/MissingOrRepeatedNumber/FirstMissingInteger) | InterviewBit | Model N, InMobi | Courses -> Programming | Arrays | Java |
+| 294 | Coding | [Max Non Negative SubArray](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/SimulationArray/MaxNonNegativeSubArray) | InterviewBit | Google | Courses -> Programming | Arrays | Java |
+| 295 | Coding | [Spiral Order Matrix 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/SimulationArray/SpiralOrderMatrix2) | InterviewBit | Microsoft, JPMorgan, Amazon | Courses -> Programming | Arrays | Java |
+| 296 | Coding | [Set Matrix Zeros](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/SpaceRecycle/SetMatrixZeros) | InterviewBit | Oracle, Amazon | Courses -> Programming | Arrays | Java |
+| 297 | Coding | [Merge Intervals](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/Problems/ValueRanges/MergeIntervals) | InterviewBit | Google | Courses -> Programming | Arrays | Java |
+| 298 | Coding | [Bubble Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/BubbleSort) | InterviewBit |  | Courses -> Programming, Known Algorithms | Arrays, Sorting | Java |
+| 299 | Coding | [Insertion Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/InsertionSort) | InterviewBit |  | Courses -> Programming, Known Algorithms | Arrays, Sorting | Java |
+| 300 | Coding | [Merge Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/MergeSort) | InterviewBit |  | Courses -> Programming, Known Algorithms | Arrays, Sorting | Java |
+| 301 | Coding | [Quick Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/QuickSort) | InterviewBit |  | Courses -> Programming, Known Algorithms | Arrays, Sorting | Java |
+| 302 | Coding | [Selection Sort](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Arrays/SortingAlgorithms/SelectionSort) | InterviewBit |  | Courses -> Programming, Known Algorithms | Arrays, Sorting | Java |
+| 303 | Coding | [All Factors](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/AllFactors) | InterviewBit |  | Courses -> Programming | Math | Java |
+| 304 | Coding | [Binary Representation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/BinaryRepresentation) | InterviewBit |  | Courses -> Programming | Math | Java |
+| 305 | Coding | [Prime Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/PrimeNumbers) | InterviewBit |  | Courses -> Programming | Math | Java |
+| 306 | Coding | [Verify Prime](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Examples/VerifyPrime) | InterviewBit |  | Courses -> Programming | Math | Java |
+| 307 | Coding | [Math Bug01](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Primers/Math_Bug01) | InterviewBit |  | Courses -> Programming | Math | Java |
+| 308 | Coding | [Math Bug02](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Primers/Math_Bug02) | InterviewBit |  | Courses -> Programming | Math | Java |
+| 309 | Coding | [Prime Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/AdHoc/PrimeSum) | InterviewBit | Epic Systems | Courses -> Programming | Math | Java |
+| 310 | Coding | [Sum Of Pairwise Hamming Distance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/AdHoc/SumOfPairwiseHammingDistance) | InterviewBit | Google | Courses -> Programming | Math | Java |
+| 311 | Coding | [Numbers Of Length N And Values Less Than K](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/ArrayDp/NumbersOfLengthNAndValuesLessThanK) | InterviewBit | Google | Courses -> Programming | Math | Java |
+| 312 | Coding | [Excel Column Title](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/BaseConversion/ExcelColumnTitle) | InterviewBit | Amazon | Courses -> Programming | Math | Java |
+| 313 | Coding | [Grid Unique Paths](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/Combinatorics/GridUniquePaths) | InterviewBit | Google, Amazon, Microsoft, Adobe | Courses -> Programming | Math | Java |
+| 314 | Coding | [Palindrome Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/DigitOp/PalindromeInteger) | InterviewBit | HCL | Courses -> Programming | Math | Java |
+| 315 | Coding | [Reverse Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/DigitOp/ReverseInteger) | InterviewBit | HCL, Bloomberg | Courses -> Programming | Math | Java |
+| 316 | Coding | [Rearrange Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberEncoding/RearrangeArray) | InterviewBit | Facebook | Courses -> Programming | Math | Java |
+| 317 | Coding | [Greatest Common Divisor](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberTheory/GreatestCommonDivisor) | InterviewBit | Google, NetApp | Courses -> Programming | Math | Java |
+| 318 | Coding | [Sorted Permutation Rank With Repeats](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberTheory/SortedPermutationRankWithRepeats) | InterviewBit | Housing, Zenefits | Courses -> Programming | Math | Java |
+| 319 | Coding | [Trailing Zeros In Factorial](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level2_Math/Problems/NumberTheory/TrailingZerosInFactorial) | InterviewBit | Microsoft, Jabong, Zillow | Courses -> Programming | Math | Java |
+| 320 | Coding | [Find Element Occurrence](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Examples/FindElementOccurrence) | InterviewBit |  | Courses -> Programming | Binary Search | Java |
+| 321 | Coding | [Rotated Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Examples/RotatedArray) | InterviewBit | Facebook | Courses -> Programming | Binary Search | Java |
+| 322 | Coding | [Square Root Of Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SearchAnswer/SquareRootOfInteger) | InterviewBit | Facebook, Amazon, Microsoft | Courses -> Programming | Binary Search | Java |
+| 323 | Coding | [Implement Power Function](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SearchStepSimulation/ImplementPowerFunction) | InterviewBit | Google, LinkedIn | Courses -> Programming | Binary Search | Java |
+| 324 | Coding | [Search For A Range](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SimpleBinarySearch/SearchForARange) | InterviewBit | Google, Microsoft | Courses -> Programming | Binary Search | Java |
+| 325 | Coding | [Median Of Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SortModification/MedianOfArray) | InterviewBit | Amazon, VMware, Google, Microsoft | Courses -> Programming | Binary Search | Java |
+| 326 | Coding | [Rotated Sorted Array Search](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BinarySearch/Problems/SortModification/RotatedSortedArraySearch) | InterviewBit | Facebook, Google, Microsoft | Courses -> Programming | Binary Search | Java |
+| 327 | Coding | [Single Number 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BitManipulation/Problems/BitArray/SingleNumber2) | InterviewBit | Google, Amazon | Courses -> Programming | Bit Manipulation | Java |
+| 328 | Coding | [Different Bits Sum Pairwise](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BitManipulation/Problems/BitPlay/DifferentBitsSumPairwise) | InterviewBit | Google | Courses -> Programming | Bit Manipulation | Java |
+| 329 | Coding | [Min XOR Value](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_BitManipulation/Problems/Bucketing/MinXorValue) | InterviewBit | Booking.com | Courses -> Programming | Bit Manipulation | Java |
+| 330 | Coding | [Justified Text](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/PrettyPrint/JustifiedText) | InterviewBit | LinkedIn, Google | Courses -> Programming | Strings | Java |
+| 331 | Coding | [Add Binary Strings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/AddBinaryStrings) | InterviewBit | Facebook | Courses -> Programming | Strings | Java |
+| 332 | Coding | [Integer To Roman](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/IntegerToRoman) | InterviewBit | Amazon, Facebook, Microsoft, Twitter | Courses -> Programming | Strings | Java |
+| 333 | Coding | [Multiply Strings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/MultiplyStrings) | InterviewBit | Microsoft, Google | Courses -> Programming | Strings | Java |
+| 334 | Coding | [Roman To Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringMath/RomanToInteger) | InterviewBit | Amazon, Facebook, Microsoft, Twitter | Courses -> Programming | Strings | Java |
+| 335 | Coding | [Atoi](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringParsing/Atoi) | InterviewBit | Adobe, Nvidia, Agilent Systems, Bloomberg, Amazon, Apple, Microsoft, Groupon | Courses -> Programming | Strings | Java |
+| 336 | Coding | [Implement StrStr](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSearch/ImplementStrStr) | InterviewBit | Facebook, Amazon, Qualcomm, Wipro, Microsoft | Courses -> Programming | Strings | Java |
+| 337 | Coding | [Count And Say](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSimulation/CountAndSay) | InterviewBit | Facebook | Courses -> Programming | Strings | Java |
+| 338 | Coding | [Longest Common Prefix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSimulation/LongestCommonPrefix) | InterviewBit | Google | Courses -> Programming | Strings | Java |
+| 339 | Coding | [Palindrome String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringSimulation/PalindromeString) | InterviewBit | Google | Courses -> Programming | Strings | Java |
+| 340 | Coding | [Longest Palindromic Substring](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/StringTricks/LongestPalindromicSubstring) | InterviewBit | Amazon, Microsoft, Groupon | Courses -> Programming | Strings | Java |
+| 341 | Coding | [Reverse The String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_Strings/Problems/Words/ReverseTheString) | InterviewBit | Qualcomm, Amazon, Microsoft, Cisco, Facebook | Courses -> Programming | Strings | Java |
+| 342 | Coding | [Remove Duplicates From Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/InplaceUpdate/RemoveDuplicatesFromSortedArray) | InterviewBit | United Healthgroup, Amazon, Google, Microsoft, Expedia | Courses -> Programming | Two Pointers | Java |
+| 343 | Coding | [Intersection Of Sorted Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/MultipleArrays/IntersectionOfSortedArrays) | InterviewBit | Facebook, Google | Courses -> Programming | Two Pointers | Java |
+| 344 | Coding | [Three Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/Sorting/ThreeSum) | InterviewBit | Facebook, Amazon, Microsoft | Courses -> Programming | Two Pointers | Java |
+| 345 | Coding | [Container With Most Water](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/Tricks/ContainerWithMostWater) | InterviewBit | Facebook, Google | Courses -> Programming | Two Pointers | Java |
+| 346 | Coding | [Minimize The Absolute Difference](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level3_TwoPointers/Problems/TwoPointer/MinimizeAbsoluteDifference) | InterviewBit |  | Courses -> Programming | Two Pointers | Java |
+| 347 | Coding | [Intersection of Linked Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Examples/IntersectionOfLinkedLists) | InterviewBit | Amazon, Microsoft, NetApp, Apache Design | Courses -> Programming | Linked Lists | Java |
+| 348 | Coding | [Reverse Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Examples/ReverseLinkedList) | InterviewBit |  | Courses -> Programming | Linked Lists | Java |
+| 349 | Coding | [Reverse Link List 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/List2Pointer/ReverseLinkList2) | InterviewBit | Facebook, Microsoft, Amazon | Courses -> Programming | Linked Lists | Java |
+| 350 | Coding | [List Cycle](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/ListCycle/ListCycle) | InterviewBit | Amazon, Microsoft, NetApp | Courses -> Programming | Linked Lists | Java |
+| 351 | Coding | [Add Two Numbers As Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/ListMath/AddTwoNumbersAsLists) | InterviewBit | Amazon, Qualcomm, Microsoft, Facebook | Courses -> Programming | Linked Lists | Java |
+| 352 | Coding | [Insertion Sort List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/ListSort/InsertionSortList) | InterviewBit | Microsoft, Google | Courses -> Programming | Linked Lists | Java |
+| 353 | Coding | [Reorder List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_LinkedLists/Problems/PointerMove/ReorderList) | InterviewBit | Amazon | Courses -> Programming | Linked Lists | Java |
+| 354 | Coding | [Generate All Parentheses](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Examples/GenerateAllParentheses) | InterviewBit | Amazon | Courses -> Programming | Stacks, Queues | Java |
+| 355 | Coding | [Reverse String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Examples/ReverseString) | InterviewBit |  | Courses -> Programming | Stacks, Queues | Java |
+| 356 | Coding | [Largest Rectangle In Histogram](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/CleverStack/LargestRectangleInHistogram) | InterviewBit | Google, Facebook | Courses -> Programming | Stacks, Queues | Java |
+| 357 | Coding | [Min Stack](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/MultipleStack/MinStack) | InterviewBit | Yahoo, Amazon, Adobe | Courses -> Programming | Stacks, Queues | Java |
+| 358 | Coding | [Evaluate Expression](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/StackMath/EvaluateExpression) | InterviewBit | Yahoo, Google, Facebook | Courses -> Programming | Stacks, Queues | Java |
+| 359 | Coding | [Redundant Braces](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level4_StacksAndQueues/Problems/StackSimple/RedundantBraces) | InterviewBit | Amazon | Courses -> Programming | Stacks, Queues | Java |
+| 360 | Coding | [Modular Expression](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Examples/ModularExpression) | InterviewBit |  | Courses -> Programming | Backtracking | Java |
+| 361 | Coding | [Reverse Linked List Recursion](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Examples/ReverseLinkedListRecursion) | InterviewBit |  | Courses -> Programming | Backtracking | Java |
+| 362 | Coding | [Palindrome Partitioning](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/BruteForceBuilder/PalindromePartitioning) | InterviewBit | Amazon, Google | Courses -> Programming | Backtracking | Java |
+| 363 | Coding | [NQueens](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/GameSolving/NQueens) | InterviewBit | Qualcomm, Google, Amazon, Splunk | Courses -> Programming | Backtracking | Java |
+| 364 | Coding | [Kth Permutation Sequence](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/MathsAndBacktracking/KthPermutationSequence) | InterviewBit | Amazon | Courses -> Programming | Backtracking | Java |
+| 365 | Coding | [Permutations](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/Permutations/Permutations) | InterviewBit | Microsoft, Adobe, Google | Courses -> Programming | Backtracking | Java |
+| 366 | Coding | [Generated All Parentheses 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/PrunedBuilder/GenerateAllParentheses2) | InterviewBit | Facebook, Microsoft | Courses -> Programming | Backtracking | Java |
+| 367 | Coding | [Combination Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Backtracking/Problems/Subsets/CombinationSum) | InterviewBit | Facebook, Amazon, Adobe | Courses -> Programming | Backtracking | Java |
+| 368 | Coding | [Four Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/HashSearch/FourSum) | InterviewBit | Amazon, Google | Courses -> Programming | Hashing | Java |
+| 369 | Coding | [Two Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/HashSearch/TwoSum) | InterviewBit | Facebook, Amazon, Google | Courses -> Programming | Hashing | Java |
+| 370 | Coding | [Window String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/HashingTwoPointer/WindowString) | InterviewBit | Google, Directi | Courses -> Programming | Hashing | Java, Python |
+| 371 | Coding | [Substring Concatenation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/IncrementalHash/SubstringConcatenation) | InterviewBit | Facebook | Courses -> Programming | Hashing | Java |
+| 372 | Coding | [Equal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/KeyFormation/Equal) | InterviewBit | Facebook | Courses -> Programming | Hashing | Java, Python |
+| 373 | Coding | [Points On The Straight Line](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level5_Hashing/Problems/MathsAndHashing/PointsOnTheStraightLine) | InterviewBit | Google, Amazon, InMobi | Courses -> Programming | Hashing | Java |
+| 374 | Coding | [Merge K Sorted Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_HeapsAndMaps/Problems/Heap/MergeKSortedLists) | InterviewBit | Flipkart, Amazon, Google | Courses -> Programming | Heaps, Maps | Java |
+| 375 | Coding | [LRU Cache](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_HeapsAndMaps/Problems/Heapmap/LruCache) | InterviewBit | Adobe, Citigroup, Amazon | Courses -> Programming | Heaps, Maps | Java |
+| 376 | Coding | [Ways To Form Max Heap](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_HeapsAndMaps/Problems/Math/WaysToFormMaxHeap) | InterviewBit | Directi | Courses -> Programming | Heaps, Maps | Java |
+| 377 | Coding | [Next Greater Number Bst](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Examples/NextGreaterNumberBst) | InterviewBit |  | Courses -> Programming | Trees | Java |
+| 378 | Coding | [Valid Binary Search Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Examples/ValidBinarySearchTree) | InterviewBit | Amazon, Facebook | Courses -> Programming | Trees | Java |
+| 379 | Coding | [BST Iterator](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/BstIterator) | InterviewBit | Apple, Amazon, Facebook | Courses -> Programming | Trees | Java |
+| 380 | Coding | [Kth Smallest Element In Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/KthSmallestElementInTree) | InterviewBit | Amazon | Courses -> Programming | Trees | Java |
+| 381 | Coding | [Recover Binary Search Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/RecoverBinarySearchTree) | InterviewBit | Microsoft | Courses -> Programming | Trees | Java |
+| 382 | Coding | [Two Sum Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/BstTraversal/TwoSumBinaryTree) | InterviewBit | Amazon | Courses -> Programming | Trees | Java |
+| 383 | Coding | [Invert The Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/InPlaceChange/InvertTheBinaryTree) | InterviewBit | Google | Courses -> Programming | Trees | Java |
+| 384 | Coding | [Order of People Heights](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/IntervalTree/OrderOfPeopleHeights) | InterviewBit | Google | Courses -> Programming | Trees | Java |
+| 385 | Coding | [ZigZag Level Order Traversal BT](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/LevelOrder/ZigZagLevelOrderTraversalBt) | InterviewBit | Amazon | Courses -> Programming | Trees | Java |
+| 386 | Coding | [Flatten Binary Tree To LinkedList](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/LinkedListTree/FlattenBinaryTreeToLinkedList) | InterviewBit | Adobe, Amazon, Microsoft | Courses -> Programming | Trees | Java |
+| 387 | Coding | [Root to Leaf Paths With Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/RootToLeaf/RootToLeafPathsWithSum) | InterviewBit | Microsoft, Yahoo, Amazon | Courses -> Programming | Trees | Java |
+| 388 | Coding | [Balanced Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/SimpleTreeOps/BalancedBinaryTree) | InterviewBit | Amazon | Courses -> Programming | Trees | Java |
+| 389 | Coding | [InOrder Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/InOrderTraversal) | InterviewBit | Amazon, Microsoft | Courses -> Programming | Trees | Java |
+| 390 | Coding | [PostOrder Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/PostOrderTraversal) | InterviewBit | Amazon, Microsoft | Courses -> Programming | Trees | Java |
+| 391 | Coding | [PreOrder Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/PreOrderTraversal) | InterviewBit | Amazon, Microsoft | Courses -> Programming | Trees | Java |
+| 392 | Coding | [Vertical Order Traversal Of Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Traversal/VerticalOrderTraversalOfBinaryTree) | InterviewBit | Amazon | Courses -> Programming | Trees | Java |
+| 393 | Coding | [Binary Tree From InOrder And PostOrder](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeConstruction/BinaryTreeFromInorderAndPostorder) | InterviewBit | Amazon, Microsoft | Courses -> Programming | Trees | Java |
+| 394 | Coding | [Construct Binary Tree From InOrder And PreOrder](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeConstruction/ConstructBinaryTreeFromInorderAndPreorder) | InterviewBit | Amazon, Microsoft | Courses -> Programming | Trees | Java |
+| 395 | Coding | [Sorted Array To Balanced Bst](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeConstruction/SortedArrayToBalancedBst) | InterviewBit | VMware, Amazon | Courses -> Programming | Trees | Java |
+| 396 | Coding | [Least Common Ancestor](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TreeSearch/LeastCommonAncestor) | InterviewBit | Facebook, Adobe, Microsoft, Amazon, Google | Courses -> Programming | Trees | Java |
+| 397 | Coding | [Shortest Unique Prefix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Trie/ShortestUniquePrefix) | InterviewBit | Google | Courses -> Programming | Trees | Java |
+| 398 | Coding | [Hotel Reviews](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/Tries/HotelReviews) | InterviewBit | Booking.com | Courses -> Programming | Trees | Java |
+| 399 | Coding | [Identical Binary Trees](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TwoTrees/IdenticalBinaryTrees) | InterviewBit | Amazon | Courses -> Programming | Trees | Java |
+| 400 | Coding | [Symmetric Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level6_Trees/Problems/TwoTrees/SymmetricBinaryTree) | InterviewBit | Amazon | Courses -> Programming | Trees | Java |
+| 401 | Coding | [Best Time to Buy and Sell Stock 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/AdHoc/BestTimeToBuyAndSellStock2) | InterviewBit | Amazon, Facebook | Courses -> Programming | Dynamic Programming | Java |
+| 402 | Coding | [Palindrome Partitioning 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/BreakingWords/PalindromePartitioning2) | InterviewBit | Amazon, Google | Courses -> Programming | Dynamic Programming | Java |
+| 403 | Coding | [Max Sum Without Adjacent Elements](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DerivedDp/MaxSumWithoutAdjacentElements) | InterviewBit | Epic Systems | Courses -> Programming | Dynamic Programming | Java |
+| 404 | Coding | [Word Break 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DpOptimizedBacktrack/WordBreak2) | InterviewBit | IBM, Google | Courses -> Programming | Dynamic Programming | Java |
+| 405 | Coding | [Best Time to Buy and Sell Stocks 3](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DpTricky/BestTimeToBuyAndSellStocks3) | InterviewBit | Amazon, Facebook | Courses -> Programming | Dynamic Programming | Java |
+| 406 | Coding | [Shortest Common SuperString](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/DpTricky/ShortestCommonSuperString) | InterviewBit | Google | Courses -> Programming | Dynamic Programming | Java |
+| 407 | Coding | [Min Jumps Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/GreedyOrDp/MinJumpsArray) | InterviewBit | Amazon, eBay, Google | Courses -> Programming | Dynamic Programming | Java |
+| 408 | Coding | [Equal Average Partition](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/Knapsack/EqualAveragePartition) | InterviewBit | Amazon | Courses -> Programming | Dynamic Programming | Java |
+| 409 | Coding | [Unique Paths in a Grid](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/MatrixDp/UniquePathsInAGrid) | InterviewBit | Facebook | Courses -> Programming | Dynamic Programming | Java |
+| 410 | Coding | [Unique Binary Search Trees 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/MultiplyDp/UniqueBinarySearchTrees2) | InterviewBit | Amazon, Twitter, Samsung | Courses -> Programming | Dynamic Programming | Java |
+| 411 | Coding | [Max Rectangle In Binary Matrix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/PreProcessDp/MaxRectangleInBinaryMatrix) | InterviewBit | Google, Microsoft | Courses -> Programming | Dynamic Programming | Java |
+| 412 | Coding | [Length Of Longest Subsequence](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/SimpleArrayDp/LengthOfLongestSubsequence) | InterviewBit | Microsoft | Courses -> Programming | Dynamic Programming | Java |
+| 413 | Coding | [Ways to Decode](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/SimpleArrayDp/WaysToDecode) | InterviewBit | Facebook, Amazon | Courses -> Programming | Dynamic Programming | Java |
+| 414 | Coding | [Best Time to Buy and Sell Stocks 1](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/SuffixPrefixDp/BestTimeToBuyAndSellStocks1) | InterviewBit | Amazon, Facebook | Courses -> Programming | Dynamic Programming | Java |
+| 415 | Coding | [Max Sum Path In Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/TreeDp/MaxSumPathInBinaryTree) | InterviewBit | Directi, Amazon | Courses -> Programming | Dynamic Programming | Java |
+| 416 | Coding | [Edit Distance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_DynamicProgramming/TwoDStringDp/EditDistance) | InterviewBit | Google, LinkedIn, Microsoft | Courses -> Programming | Dynamic Programming | Java |
+| 417 | Coding | [Assign Mice To Holes](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket1/AssignMiceToHoles) | InterviewBit | Amazon | Courses -> Programming | Greedy | Java |
+| 418 | Coding | [Distribute Candy](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket1/DistributeCandy) | InterviewBit | Microsoft | Courses -> Programming | Greedy | Java |
+| 419 | Coding | [Gas Station](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket2/GasStation) | InterviewBit | Bloomberg, Google, DE Shaw, Amazon | Courses -> Programming | Greedy | Java |
+| 420 | Coding | [Majority Element](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket3/MajorityElement) | InterviewBit | Microsoft, Yahoo, Google | Courses -> Programming | Greedy | Java |
+| 421 | Coding | [Seats](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket4/Seats) | InterviewBit | Walmart Labs | Courses -> Programming | Greedy | Java |
+| 422 | Coding | [Highest Product](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket5/HighestProduct) | InterviewBit | Coursera, Amazon | Courses -> Programming | Greedy | Java |
+| 423 | Coding | [Bulbs](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level7_Greedy/Problems/Bucket6/Bulbs) | InterviewBit |  | Courses -> Programming | Greedy | Java |
+| 424 | Coding | [Level   Order](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/Bfs/LevelOrder) | InterviewBit | Facebook, Groupon | Courses -> Programming | Graphs | Java |
+| 425 | Coding | [Largest Distance Between Nodes of a Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/DepthFirstSearch/LargestDistanceBetweenNodesOfATree) | InterviewBit | Facebook, Google | Courses -> Programming | Graphs | Java |
+| 426 | Coding | [Convert Sorted List to Binary Search Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphAdHoc/ConvertSortedListToBinarySearchTree) | InterviewBit | Google | Courses -> Programming | Graphs | Java |
+| 427 | Coding | [Capture Regions On Board](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphConnectivity/CaptureRegionsOnBoard) | InterviewBit | Google | Courses -> Programming | Graphs | Java |
+| 428 | Coding | [Clone Graph](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphHashing/CloneGraph) | InterviewBit | Google, Facebook, Amazon | Courses -> Programming | Graphs | Java |
+| 429 | Coding | [Word Search Board](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/GraphTraversal/WordSearchBoard) | InterviewBit | Epic Systems, Amazon | Courses -> Programming | Graphs | Java |
+| 430 | Coding | [Word Ladder 1](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/ShortestPath/WordLadder1) | InterviewBit | Google, Microsoft, eBay | Courses -> Programming | Graphs | Java |
+| 431 | Coding | [Word Ladder 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewBit/src/Courses/Programming/Level8_Graphs/Problems/ShortestPath/WordLadder2) | InterviewBit | Google, Microsoft, eBay | Courses -> Programming | Graphs | Java |
+| 432 | Coding | [29. Bracket Validator](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/BracketValidator) | InterviewCake |  | Questions | Stacks | Java |
+| 433 | Coding | [25. Kth to Last Node in a Singly-Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/KthToLastNodeInSinglyLinkedList) | InterviewCake |  | Questions | Linked List | Java |
+| 434 | Coding | [43. Merge Sorted Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/MergeSortedArrays) | InterviewCake |  | Questions | Arrays | Java |
+| 435 | Coding | [10. Second Largest Item In Bst](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewCake/src/Questions/SecondLargestItemInBst) | InterviewCake |  | Questions | Binary Search Tree | Java |
+| 436 | Systems Design | [Google Maps](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/InterviewingIo/src/SystemsDesign/GoogleMaps) | interviewing.io |  | Difficulty -> Hard | Distributed Systems Design |  |
+| 437 | Coding | [Add Bold Tag in String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/AddBoldTagInString) | LeetCode | Google | Explore -> Interview -> Google Interview, Difficulty -> Medium | String | Java |
+| 438 | Coding | [First Missing Positive](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/FirstMissingPositive) | LeetCode | Databricks, Google, Amazon, Adobe, Airbnb, Bloomberg, VMware, Pocket Gems, Alibaba, Facebook, Microsoft, Uber, Apple, Baidu | Explore -> Interview -> Google Interview, Difficulty -> Hard | Array | Java |
+| 439 | Coding | [First Unique Character in a String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/FirstUniqueCharacterInAString) | LeetCode | Amazon, Bloomberg, Facebook, Apple, Zillow, Goldman Sachs, Microsoft, Google, Yahoo, Airbnb, SAP, Alibaba, Oracle | Explore -> Interview -> Google Interview, Difficulty -> Easy | String, Hash Table | Java |
+| 440 | Coding | [Game of Life](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/GameOfLife) | LeetCode | Dropbox, Uber, Amazon, Google, Square, Microsoft, Bloomberg, Booking.com, Baidu, Apple, Snapchat, Two Sigma | Explore -> Interview -> Google Interview, Difficulty -> Medium | Array | Java |
+| 441 | Coding | [Image Smoother](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ImageSmoother) | LeetCode | Amazon | Explore -> Interview -> Google Interview, Difficulty -> Easy | Array | Java |
+| 442 | Coding | [Intersection of Two Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/IntersectionOfTwoArrays) | LeetCode | Facebook, Lyft, Amazon, LinkedIn, Yelp, Indeed, Oracle, Google, Microsoft, Apple, Bloomberg, Adobe, Tencent, Two Sigma | Explore -> Interview -> Google Interview, Difficulty -> Easy | Hash Table, Two Pointers, Binary Search, Sort | Java |
+| 443 | Coding | [Longest Substring with At Most K Distinct Characters](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/LongestSubstringWithAtMostKDistinctCharacters) | LeetCode | Google, Facebook, Amazon, Quora, AppDynamics, Coupang | Explore -> Interview -> Google Interview, Difficulty -> Hard | Hash Table, String | Java |
+| 444 | Coding | [Max Consecutive Ones](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/MaxConsecutiveOnes) | LeetCode | Google, Amazon | Explore -> Interview -> Google Interview, Difficulty -> Easy | Array | Java |
+| 445 | Coding | [Max Consecutive Ones II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/MaxConsecutiveOnes2) | LeetCode | Google | Explore -> Interview -> Google Interview, Difficulty -> Medium | Two Pointers | Java |
+| 446 | Coding | [Move Zeroes](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/MoveZeroes) | LeetCode | Facebook, Google, SAP, Walmart Labs, Bloomberg, Microsoft, Apple, Uber, Paypal, Lyft, Yahoo, Oracle, eBay, Baidu | Explore -> Interview -> Google Interview, Difficulty -> Easy | Array, Two Pointers | Java |
+| 447 | Coding | [One Edit Distance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/OneEditDistance) | LeetCode | Facebook, Uber, Microsoft, Yelp, Google, Twitter, Snapchat | Explore -> Interview -> Google Interview, Difficulty -> Medium | String | Java |
+| 448 | Coding | [Plus One](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/PlusOne) | LeetCode | Google, Facebook, Uber, Microsoft, Bloomberg, eBay, Adobe, Amazon, Airbnb | Explore -> Interview -> Google Interview, Difficulty -> Easy | Array, Math | Java |
+| 449 | Coding | [Read N Characters Given Read4](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ReadNCharactersGivenRead4) | LeetCode | Facebook, Google, Uber, Apple, Amazon | Explore -> Interview -> Google Interview, Difficulty -> Easy | String | Java |
+| 450 | Coding | [Read N Characters Given Read4 II - Call multiple times](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ReadNCharactersGivenRead4_2_CallMultipleTimes) | LeetCode | Facebook, Google, Lyft, Rubric, Uber, Pinterest, Microsoft, Bloomberg | Explore -> Interview -> Google Interview, Difficulty -> Hard | String | Java |
+| 451 | Coding | [Remove Duplicates from Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/RemoveDuplicatesFromSortedArray) | LeetCode | Facebook, Google, Microsoft, Uber, Amazon, Bloomberg, Cisco, Adobe, Yahoo, VMware, Walmart Labs, Tencent, Apple, Alibaba, Baidu, NetEase | Explore -> Interview -> Google Interview, Difficulty -> Easy | Array, Two Pointers | Java |
+| 452 | Coding | [Shortest Palindrome](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ShortestPalindrome) | LeetCode | Bloomberg, Two Sigma, Walmart Labs, Facebook, Adobe, Alibaba, Microsoft, Google, Pocket Gems | Explore -> Interview -> Google Interview, Difficulty -> Hard | String | Java |
+| 453 | Coding | [Spiral Matrix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/SpiralMatrix) | LeetCode | Microsoft, Google, Bloomberg, Apple, Zillow, Amazon, Uber, Hulu, Paypal, Epic Systems, Yelp, eBay, Baidu, Adobe, Dataminr, JPMorgan, Facebook, Tencent, Walmart Labs, Yahoo, Redfin, ServiceNow, Oracle | Explore -> Interview -> Google Interview, Difficulty -> Medium | Array | Java |
+| 454 | Coding | [Trapping Rain Water](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/TrappingRainWater) | LeetCode | Goldman Sachs, Facebook, Lyft, Amazon, Bloomberg, Google, Microsoft, Airbnb, Uber, Apple, Adobe, Dataminr, Grab, Qualtrics, Intuit, Snapchat, Wish, Alibaba, Twitter, eBay, Baidu, Zenefits, Intel, Palantir Technologies, TripAdvisor, Huawei | Explore -> Interview -> Google Interview, Difficulty -> Hard | Array, Two Pointers, Stack | Java |
+| 455 | Coding | [Valid Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ValidNumber) | LeetCode | Facebook, LinkedIn, Apple, Zillow, Adobe, Google | Explore -> Interview -> Google Interview, Difficulty -> Hard | Math, String | Java |
+| 456 | Coding | [Valid Palindrome](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ValidPalindrome) | LeetCode | Facebook, Apple, Microsoft, Amazon, Google, Adobe, Yandex, TripAdvisor, Airbnb, Snapchat, Uber, Zenefits | Explore -> Interview -> Google Interview, Difficulty -> Easy | Two Pointers, String | Java |
+| 457 | Coding | [Valid Parentheses](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/ArraysAndStrings/ValidParentheses) | LeetCode | Facebook, LinkedIn, Amazon, Bloomberg, Google, Microsoft, Twitter, Expedia, Uber, Akuna Capital, Apple, VMware, Paypal, Twilio, Mathworks, Samsung, Riot Games, Yandex, Lyft, Zillow, Alibaba, Cloudera, Adobe, Tencent, Blizzard, eBay, Baidu, Visa, Pure Storage, Indeed, TripleByte, ServiceNow, Yahoo, Capital One, Oracle, Huawei, Yelp, Zappos, Qualcomm, Gilt Groupe, Aetion, Yatra, Rubrik, Zynga, TripAdvisor, Booking.com, Lending Club, Zenefits | Explore -> Interview -> Google Interview, Difficulty -> Easy | String, Stack | Java |
+| 458 | Coding | [Binary Search Tree Iterator](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/BinarySearchTreeIterator) | LeetCode | Facebook, Amazon, Microsoft, Bloomberg, Qualtrics, Cloudera, Uber, Google, Oracle, LinkedIn, Cisco, AppDynamics, Apple | Explore -> Interview -> Google Interview, Difficulty -> Medium | Stack, Tree, Design | Java |
+| 459 | Coding | [Design Tic-Tac-Toe](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/DesignTicTacToe) | LeetCode | Microsoft, Amazon, Google, Facebook, Apple, TripleByte, Twitter | Explore -> Interview -> Google Interview, Difficulty -> Medium | Design | Java |
+| 460 | Coding | [Moving Average from Data Stream](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/MovingAverageFromDataStream) | LeetCode | Facebook, Google, Bloomberg, Uber, Twitter, Amazon, Microsoft, Indeed | Explore -> Interview -> Google Interview, Difficulty -> Easy | Design, Queue | Java |
+| 461 | Coding | [Peeking Iterator](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/PeekingIterator) | LeetCode | Apple, Amazon, Paypal, Google, Square, Microsoft, Morgan Stanley, Yahoo | Explore -> Interview -> Google Interview, Difficulty -> Medium | Design | Java |
+| 462 | Coding | [Range Sum Query 2D - Mutable](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/RangeSumQuery2DMutable) | LeetCode | Facebook, Google, Microsoft, Houzz, Baidu | Explore -> Interview -> Google Interview, Difficulty -> Medium | Dynamic Programming | Java |
+| 463 | Coding | [Zigzag Iterator](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Design/ZigzagIterator) | LeetCode | Facebook, Google, Apple, Groupon | Explore -> Interview -> Google Interview, Difficulty -> Medium | Design | Java |
+| 464 | Coding | [Decode Ways](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/DecodeWays) | LeetCode | Facebook, Google, Microsoft, Uber, Amazon, Bloomberg, Yahoo, LiveRamp, Expedia, Salesforce, Twitter, Databricks, Square, Pinterest, Apple, Goldman Sachs | Explore -> Interview -> Google Interview, Difficulty -> Medium | String, Dynamic Programming | Java |
+| 465 | Coding | [Edit Distance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/EditDistance) | LeetCode | Google, LinkedIn, Microsoft, Amazon, Bloomberg, Baidu, Yahoo, Apple, Alibaba, NetEase, Square, TripleByte, Cisco, Facebook, Snapchat, Adobe, Huawei, VMware | Explore -> Interview -> Google Interview, Difficulty -> Hard | String, Dynamic Programming | Java |
+| 466 | Coding | [House Robber II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/HouseRobber2) | LeetCode | Google, Salesforce, Baidu, Adobe, Microsoft | Explore -> Interview -> Google Interview, Difficulty -> Medium | Dynamic Programming | Java |
+| 467 | Coding | [Maximum Vacation Days](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/MaximumVacationDays) | LeetCode | Google, Facebook, Uber | Explore -> Interview -> Google Interview, Difficulty -> Hard | Dynamic Programming | Java |
+| 468 | Coding | [Minimum Path Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/MinimumPathSum) | LeetCode | Microsoft, Google, Amazon, Goldman Sachs, Bloomberg, Alibaba, Yelp | Explore -> Interview -> Google Interview, Difficulty -> Medium | Array, Dynamic Programming | Java |
+| 469 | Coding | [Sentence Screen Fitting](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/SentenceScreenFitting) | LeetCode | Google, Yelp | Explore -> Interview -> Google Interview, Difficulty -> Medium | Dynamic Programming | Java |
+| 470 | Coding | [Word Break](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/DynamicProgramming/WordBreak) | LeetCode | Facebook, Amazon, Google, Uber, Bloomberg, Yelp, Apple, Snapchat, Microsoft, Qualtrics, VMWare, Zillow, Oracle, Alibaba, Paypal, Yahoo, Twitter, Lyft, Adobe, Zenefits, Pinterest, eBay, Indeed, Pocket Gems, Square, Coupang | Explore -> Interview -> Google Interview, Difficulty -> Medium | Dynamic Programming | Java |
+| 471 | Coding | [K Empty Slots](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/KEmptySlots) | LeetCode | Google, Microsoft | Explore -> Interview -> Google Interview, Difficulty -> Hard | Array, Binary Search Tree | Java |
+| 472 | Coding | [License Key Formatting](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/LicenseKeyFormatting) | LeetCode | Google, Amazon | Explore -> Interview -> Google Interview, Difficulty -> Easy |  | Java |
+| 473 | Coding | [Longest Univalue Path](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/LongestUnivaluePath) | LeetCode | Google, Alibaba, Amazon | Explore -> Interview -> Google Interview, Difficulty -> Easy | Tree, Recursion | Java |
+| 474 | Coding | [Next Closest Time](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/NextClosestTime) | LeetCode | Google, Facebook | Explore -> Interview -> Google Interview, Difficulty -> Medium | String | Java |
+| 475 | Coding | [Repeated String Match](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/InterviewProcess/RepeatedStringMatch) | LeetCode | Google | Explore -> Interview -> Google Interview, Difficulty -> Easy | String | Java |
+| 476 | Coding | [Insert into a Cyclic Sorted List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/LinkedList/InsertIntoACyclicSortedList) | LeetCode | Facebook, Google, Microsoft | Explore -> Interview -> Google Interview, Difficulty -> Medium | Linked List | Java |
+| 477 | Coding | [Merge k Sorted Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/LinkedList/MergeKSortedLists) | LeetCode | Microsoft, Amazon, LinkedIn, Google, Facebook, Uber, Twitter, Airbnb, IXL | Explore -> Interview -> Google Interview, Difficulty -> Hard | Linked List, Divide and Conquer, Heap | Java |
+| 478 | Coding | [Maximum Product of Word Lengths](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Others/MaximumProductOfWordLengths) | LeetCode | Works Applications, Google | Explore -> Interview -> Google Interview, Difficulty -> Medium | Bit Manipulation | Java |
+| 479 | Coding | [UTF-8 Validation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Others/UTF8Validation) | LeetCode | Palantir Technologies, Google, Facebook, Apple, Uber, Nvidia | Explore -> Interview -> Google Interview, Difficulty -> Medium | Bit Manipulation | Java |
+| 480 | Coding | [Android Unlock Patterns](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/AndroidUnlockPatterns) | LeetCode | Google, Snapchat, Microsoft, Apple | Explore -> Interview -> Google Interview, Difficulty -> Medium | Dynamic Programming, Backtracking | Java |
+| 481 | Coding | [Strobogrammatic Number II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/StrobogrammaticNumber2) | LeetCode | Google, Facebook | Explore -> Interview -> Google Interview, Difficulty -> Medium | Math, Recursion | Java |
+| 482 | Coding | [Word Search II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/WordSearch2) | LeetCode | Amazon, Facebook, Google, Microsoft, Airbnb, Uber, Houzz, Snapchat, Yelp, Apple, Pocket Gems, Yahoo, Lyft | Explore -> Interview -> Google Interview, Difficulty -> Hard | Backtracking, Trie | Java |
+| 483 | Coding | [Word Squares](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/Recursion/WordSquares) | LeetCode | Oracle, Google | Explore -> Interview -> Google Interview, Difficulty -> Hard | Backtracking, Trie | Java |
+| 484 | Coding | [Diagonal Traverse](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/DiagonalTraverse) | LeetCode | Google, Facebook, Bloomberg, Adobe, Amazon | Explore -> Interview -> Google Interview, Difficulty -> Medium |  | Java |
+| 485 | Coding | [Evaluate Reverse Polish Notation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/EvaluateReversePolishNotation) | LeetCode | LinkedIn, Microsoft, Two Sigma, Google, Uber, Amazon, Pure Storage, Adobe, Yelp | Explore -> Interview -> Google Interview, Difficulty -> Medium | Stack | Java |
+| 486 | Coding | [Find K Pairs with Smallest Sums](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/FindKPairsWithSmallestSums) | LeetCode | Amazon, Google, LinkedIn, Microsoft, Uber | Explore -> Interview -> Google Interview, Difficulty -> Medium | Heap | Java |
+| 487 | Coding | [Find K-th Smallest Pair Distance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/FindKthSmallestPairDistance) | LeetCode | Google | Explore -> Interview -> Google Interview, Difficulty -> Hard | Array, Binary Search, Heap | Java |
+| 488 | Coding | [Insert Interval](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/InsertInterval) | LeetCode | LinkedIn, Facebook, Uber, Google, Microsoft, Amazon, Twitter, Tableau, Square, Lyft, Dropbox | Explore -> Interview -> Google Interview, Difficulty -> Hard | Array, Sort | Java |
+| 489 | Coding | [Kth Largest Element in an Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/KthLargestElementInAnArray) | LeetCode | Facebook, Amazon, Google, Microsoft, Goldman Sachs, Apple, Baidu, Tencent, Nvidia, LinkedIn, Alibaba, Bloomberg, Airbnb, eBay, Twitter, IXL, Snapchat, Yelp, Yahoo, Pocket Gems | Explore -> Interview -> Google Interview, Difficulty -> Medium | Divide and Conquer, Heap | Java |
+| 490 | Coding | [Longest Palindromic Substring](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/LongestPalindromicSubstring) | LeetCode | Amazon, Microsoft, Facebook, Google, Adobe, Apple, Yahoo, Alibaba, Airbnb, GoDaddy, Roblox, Baidu, Cisco, NetEase, IBM, JPMorgan, Yelp, eBay, Tencent, Uber, Bloomberg, Huawei, Twitter, Works Applications, Expedia, Lyft, Pure Storage, Sumologic, Zenefits, VMWare, VMWare, Goo, Qualtrics, Dropbox, Walmart Labs, Yandex, Paypal, Oracle, Salesforce | Explore -> Interview -> Google Interview, Difficulty -> Medium | String, Dynamic Programming | Java |
+| 491 | Coding | [Merge Intervals](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/MergeIntervals) | LeetCode | Palantir Technologies, Facebook, Google, Bloomberg, Uber, Microsoft, LinkedIn, Amazon, Apple, Oracle, Cisco, Yelp, Goldman Sachs, Twitter, Salesforce, Yahoo, Nvidia, Dataminr, Paypal, Intuit, Zenefits, Snapchat, GoDaddy, Dropbox, Pinterest, Walmart Labs, SAP | Explore -> Interview -> Google Interview, Difficulty -> Medium | Array, Sort | Java |
+| 492 | Coding | [Minimum Window Substring](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/MinimumWindowSubstring) | LeetCode | Facebook, Google, LinkedIn, Amazon, Microsoft, Airbnb, Apple, Uber, Bloomberg, Walmart Labs, VMware, Alibaba, LiveRamp, Netsuite, Yahoo, Adobe, Snapchat | Explore -> Interview -> Google Interview, Difficulty -> Hard | Hash Table, Two Pointers, String | Java |
+| 493 | Coding | [Next Greater Element I](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/NextGreaterElement1) | LeetCode | Amazon, Bloomberg, Google, Mathworks, Adobe | Explore -> Interview -> Google Interview, Difficulty -> Easy | Stack | Java |
+| 494 | Coding | [Pacific Atlantic Water Flow](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/PacificAtlanticWaterFlow) | LeetCode | Microsoft, Amazon, Oracle, Google, Uber, Expedia | Explore -> Interview -> Google Interview, Difficulty -> Medium | Depth-first Search, Breadth-first Search | Java |
+| 495 | Coding | [Range Module](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/RangeModule) | LeetCode | Google, Machine Zone, Coupang | Explore -> Interview -> Google Interview, Difficulty -> Hard | Array, Segment Tree, Binary Search Tree | Java |
+| 496 | Coding | [Shortest Distance from All Buildings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/ShortestDistanceFromAllBuildings) | LeetCode | Facebook, Google, Amazon, Zenefits | Explore -> Interview -> Google Interview, Difficulty -> Hard | Breadth-first search | Java |
+| 497 | Coding | [Sort Transformed Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/SortTransformedArray) | LeetCode | Google, Facebook | Explore -> Interview -> Google Interview, Difficulty -> Medium | Math, Two Pointers | Java |
+| 498 | Coding | [Sqrt(x)](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/SortingAndSearching/SqrtOfX) | LeetCode | Google, LinkedIn, Microsoft, Bloomberg, Apple, Amazon, Facebook, Uber, Alibaba, Yahoo, Salesforce | Explore -> Interview -> Google Interview, Difficulty -> Easy | Math, Binary Search | Java |
+| 499 | Coding | [Closest Binary Search Tree Value](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/ClosestBinarySearchTreeValue) | LeetCode | Facebook, Google, Microsoft, Amazon, LinkedIn, eBay, Snapchat | Explore -> Interview -> Google Interview, Difficulty -> Easy | Binary Search, Tree | Java |
+| 500 | Coding | [Course Schedule](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/CourseSchedule) | LeetCode | Amazon, Facebook, Google, Goldman Sachs, Yelp, Intuit, Paypal, Microsoft, Uber, Oracle, LinkedIn, Apple, Zenefits | Explore -> Interview -> Google Interview, Difficulty -> Medium | Depth-first Search, Breadth-first Search, Graph, Topological Sort | Java |
+| 501 | Coding | [Evaluate Division](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/EvaluateDivision) | LeetCode | Google, Facebook, Uber | Explore -> Interview -> Google Interview, Difficulty -> Medium | Union Find, Graph | Java |
+| 502 | Coding | [Inorder Successor in BST](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/InorderSuccessorInBst) | LeetCode | Google, Microsoft, Amazon, Facebook, Palantir Technologies, Arista Networks, Pocket Gems, Baidu | Explore -> Interview -> Google Interview, Difficulty -> Medium | Tree | Java |
+| 503 | Coding | [Redundant Connection II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/RedundantConnection2) | LeetCode | Google | Explore -> Interview -> Google Interview, Difficulty -> Hard | Tree, Depth-first Search, Union Find, Graph | Java |
+| 504 | Coding | [Robot Room Cleaner](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/RobotRoomCleaner) | LeetCode | Google, Facebook, Amazon | Explore -> Interview -> Google Interview, Difficulty -> Hard | Depth-first Search | Java |
+| 505 | Coding | [Validate Binary Search Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/GoogleInterview/TreesAndGraphs/ValidateBinarySearchTree) | LeetCode | Facebook, Bloomberg, Microsoft, Amazon, Google, Uber, Capital One, TripAdvisor, LinkedIn, Apple, Walmart Labs, Nvidia, Nutanix, Qualtrics, VMware, Square, Snapchat, Baidu | Explore -> Interview -> Google Interview, Difficulty -> Medium | Tree, Depth-first Search | Java |
+| 506 | Coding | [Best Time to Buy and Sell Stock II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/BestTimeToBuySellStock2) | LeetCode | Amazon, Facebook, Alibaba, Goldman Sachs, Adobe, Bloomberg, Microsoft, Intuit, Zappos, Google, Zenefits, Citadel, VMware, Baidu, Airbnb, Tencent, JPMorgan, Morgan Stanley, Oracle, Apple, LinkedIn, Palantir Technologies, Grab, Uber, Yahoo | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Greedy | Java |
+| 507 | Coding | [Contains Duplicate](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/ContainsDuplicate) | LeetCode | Adobe, Microsoft, Google, Bloomberg, Amazon, Yahoo, Facebook, Baidu, Yelp, Airbnb, Palantir Technologies | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Hash Table | Java |
+| 508 | Coding | [Intersection of Two Arrays II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/IntersectionOfTwoArrays2) | LeetCode | Facebook, Google, Oracle, Yelp, Bloomberg, Amazon, Alibaba | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Hash Table, Two Pointers, Binary Search, Sort | Java |
+| 509 | Coding | [Move Zeroes](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/MoveZeroes) | LeetCode | Facebook, Google, SAP, Walmart Labs, Bloomberg, Microsoft, Apple, eBay, Uber, Paypal, Baidu, Lyft, Amazon, Yahoo, Oracle | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Two Pointers | Java |
+| 510 | Coding | [Plus One](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/PlusOne) | LeetCode | Google, Facebook, Uber, Microsoft, Bloomberg, eBay, Adobe, Amazon, Airbnb | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Math | Java |
+| 511 | Coding | [Remove Duplicates from Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/RemoveDuplicatesFromSortedArray) | LeetCode | Facebook, Google, Microsoft, Amazon, Uber, Bloomberg, Cisco, Adobe, Yahoo, VMware, Walmart Labs, Apple, Alibaba, NetEase | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Two Pointers | Java |
+| 512 | Coding | [Rotate Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/RotateArray) | LeetCode | Uber, Facebook, Amazon, Microsoft, Google, Oracle, Adobe, Bloomberg | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array | Java |
+| 513 | Coding | [Rotate Image](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/RotateImage) | LeetCode | Microsoft, Amazon, Apple, Google, Nvidia, Facebook, Akuna Capital, Houzz, ServiceNow, Baidu, Wish, Adobe, Bloomberg, Epic Systems, Salesforce, Paypal | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Medium | Array | Java |
+| 514 | Coding | [Single Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/SingleNumber) | LeetCode | Facebook, Google, Adobe, SAP, Alibaba, Amazon, Microsoft, Oracle, Twitter, Zillow, Expedia, Airbnb, Baidu, Riot Games, Zappos, VMware, Palantir Technologies | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Hash Table, Bit Manipulation | Java |
+| 515 | Coding | [Two Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/TwoSum) | LeetCode | Google, Adobe, Amazon, Apple, Microsoft, Facebook, Uber, Yahoo, Alibaba, Bloomberg, LinkedIn, Baidu, Morgan Stanley, SAP, Airbnb, Yandex, Goldman Sachs, Aetion, Paypal, Visa, Indeed, GoDaddy, Affirm, Box, eBay, Cisco, Oracle, Works Applications, Radius, Snapchat, Tencent, Zenefits, Samsung, Valve, BlackRock, Lyft, IBM, Citrix, NetEase, Expedia, Twitter, Huawei, Mathworks, Two Sigma, Intuit, Hulu, Coursera, Yelp, MAQ Software, Helix, Walmart Labs, Grab, Zappos, Nvidia, Fallible, Zillow, Pinterest, TripAdvisor, Symantec, IXL, Zynga, Intel, HTC, Riot Games, AppDynamics, Quora, Alation, Gilt Groupe, JPMorgan, Epic Systems, Dropbox, VMware, Jump Trading, Sina, Lending Club, Salesforce, Wish, LiveRamp, Pocket Gems, Groupon, Tableau, Deutsche Bank, Capital One, ServiceNow, Jane Street, Akuna Capital, Redfin, Drawbridge, Booking.com, Blizzard | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Hash Table | Java |
+| 516 | Coding | [Valid Sudoku](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Array/ValidSudoku) | LeetCode | Uber, Microsoft, Facebook, Pinterest, Apple, Amazon, Google, Bloomberg, Snapchat | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Medium | Array, Hash Table | Java |
+| 517 | Coding | [Best Time to Buy and Sell Stock](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/DynamicProgramming/BestTimeToBuyAndSellStock) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Dynamic Programming | Java |
+| 518 | Coding | [Climbing Stairs](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/DynamicProgramming/ClimbingStairs) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Dynamic Programming | Java |
+| 519 | Coding | [Maximum Subarray](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/DynamicProgramming/MaximumSubarray) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Divide and Conquer, Dynamic Programming | Java |
+| 520 | Coding | [Delete Node in a Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/DeleteNodeInALinkedList) | LeetCode | Microsoft, Paypal, Apple, Amazon, VMware, Google, Adobe, Bloomberg, Capital One, NetEase, Tencent, Baidu | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Linked List | Java |
+| 521 | Coding | [Linked List Cycle](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/LinkedListCycle) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Linked List, Two Pointers | Java |
+| 522 | Coding | [Merge Two Sorted Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/MergeTwoSortedLists) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Linked List | Java |
+| 523 | Coding | [Palindrome Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/PalindromeLinkedList) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Linked List, Two Pointers | Java |
+| 524 | Coding | [Remove Nth Node From End of List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/RemoveNthNodeFromEndOfList) | LeetCode | Microsoft, Google, Adobe, Bloomberg, Apple, Cisco, Uber, Facebook, Aetion, Amazon, Baidu, Expedia, Zenefits, eBay, Alibaba, ServiceNow | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Medium | Linked List, Two Pointers | Java |
+| 525 | Coding | [Reverse Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/LinkedList/ReverseLinkedList) | LeetCode | Microsoft, Apple, Amazon, Facebook, Bloomberg, Yandex, Adobe, Mathworks, Google, Goldman Sachs, Cisco, Nvidia, VMware, Alibaba, Oracle, Baidu, Intuit, Intel, Paypal, Two Sigma, Tencent, Expedia, Yahoo, Walmart Labs, TripAdvisor, Qualcomm, Zynga, Zappos, Citrix, SAP, Nutanix, eBay, EMC, Snapchat, Zenefits, Yelp, Uber, Twitter | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Linked List | Java |
+| 526 | Coding | [First Bad Version](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/SortingAndSearching/FirstBadVersion) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Binary Search | Java |
+| 527 | Coding | [Merge Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/SortingAndSearching/MergeSortedArray) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Array, Two Pointers | Java |
+| 528 | Coding | [Count and Say](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/CountAndSay) | LeetCode | Google, Microsoft, Amazon, Adobe, Bloomberg, Facebook, Apple, Intuit, eBay, Epic Systems, Airbnb, VMware, Salesforce | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String | Java |
+| 529 | Coding | [First Unique Character in a String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/FirstUniqueCharacterInAString) | LeetCode | Bloomberg, Facebook, Amazon, Apple, Zillow, Goldman Sachs, Google, Microsoft, Yahoo, Airbnb, SAP, Alibaba, Oracle | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String, Hash Table | Java |
+| 530 | Coding | [Implement strStr()](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ImplementStrStr) | LeetCode | Microsoft, Amazon, Facebook, Apple, Bloomberg, Adobe, Pocket Gems, Tencent, Alibaba, Yahoo, Google, Baidu, Salesforce, Zillow | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String, Two Pointers | Java |
+| 531 | Coding | [Longest Common Prefix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/LongestCommonPrefix) | LeetCode | Adobe, Facebook, Apple, Google, Quora, Yahoo, Oracle, Pinterest, Microsoft, IXL, Airbnb, Yelp, Citrix, Amazon, Aetion, Alibaba, Baidu, Tencent, Expedia, Samsung, Deutsche Bank, VMware, Huawei | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String | Java |
+| 532 | Coding | [Reverse Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ReverseInteger) | LeetCode | Adobe, Bloomberg, Google, Amazon, Microsoft, Apple, JPMorgan, Facebook, Yahoo, Lyft, NetEase, Alibaba, Aetion, Airbnb, Symantec, Baidu, Huawei, Oracle, Tencent, Twitter, LinkedIn, GoDaddy, eBay, VMware, Epic Systems, Pocket Gems, Quora, Works Applications, Zillow, HTC | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String, Math | Java |
+| 533 | Coding | [Reverse String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ReverseString) | LeetCode | Microsoft, Apple, Bloomberg, Adobe, Google, GoDaddy, Walmart Labs, Alibaba, Goldman Sachs, Tencent, eBay, Amazon, Facebook, Baidu, LinkedIn, Airbnb, VMware, IBM, Cisco | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String, Two Pointers | Java |
+| 534 | Coding | [String to Integer (atoi)](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/StringToIntegerAtoi) | LeetCode | Microsoft, Facebook, Goldman Sachs, Google, Amazon, Apple, Adobe, Cisco, Redfin, Zillow, LinkedIn, Bloomberg, Yahoo, Baidu, Alibaba, VMware, Citrix, eBay, Airbnb, Tencent, Huawei, Uber | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Medium | String, Math | Java |
+| 535 | Coding | [Valid Anagram](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ValidAnagram) | LeetCode | Bloomberg, Google, Microsoft, Apple, Yahoo, Uber, Facebook, Amazon, Goldman Sachs, Paypal, VMware, Snapchat, Samsung, Oracle, Cisco, Yelp, LeetCode | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String, Hash Table, Sort | Java |
+| 536 | Coding | [Valid Palindrome](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Strings/ValidPalindrome) | LeetCode | Facebook, Microsoft, Amazon, Apple, Google, Adobe, Yandex, Airbnb, Snapchat, TripAdvisor, Uber, Zenefits | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | String, Two Pointers | Java |
+| 537 | Coding | [Binary Tree Level Order Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/BinaryTreeLevelOrderTraversal) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Medium | Tree, Breadth-first Search | Java |
+| 538 | Coding | [Convert Sorted Array to Binary Search Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/ConvertSortedArrayToBinarySearchTree) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Tree, Depth-first Search | Java |
+| 539 | Coding | [Maximum Depth of Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/MaximumDepthOfBinaryTree) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Tree, Depth-first Search | Java |
+| 540 | Coding | [Symmetric Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/SymmetricTree) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Tree, Depth-first Search, Breadth-first Search | Java |
+| 541 | Coding | [Validate Binary Search Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Explore/Interview/TopInterviewQuestions_Easy/Trees/ValidateBinarySearchTree) | LeetCode |  | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Medium | Tree, Depth-first Search | Java |
+| 542 | Coding | [103. Binary Tree Zigzag Level Order Traversal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P103_BinaryTreeZigzagLevelOrderTraversal) | LeetCode | LinkedIn, Facebook, Amazon, Google, Microsoft, Apple, Uber, Bloomberg, Apple, Tencent, eBay, Alibaba | Problems -> Algorithms, Difficulty -> Medium | Stack, Tree, Breadth-first Search | Java |
+| 543 | Coding | [122. Best Time to Buy and Sell Stock II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P122_BestTimeToBuySellStock2) | LeetCode | Amazon, Facebook, Alibaba, Goldman Sachs, Adobe, Bloomberg, Microsoft, Intuit, Zappos, Google, Zenefits, Citadel, VMware, Baidu, Airbnb, Tencent, JPMorgan, Morgan Stanley, Oracle, Apple, LinkedIn, Palantir Technologies, Grab, Uber, Yahoo | Explore -> Algorithms, Difficulty -> Easy | Array, Greedy | Java |
+| 544 | Coding | [125. Valid Palindrome](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P125_ValidPalindrome) | LeetCode | Facebook, Microsoft, Amazon, Apple, Google, Adobe, Yandex, Airbnb, Snapchat, TripAdvisor, Uber, Zenefits | Explore -> Algorithms, Difficulty -> Easy | String, Two Pointers | Java |
+| 545 | Coding | [127. Word Ladder](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P127_WordLadder) | LeetCode | LinkedIn, Facebook, Amazon, Google, Microsoft, Twitter, Bloomberg, Lyft, Yelp, eBay, Hulu, Snapchat | Problems -> Algorithms, Difficulty -> Medium | Breadth-first Search | Java |
+| 546 | Coding | [131. Palindrome Partitioning](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P131_PalindromePartitioning) | LeetCode |  | Problems -> Algorithms, Difficulty -> Medium | Backtracking | Java |
+| 547 | Coding | [136. Single Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P136_SingleNumber) | LeetCode | Facebook, Google, Adobe, SAP, Alibaba, Amazon, Microsoft, Oracle, Twitter, Zillow, Expedia, Airbnb, Baidu, Riot Games, Zappos, VMware, Palantir Technologies | Explore -> Algorithms, Difficulty -> Easy | Hash Table, Bit Manipulation | Java |
+| 548 | Coding | [149. Max Points on a Line](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P149_MaxPointsOnALine) | LeetCode | LinkedIn, Microsoft, Google, Amazon, Adobe, Alibaba, Twitter, Apple | Problems -> Algorithms, Difficulty -> Hard | Hash Table, Math | Java |
+| 549 | Coding | [150. Evaluate Reverse Polish Notation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P150_EvaluateReversePolishNotation) | LeetCode | LinkedIn, Microsoft, Two Sigma, Google, Uber | Problems -> Algorithms, Difficulty -> Medium | Stack | Java |
+| 550 | Coding | [152. Maximum Product Subarray](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P152_MaximumProductSubarray) | LeetCode | LinkedIn, Microsoft, Yelp, Amazon, Google, Pocket Gems | Problems -> Algorithms, Difficulty -> Medium | Array, Dynamic Programming | Java |
+| 551 | Coding | [156. Binary Tree Upside Down](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P156_BinaryTreeUpsideDown) | LeetCode | LinkedIn, Microsoft | Problems -> Algorithms, Difficulty -> Medium | Tree | Java |
+| 552 | Coding | [170. Two Sum III - Data structure design](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P170_TwoSum3_DataStructureDesign) | LeetCode | LinkedIn, Uber | Problems -> Algorithms, Difficulty -> Easy | Hash Table, Design | Java |
+| 553 | Coding | [173. Binary Search Tree Iterator](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P173_BinarySearchTreeIterator) | LeetCode | Facebook, Amazon, Microsoft, Bloomberg, Qualtrics, Cloudera, Uber, Google, Oracle, LinkedIn, Cisco, AppDynamics, Apple | Problems -> Algorithms, Difficulty -> Medium | Stack, Tree, Design | Java |
+| 554 | Coding | [187. Repeated DNA Sequences](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P187_RepeatedDnaSequences) | LeetCode | LinkedIn, Amazon | Problems -> Algorithms, Difficulty -> Medium | Hash Table, Bit Manipulation | Java |
+| 555 | Coding | [189. Rotate Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P189_RotateArray) | LeetCode | Uber, Facebook, Amazon, Microsoft, Google, Oracle, Adobe, Bloomberg | Problems -> Algorithms, Difficulty -> Easy | Array | Java |
+| 556 | Coding | [198. House Robber](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P198_HouseRobber) | LeetCode | LinkedIn, Airbnb, Tencent, Alibaba, Samsung, Baidu, Pocket Gems, Amazon, Google | Problems -> Algorithms, Difficulty -> Easy | Dynamic Programming | Java |
+| 557 | Coding | [200. Number of Islands](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P101_P200/P200_NumberOfIslands) | LeetCode | Amazon, Lyft, Google, Facebook, Bloomberg, Uber, LinkedIn, Microsoft, Apple, Qualtrics, Yahoo, Twitter, Alibaba, AppDynamics, Yelp, Oracle, eBay, Expedia, Goldman Sachs, Affirm | Problems -> Algorithms, Difficulty -> Medium | Depth-first Search, Breadth-first Search, Union Find | Java |
+| 558 | Coding | [10. Regular Expression Matching](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P10_RegularExpressionMatching) | LeetCode | Facebook, Microsoft, Google, Coursera, Bloomberg, Apple | Difficulty -> Hard | String, Dynamic Programming, Backtracking | Java |
+| 559 | Coding | [14. Longest Common Prefix](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P14_LongestCommonPrefix) | LeetCode | Adobe, Facebook, Apple, Google, Quora, Yahoo, Oracle, Pinterest, Microsoft, IXL, Airbnb, Yelp, Citrix, Amazon, Aetion, Alibaba, Baidu, Tencent, Expedia, Samsung, Deutsche Bank, VMware, Huawei | Explore -> Algorithms, Difficulty -> Easy | String | Java |
+| 560 | Coding | [15. 3Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P15_ThreeSum) | LeetCode |  | Difficulty -> Medium |  | Java |
+| 561 | Coding | [18. 4Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P18_FourSum) | LeetCode | Facebook | Problems -> Algorithms, Difficulty -> Medium | Array, Hash Table, Two Pointers | Java |
+| 562 | Coding | [19. Remove Nth Node From End of List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P19_RemoveNthNodeFromEndOfList) | LeetCode | Microsoft, Google, Adobe, Bloomberg, Apple, Cisco, Uber, Facebook, Aetion, Amazon, Baidu, Expedia, Zenefits, eBay, Alibaba, ServiceNow | Explore -> Algorithms, Difficulty -> Medium | Linked List, Two Pointers | Java |
+| 563 | Coding | [1. Two Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P1_TwoSum) | LeetCode | Google, Adobe, Amazon, Apple, Microsoft, Facebook, Uber, Yahoo, Alibaba, Bloomberg, LinkedIn, Baidu, Morgan Stanley, SAP, Airbnb, Yandex, Goldman Sachs, Aetion, Paypal, Visa, Indeed, GoDaddy, Affirm, Box, eBay, Cisco, Oracle, Works Applications, Radius, Snapchat, Tencent, Zenefits, Samsung, Valve, BlackRock, Lyft, IBM, Citrix, NetEase, Expedia, Twitter, Huawei, Mathworks, Two Sigma, Intuit, Hulu, Coursera, Yelp, MAQ Software, Helix, Walmart Labs, Grab, Zappos, Nvidia, Fallible, Zillow, Pinterest, TripAdvisor, Symantec, IXL, Zynga, Intel, HTC, Riot Games, AppDynamics, Quora, Alation, Gilt Groupe, JPMorgan, Epic Systems, Dropbox, VMware, Jump Trading, Sina, Lending Club, Salesforce, Wish, LiveRamp, Pocket Gems, Groupon, Tableau, Deutsche Bank, Capital One, ServiceNow, Jane Street, Akuna Capital, Redfin, Drawbridge, Booking.com, Blizzard | Problems -> Algorithms, Difficulty -> Easy | Array, Hash Table | Java |
+| 564 | Coding | [21. Merge Two Sorted Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P21_MergeTwoSortedLists) | LeetCode | Microsoft, Amazon, LinkedIn, Apple | Problems -> Algorithms, Difficulty -> Easy | Linked List | Java |
+| 565 | Coding | [23. Merge k Sorted Lists](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P23_MergeKSortedLists) | LeetCode | Microsoft, Amazon, LinkedIn, Google, Facebook, Uber, Twitter, Airbnb, IXL | Problems -> Algorithms, Difficulty -> Hard | Linked List, Divide and Conquer, Heap | Java |
+| 566 | Coding | [26. Remove Duplicates from Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P26_RemoveDuplicatesFromSortedArray) | LeetCode | Facebook, Google, Microsoft, Amazon, Uber, Bloomberg, Cisco, Adobe, Yahoo, VMware, Walmart Labs, Apple, Alibaba, NetEase | Explore -> Algorithms, Difficulty -> Easy | Array, Two Pointers | Java |
+| 567 | Coding | [28. Implement strStr()](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P28_ImplementStrStr) | LeetCode | Microsoft, Amazon, Facebook, Apple, Bloomberg, Adobe, Pocket Gems, Tencent, Alibaba, Yahoo, Google, Baidu, Salesforce, Zillow | Explore -> Algorithms, Difficulty -> Easy | String, Two Pointers | Java |
+| 568 | Coding | [31. Next Permutation](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P31_NextPermutation) | LeetCode | Facebook, Google, Microsoft, Amazon, Sumologic, Uber, Quora, Houzz, Samsung, Apple, Adobe, Rubrik, LinkedIn, Airbnb, Matlab | Problems -> Algorithms, Difficulty -> Medium | Array | Java |
+| 569 | Coding | [33. Search in Rotated Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P33_SearchInRotatedSortedArray) | LeetCode | Microsoft, LinkedIn, Facebook, Uber, Bloomberg | Problems -> Algorithms, Difficulty -> Medium | Array, Binary Search | Java |
+| 570 | Coding | [34. Find First and Last Position of Element in Sorted Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P34_FindFirstAndLastPositionOfElementInSortedArray) | LeetCode | LinkedIn | Problems -> Algorithms, Difficulty -> Medium | Array, Binary Search | Java |
+| 571 | Coding | [35. Search Insert Position](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P35_SearchInsertPosition) | LeetCode | Google | Problems -> Algorithms, Difficulty -> Easy | Array, Binary Search | Java |
+| 572 | Coding | [36. Valid Sudoku](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P36_ValidSudoku) | LeetCode | Uber, Microsoft, Facebook, Pinterest, Apple, Amazon, Google, Bloomberg, Snapchat | Explore -> Algorithms, Difficulty -> Medium | Hash Table | Java |
+| 573 | Coding | [38. Count and Say](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P38_CountAndSay) | LeetCode | Google, Microsoft, Amazon, Adobe, Bloomberg, Facebook, Apple, Intuit, eBay, Epic Systems, Airbnb, VMware, Salesforce | Explore -> Algorithms, Difficulty -> Easy | String | Java |
+| 574 | Coding | [46. Permutations](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P46_Permutations) | LeetCode | LinkedIn, Facebook, Google, Amazon, Microsoft, Bloomberg, Yahoo | Problems -> Algorithms, Difficulty -> Medium | Backtracking | Java |
+| 575 | Coding | [47. Permutations II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P47_Permutations2) | LeetCode | LinkedIn, Facebook, Tencent, Houzz, Google, Microsoft | Problems -> Algorithms, Difficulty -> Medium | Backtracking | Java |
+| 576 | Coding | [48. Rotate Image](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P48_RotateImage) | LeetCode | Microsoft, Amazon, Apple, Google, Nvidia, Facebook, Akuna Capital, Houzz, ServiceNow, Baidu, Wish, Adobe, Bloomberg, Epic Systems, Salesforce, Paypal | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Medium | Array | Java |
+| 577 | Coding | [4. Median of Two Sorted Arrays](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P4_MedianOfTwoSortedArrays) | LeetCode | Google, Amazon, Adobe, Microsoft, Apple, Goldman Sachs, Uber, Bloomberg, Walmart Labs, Facebook, Rubrik, Tencent, Alibaba, VMWare, Airbnb, Two Sigma, Baidu, NetEase, Twitter, Snapchat, Zillow, Pocket Gems, Aetion, Yahoo, Hulu, eBay, Lyft, Cloudera, Zappos, LinkedIn, Pinterest, Nutanix, Zenefits, Dropbox | Problems -> Algorithms, Difficulty -> Hard | Array, Binary Search, Divide and Conquer | Java |
+| 578 | Coding | [50. Pow(x, n)](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P50_Pow_x_n) | LeetCode | LinkedIn, Facebook, Amazon, Google, Microsoft, Bloomberg, Alibaba | Problems -> Algorithms, Difficulty -> Medium | Math, Binary Search | Java |
+| 579 | Coding | [53. Maximum Subarray](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P53_MaximumSubarray) | LeetCode | Facebook, Microsoft, Amazon, eBay, Uber, LinkedIn, Apple, NetEase, Tencent, Adobe, Google, Alibaba, Hulu, Bloomberg | Problems -> Algorithms, Difficulty -> Easy | Array, Divide and Conquer, Dynamic Programming | Java |
+| 580 | Coding | [56. Merge Intervals](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P56_MergeIntervals) | LeetCode | Facebook, Palantir Technologies, Google, Amazon, Uber, LinkedIn, Apple, Microsoft, Bloomberg, Yelp, Zenefits, Twitter | Problems -> Algorithms, Difficulty -> Medium | Array, Sort | Java |
+| 581 | Coding | [57. Insert Interval](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P57_InsertInterval) | LeetCode | LinkedIn, Facebook, Uber, Google, Microsoft, Amazon, Twitter | Problems -> Algorithms, Difficulty -> Hard | Array, Sort | Java |
+| 582 | Coding | [65. Valid Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P65_ValidNumber) | LeetCode | LinkedIn, Facebook, Adobe, Google | Problems -> Algorithms, Difficulty -> Hard | Math, String | Java |
+| 583 | Coding | [66. Plus One](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P66_PlusOne) | LeetCode | Google, Facebook, Uber, Microsoft, Bloomberg, eBay, Adobe, Amazon, Airbnb | Explore -> Algorithms, Difficulty -> Easy | Array, Math | Java |
+| 584 | Coding | [68. Text Justification](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P68_TextJustification) | LeetCode | Apple, Microsoft, Uber, Google, Facebook, Snapchat, Amazon, LinkedIn, Airbnb | Problems -> Algorithms, Difficulty -> Hard | String | Java |
+| 585 | Coding | [76. Minimum Window Substring](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P76_MinimumWindowSubstring) | LeetCode | Facebook, Google, LinkedIn, Amazon, Microsoft, Airbnb, Apple, Uber, Bloomberg, Walmart Labs, VMware, Alibaba, LiveRamp, Netsuite, Yahoo, Adobe, Snapchat | Problems -> Algorithms, Difficulty -> Hard | Hash Table, Two Pointers, String | Java |
+| 586 | Coding | [7. Reverse Integer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P7_ReverseInteger) | LeetCode | Adobe, Bloomberg, Google, Amazon, Microsoft, Apple, JPMorgan, Facebook, Yahoo, Lyft, NetEase, Alibaba, Aetion, Airbnb, Symantec, Baidu, Huawei, Oracle, Tencent, Twitter, LinkedIn, GoDaddy, eBay, VMware, Epic Systems, Pocket Gems, Quora, Works Applications, Zillow, HTC | Explore -> Algorithms, Difficulty -> Easy | Math | Java |
+| 587 | Coding | [8. String to Integer (atoi)](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P1_P100/P8_StringToIntegerAtoi) | LeetCode | Microsoft, Facebook, Goldman Sachs, Google, Amazon, Apple, Adobe, Cisco, Redfin, Zillow, LinkedIn, Bloomberg, Yahoo, Baidu, Alibaba, VMware, Citrix, eBay, Airbnb, Tencent, Huawei, Uber | Explore -> Algorithms, Difficulty -> Medium | String, Math | Java |
+| 588 | Coding | [205. Isomorphic Strings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P205_IsomorphicStrings) | LeetCode | LinkedIn, Google, Bloomberg, Yahoo, eBay | Problems -> Algorithms, Difficulty -> Easy | Hash Table | Java |
+| 589 | Coding | [206. Reverse Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P206_ReverseLinkedList) | LeetCode | Microsoft, Apple, Amazon, Facebook, Bloomberg, Yandex, Adobe, Mathworks, Google, Goldman Sachs, Cisco, Nvidia, VMware, Alibaba, Oracle, Baidu, Intuit, Intel, Paypal, Two Sigma, Tencent, Expedia, Yahoo, Walmart Labs, TripAdvisor, Qualcomm, Zynga, Zappos, Citrix, SAP, Nutanix, eBay, EMC, Snapchat, Zenefits, Yelp, Uber, Twitter | Explore -> Interview -> Top Interview Questions - Easy, Difficulty -> Easy | Linked List | Java |
+| 590 | Coding | [211. Add and Search Word - Data structure design](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P211_AddAndSearchWord_DataStructureDesign) | LeetCode | Facebook, Amazon | Problems -> Algorithms, Difficulty -> Medium | Backtracking, Design, Trie | Java |
+| 591 | Coding | [217. Contains Duplicate](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P217_ContainsDuplicate) | LeetCode | Adobe, Microsoft, Google, Bloomberg, Amazon, Yahoo, Facebook, Baidu, Yelp, Airbnb, Palantir Technologies | Problems -> Algorithms, Difficulty -> Easy | Array, Hash Table | Java |
+| 592 | Coding | [236. Lowest Common Ancestor of a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P236_LowestCommonAncestorOfABinaryTree) | LeetCode | LinkedIn, Microsoft, Tencent, Bloomberg, Uber, Amazon, Facebook, Apple | Problems -> Algorithms, Difficulty -> Medium | Tree | Java |
+| 593 | Coding | [237. Delete Node in a Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P237_DeleteNodeInALinkedList) | LeetCode | Microsoft, Paypal, Apple, Amazon, VMware, Google, Adobe, Bloomberg, Capital One, NetEase, Tencent, Baidu | Explore -> Algorithms, Difficulty -> Easy | Linked List | Java |
+| 594 | Coding | [238. Product of Array Except Self](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P238_ProductOfArrayExceptSelf) | LeetCode | LinkedIn, Microsoft, Yelp, Expedia, Zenefits, Google, Hulu, Apple, Amazon, Facebook, Lyft | Problems -> Algorithms, Difficulty -> Medium | Array | Java |
+| 595 | Coding | [242. Valid Anagram](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P242_ValidAnagram) | LeetCode | Bloomberg, Google, Microsoft, Apple, Yahoo, Uber, Facebook, Amazon, Goldman Sachs, Paypal, VMware, Snapchat, Samsung, Oracle, Cisco, Yelp, LeetCode | Explore -> Algorithms, Difficulty -> Easy | Hash Table, Sort | Java |
+| 596 | Coding | [243. Shortest Word Distance](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P243_ShortestWordDistance) | LeetCode | LinkedIn, Microsoft, Indeed | Problems -> Algorithms, Difficulty -> Easy | Array | Java |
+| 597 | Coding | [244. Shortest Word Distance 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P244_ShortedWordDistance2) | LeetCode | LinkedIn, Uber, Indeed, Bloomberg | Problems -> Algorithms, Difficulty -> Medium | Hash Table, Design | Java |
+| 598 | Coding | [245. Shortest Word Distance 3](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P245_ShortestWordDistance3) | LeetCode | LinkedIn | Problems -> Algorithms, Difficulty -> Medium | Array | Java |
+| 599 | Coding | [254. Factor Combinations](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P254_FactorCombinations) | LeetCode | LinkedIn, Bloomberg, Uber | Problems -> Algorithms, Difficulty -> Medium | Backtracking | Java |
+| 600 | Coding | [256. Paint House](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P256_PaintHouse) | LeetCode | LinkedIn | Problems -> Algorithms, Difficulty -> Easy | Dynamic Programming | Java |
+| 601 | Coding | [272. Closest Binary Search Tree Value II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P272_ClosestBinarySearchTreeValue2) | LeetCode | LinkedIn, ForUsAll | Problems -> Algorithms, Difficulty -> Hard | Stack, Tree |  |
+| 602 | Coding | [277. Find the Celebrity](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P277_FindTheCelebrity) | LeetCode | LinkedIn, Facebook, Microsoft, Pinterest, Apple, Yahoo | Problems -> Algorithms, Difficulty -> Medium | Array | Java |
+| 603 | Coding | [283. Move Zeroes](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P283_MoveZeroes) | LeetCode | Facebook, Google, SAP, Walmart Labs, Bloomberg, Microsoft, Apple, eBay, Uber, Paypal, Baidu, Lyft, Amazon, Yahoo, Oracle | Problems -> Algorithms, Difficulty -> Easy | Array, Two Pointers | Java |
+| 604 | Coding | [297. Serialize and Deserialize Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P201_P300/P297_SerializeAndDeserializeBinaryTree) | LeetCode | LinkedIn, Facebook, Amazon, Google, Microsoft, Intuit, Uber, Bloomberg, Apple, Yahoo | Problems -> Algorithms, Difficulty -> Hard | Tree, Design | Java |
+| 605 | Coding | [311. Sparse Matrix Multiplication](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P311_SparseMatrixMultiplication) | LeetCode | LinkedIn, Facebook, Google, Microsoft | Problems -> Algorithms, Difficulty -> Medium | Hash Table | Java |
+| 606 | Coding | [339. Nested List Weight Sum](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P339_NestedListWeightSum) | LeetCode | LinkedIn, Facebook, Snapchat | Problems -> Algorithms, Difficulty -> Easy | Depth-first Search | Java |
+| 607 | Coding | [344. Reverse String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P344_ReverseString) | LeetCode | Microsoft, Apple, Bloomberg, Adobe, Google, GoDaddy, Walmart Labs, Alibaba, Goldman Sachs, Tencent, eBay, Amazon, Facebook, Baidu, LinkedIn, Airbnb, VMware, IBM, Cisco | Explore -> Algorithms, Difficulty -> Easy | String, Two Pointers | Java |
+| 608 | Coding | [350. Intersection of Two Arrays II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P350_IntersectionOfTwoArrays2) | LeetCode | Facebook, Google, Oracle, Yelp, Bloomberg, Amazon, Alibaba | Problems -> Algorithms, Difficulty -> Easy | Hash Table, Two Pointers, Binary Search, Sort | Java |
+| 609 | Coding | [364. Nested List Weight Sum II](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P364_NestedListWeightSum2) | LeetCode | LinkedIn | Problems -> Algorithms, Difficulty -> Medium | Depth-first Search | Java |
+| 610 | Coding | [366. Find Leaves of Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P366_FindLeavesOfBinaryTree) | LeetCode | LinkedIn, Pocket Gems, Bloomberg | Problems -> Algorithms, Difficulty -> Medium | Tree, Depth-first Search | Java |
+| 611 | Coding | [367. Valid Perfect Square](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P367_ValidPerfectSquare) | LeetCode | LinkedIn, Facebook, Microsoft | Problems -> Algorithms, Difficulty -> Easy | Math, Binary Search | Java |
+| 612 | Coding | [387. First Unique Character in a String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P301_P400/P387_FirstUniqueCharacterInAString) | LeetCode | Bloomberg, Facebook, Amazon, Apple, Zillow, Goldman Sachs, Google, Microsoft, Yahoo, Airbnb, SAP, Alibaba, Oracle | Explore -> Algorithms, Difficulty -> Easy | String, Hash Table | Java |
+| 613 | Coding | [464. Can I Win](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P401_P500/P464_CanIWin) | LeetCode | LinkedIn, Google | Problems -> Algorithms, Difficulty -> Medium | Dynamic Programming, Minmax | Java |
+| 614 | Coding | [515. Find Largest Value in Each Tree Row](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P501_P600/P515_FindLargestValueInEachTreeRow) | LeetCode | LinkedIn | Problems -> Algorithms, Difficulty -> Medium | Tree, Depth-first Search, Breadth-first Search | Java |
+| 615 | Coding | [605. Can Place Flowers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P605_CanPlaceFlowers) | LeetCode | LinkedIn | Problems -> Algorithms, Difficulty -> Easy | Array | Java |
+| 616 | Coding | [633. Sum of Square Numbers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P633_SumOfSquareNumbers) | LeetCode | LinkedIn, Facebook | Problems -> Algorithms, Difficulty -> Easy | Math | Java |
+| 617 | Coding | [647. Palindromic Substrings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P647_PalindromicSubstrings) | LeetCode | LinkedIn, Twitter, Pure Storage, Facebook, Amazon, Expedia, Google, Microsoft, Apple, Uber | Problems -> Algorithms, Difficulty -> Medium | String, Dynamic Programming | Java |
+| 618 | Coding | [671. Second Minimum Node In a Binary Tree](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P671_SecondMinimumNodeInABinaryTree) | LeetCode | LinkedIn, Microsoft, Apple | Problems -> Algorithms, Difficulty -> Easy | Tree | Java |
+| 619 | Coding | [698. Partition to K Equal Sum Subsets](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P601_P700/P698_PartitionToKEqualSumSubsets) | LeetCode | LinkedIn, Bloomberg | Problems -> Algorithms, Difficulty -> Medium | Dynamic Programming, Recursion | Java |
+| 620 | Coding | [716. Max Stack](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P701_P800/P716_MaxStack) | LeetCode | LinkedIn, Lyft, Google, Pure Storage | Problems -> Algorithms, Difficulty -> Hard | Design | Java |
+| 621 | Coding | [730. Count Different Palindromic Subsequences](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P701_P800/P730_CountDifferentPalindromicSubsequences) | LeetCode | LinkedIn | Problems -> Algorithms, Difficulty -> Hard | String, Dynamic Programming | Java |
+| 622 | Coding | [921. Minimum Add to Make Parentheses Valid](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/LeetCode/src/Problems/P901_P1000/P921_MinimumAddToMakeParenthesesValid) | LeetCode | Facebook | Problems -> Algorithms, Difficulty -> Medium | Stack, Greedy | Java |
+| 623 | Coding | [Binary Tree to Doubly Linked List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/BinaryTreeToDoublyLinkedList) | Miscellaneous |  | Difficulty | Binary Tree |  |
+| 624 | Coding | [Clone a Linked List with Next and Random Pointers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/CloneLinkedListWithNextAndRandomPointer) |  | Amazon | Difficulty -> Medium | Linked List, HashMap | Java |
+| 625 | Coding | [Common Letters in Input Strings](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/CommonLettersInInputStrings) | Miscellaneous | Google | Difficulty -> Easy | HashMap, Strings | Java |
+| 626 | Coding | [Find if Number is Little or Big Endian](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/FindNumberLittleOrBigEndian) | Miscellaneous | Aruba Networks | Difficulty | Math |  |
+| 627 | Coding | [Implement Queue using Stack](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/ImplementQueueUsingStack) | Miscellaneous | Aruba Networks | Difficulty |  |  |
+| 628 | Coding | [In-memory Database with Nested Transaction Support](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/InMemoryDatabaseWithNestedTransactions) |  | Xob | Difficulty -> Medium |  |  |
+| 629 | Coding | [Index Of Last Occurrence Of Element In Array](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/IndexOfLastOccurrenceOfElementInArray) | Miscellaneous | Apple | Difficulty |  |  |
+| 630 | Coding | [Kth Largest Element In Bst](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/KthLargestElementInBst) | Miscellaneous | Aruba Networks | Difficulty |  |  |
+| 631 | Coding | [Level Order Traversal Binary Tree Level By Level](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/LevelOrderTraversalBinaryTreeLevelByLevel) | Miscellaneous |  | Difficulty | Binary Tree | Java |
+| 632 | Coding | [Level Order Traversal Of Binary Tree in Single Line](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/LevelOrderTraversalBinaryTreeSingleLine) | Miscellaneous |  | Difficulty | Binary Tree | Java |
+| 633 | Coding | [Map Words List to Grid](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/MapWordsListToGrid) | Miscellaneous |  | Difficulty |  | Java |
+| 634 | Coding | [Mapping between Message and Code](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/MappingBetweenMessageAndCode) | Miscellaneous | GoDaddy | Difficulty | HashMap | Java |
+| 635 | Coding | [Find the number of distinct islands](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/NumberOfDistinctIslands) | Miscellaneous | Qualtrics | Difficulty -> Medium | Depth-first Search, Breadth-first Search, Union Find | Java |
+| 636 | Coding | [Remove Duplicates and Return List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/RemoveDuplicatesAndReturnList) |  | Google | Difficulty -> Easy | Array, HashMap | Java |
+| 637 | Coding | [Remove Duplicates and Return Weighted List](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/RemoveDuplicatesAndReturnWeightedList) | Miscellaneous | Google | Difficulty -> Medium | Array, HashMap | Java |
+| 638 | Coding | [Reverse a String](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/ReverseString) | Miscellaneous | Aruba Networks | Difficulty | Strings |  |
+| 639 | Coding | [Rotate the Bits of a Number](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/RotateTheBitsOfANumber) | Miscellaneous | Aruba Networks | Difficulty | Math |  |
+| 640 | Coding | [Seed Records Per Bin](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/SeedRecordsPerBin) | Miscellaneous | The Climate Corporation | Difficulty -> Easy |  | csharp |
+| 641 | Coding | [Simple Product Sorting](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/SortCommaSeparatedProducts) | Miscellaneous | Shopify | Difficulty -> Easy | Arrays, Sorting | Java |
+| 642 | Coding | [Swap Two Pointers](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/SwapTwoPointers) | Miscellaneous | Aruba Networks | Difficulty | Pointers |  |
+| 643 | Coding | [Top Three Sequence Visited](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/TopThreeSequenceVisited) | Miscellaneous | Amazon | Difficulty |  |  |
+| 644 | Coding | [Truck Loading Find Total Weight](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/Coding/TruckLoadingTotalWeight) | Miscellaneous | Wayfair | Difficulty -> Easy |  | Java, csharp |
+| 645 | Coding | [Blum-Floyd-Pratt-Rivest-Tarjan Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/BlumFloydPrattRivestTarjanAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Medium | Array |  |
+| 646 | Coding | [Edmonds–Karp Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/EdmondsKarpAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Medium |  |  |
+| 647 | Coding | [Ford–Fulkerson Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/FordFulkersonAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Medium |  |  |
+| 648 | Coding | [Kadane's Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/KadanesAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Medium | Breadth-first Search |  |
+| 649 | Coding | [Knuth–Morris–Pratt Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/KnuthMorrisPrattAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Hard | String, Array |  |
+| 650 | Coding | [Krushal's Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/KruskalsAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Hard | Tree, Graph |  |
+| 651 | Coding | [Lee Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/LeeAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Medium | Breadth-first Search |  |
+| 652 | Coding | [Manacher's Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/KnownAlgorithms/_NamedAlgorithms/ManachersAlgorithm) | Miscellaneous |  | Known Algorithms -> Named Algorithms, Difficulty -> Hard | String |  |
+| 653 | Systems Design | [Design an automated parking garage with object models and APIs](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/AutomatedParkingGarage) | Miscellaneous | Wayfair | Difficulty -> Medium | Object Oriented Design |  |
+| 654 | Systems Design | [Design the Backend for an Online Retailer](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/DesignBackendForOnlineRetailer) | Miscellaneous | Amazon | Difficulty -> Medium | Distributed Systems Design |  |
+| 655 | Systems Design | [Design a Paywall for a News Portal](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/DesignPaywall) | Miscellaneous | Qualtrics | Difficulty -> Medium | Distributed Systems Design |  |
+| 656 | Systems Design | [Elevator with Scheduling Algorithm](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/Elevator) | Miscellaneous | Box | Difficulty -> Medium | Distributed Systems Design, Object Oriented Design |  |
+| 657 | Systems Design | [Images Deduplicator](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/ImagesDedeplicator) | Miscellaneous | Netflix | Difficulty -> Medium | Distributed Systems Design |  |
+| 658 | Systems Design | [Scaling Read Requests](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Miscellaneous/src/Problems/SystemsDesign/ScalingReadRequests) | Miscellaneous |  | Difficulty -> Easy | Distributed Systems Design |  |
+| 659 | Coding | [All K Subsequence Maximums](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Blog/SlidingWindow/AllKSubsequenceMaximums) | Pramp |  |  |  |  |
+| 660 | Coding | [Maximum Sum Subsequence](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Blog/SlidingWindow/MaximumSumSubsequence) | Pramp |  |  |  |  |
+| 661 | Coding | [Moving Average](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Blog/SlidingWindow/MovingAverage) | Pramp |  |  |  |  |
+| 662 | Behavioral | [Behavioral Question Set 10](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet10) | Pramp |  | Difficulty |  |  |
+| 663 | Behavioral | [Behavioral Question Set 2](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet2) | Pramp |  | Difficulty |  |  |
+| 664 | Behavioral | [Behavioral Question Set 3](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet3) | Pramp |  | Difficulty |  |  |
+| 665 | Behavioral | [Behavioral Question Set 4](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/Behavioral/BehavioralQuestionSet4) | Pramp |  | Difficulty |  |  |
+| 666 | Coding | [Array Quadruplet](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/ArrayQuadruplet) | Pramp |  | Difficulty |  | Java |
+| 667 | Coding | [Basic Regex Parser](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/BasicRegexParser) | Pramp |  | Difficulty |  |  |
+| 668 | Coding | [BST Successor Search](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/BstSuccessorSearch) | Pramp |  | Difficulty |  | Java |
+| 669 | Coding | [Decrypt Message](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/DecryptMessage) | Pramp |  | Difficulty |  | Java |
+| 670 | Coding | [Number of Paths](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/DataStructuresAndAlgorithms/NumberOfPaths) | Pramp |  | Difficulty | Dynamic Programming | Java |
+| 671 | Systems Design | [Key-Value Cache for Search Engine](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/KeyValueCacheForSearchEngine) | Pramp |  | Difficulty |  |  |
+| 672 | Systems Design | [Sales Rank](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/SalesRank) | Pramp |  | Difficulty |  |  |
+| 673 | Systems Design | [Scale on the Cloud](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/ScaleOnTheCloud) | Pramp |  | Difficulty |  |  |
+| 674 | Systems Design | [Social Graph](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/SocialGraph) | Pramp |  | Difficulty |  |  |
+| 675 | Systems Design | [Twitter](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/Twitter) | Pramp |  | Difficulty |  |  |
+| 676 | Systems Design | [Web Crawler](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Pramp/src/Problems/SystemDesign/WebCrawler) | Pramp |  | Difficulty |  |  |
+| 677 | Course | [AWS Certified Solutions Architect - Associate](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Udemy/src/acloudguru-aws-certified-solutions-architect-associate) | Udemy |  | Courses -> AWS Certified Solutions Architect - Associate, Instructors -> Ryan Kroonenburg, Instructors -> Faye Ellis | Distributed Systems, Cloud Computing, Amazon Web Services |  |
+| 678 | Course | [The Ultimate Hands-On Hadoop - Tame your Big Data!](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Udemy/src/the-ultimate-handson-hadoop-tame-your-big-data) | Udemy |  | Courses -> The Ultimate Hands-On Hadoop - Tame your Big Data!, Instructors -> Frank Kane | Distributed Systems, Big Data |  |
+| 679 | Course | [Ultimate AWS Certified Solutions Architect Associate](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/Udemy/src/ultimate-aws-certified-solutions-architect-associate) | Udemy |  | Courses -> Ultimate AWS Certified Solutions Architect Associate, Instructors -> Stephane Maarek | Distributed Systems, Cloud Computing, Amazon Web Services |  |
+| 680 | Reading | [Building Microservices -  Designing Fine-Grained Systems](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/building-microservices_designing-fine-grained-systems) | Notes - Book |  | Books, Authors -> Sam Neuman | Distributed Systems, Cloud Computing, DevOps, Microservices |  |
+| 681 | Reading | [Designing Data Intensive Applications](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/designing-data-intensive-applications) | Notes - Book |  | Books, Authors -> Martin Kleppmann | Distributed Systems, Cloud Computing, Databases |  |
+| 682 | Reading | [Distributed systems for fun and profit](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/distributed-systems-for-fun-and-profit) | Notes - Book |  | Books, Authors -> Mikito Takada -> alias -> mixu | Distributed Systems, Cloud Computing |  |
+| 683 | Reading | [I Heart Logs: Event Data, Stream Processing, and Data Integration](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/i-heart-logs_event-data-stream-processing-data-integration) | Notes - Book |  | Books, Authors -> Jay Kreps | Distributed Systems, Event Data, Data Integration, Stream Processing |  |
+| 684 | Reading | [Production-Ready Microservices](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/production-ready-microservices) | Notes - Book |  | Books, Authors -> Susan Fowler | Distributed Systems, Cloud Computing, Microservices, DevOps, Site Reliability Engineering |  |
+| 685 | Reading | [Scaling Teams: Strategies for Building Successful Teams and Organizations](https://github.com/computer-science-engineering/learning-computer-science/tree/master/src/_notes/books/scaling-teams_strategies-for-building-successful-teams-and-organizations) | Notes - Book |  | Books, Authors -> Alexander Grosse, Authors -> David Loftesness | Engineering Leadership |  |
\ No newline at end of file
