You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ossie.apache.org by gi...@apache.org on 2026/09/07 12:04:20 UTC
(ossie-website) branch asf-site updated (693912c -> 810f244)
This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a change to branch asf-site
in repository https://gitbox.apache.org/repos/asf/ossie-website.git
discard 693912c Publish site from 34c76571d41ab150f732e7cec5257be27008361e
new 810f244 Publish site from 7c4f48af2a35345edee39def770997cdea71d8b9
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (693912c)
\
N -- N -- N refs/heads/asf-site (810f244)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
assets/images/logos/witboost-logo.png | Bin 0 -> 34017 bytes
ecosystem/index.html | 55 +++++++++++++++++++++---
sitemap.xml | 78 +++++++++++++++++-----------------
sitemap.xml.gz | Bin 805 -> 804 bytes
4 files changed, 88 insertions(+), 45 deletions(-)
create mode 100644 assets/images/logos/witboost-logo.png
(ossie-website) 01/01: Publish site from 7c4f48af2a35345edee39def770997cdea71d8b9
Posted by gi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
github-actions[bot] pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/ossie-website.git
commit 810f244d2cb740b3eb827e9638229d0dd4364126
Author: Apache Ossie CI <de...@ossie.apache.org>
AuthorDate: Mon Sep 7 12:04:13 2026 +0000
Publish site from 7c4f48af2a35345edee39def770997cdea71d8b9
---
.asf.yaml | 71 +
.nojekyll | 0
404.html | 667 ++
assets/images/apache-incubator-logo.png | Bin 0 -> 17961 bytes
assets/images/apache-incubator.svg | 1 +
assets/images/favicon.png | Bin 0 -> 1870 bytes
assets/images/logos/alation-logo.png | Bin 0 -> 48862 bytes
assets/images/logos/anomalo-logo.svg | 33 +
assets/images/logos/ataccama-logo.png | Bin 0 -> 6665 bytes
assets/images/logos/atlan-logo.png | Bin 0 -> 14955 bytes
assets/images/logos/atscale-logo.png | Bin 0 -> 13466 bytes
assets/images/logos/aws-logo.png | Bin 0 -> 19021 bytes
assets/images/logos/bigeye-logo.png | Bin 0 -> 8860 bytes
assets/images/logos/blackrock-logo.png | Bin 0 -> 43282 bytes
assets/images/logos/blueyonder-logo.png | Bin 0 -> 52879 bytes
assets/images/logos/carto-logo.png | Bin 0 -> 6164 bytes
assets/images/logos/cloudera-logo.png | Bin 0 -> 8244 bytes
assets/images/logos/coalesce-logo.png | Bin 0 -> 6496 bytes
assets/images/logos/cogniti-logo.png | Bin 0 -> 34711 bytes
assets/images/logos/collate-logo.png | Bin 0 -> 12847 bytes
assets/images/logos/collibra-logo.png | Bin 0 -> 29638 bytes
assets/images/logos/count-logo.png | Bin 0 -> 20422 bytes
assets/images/logos/credible-logo.png | Bin 0 -> 70243 bytes
assets/images/logos/cube-logo.png | Bin 0 -> 17028 bytes
assets/images/logos/databricks-logo.png | Bin 0 -> 25038 bytes
assets/images/logos/datahub-logo.png | Bin 0 -> 92656 bytes
assets/images/logos/dataiku-logo.png | Bin 0 -> 4221 bytes
assets/images/logos/dbt-labs-logo.png | Bin 0 -> 15596 bytes
assets/images/logos/denodo-logo.png | Bin 0 -> 9993 bytes
assets/images/logos/domo-logo.png | Bin 0 -> 71859 bytes
assets/images/logos/dremio-logo.png | Bin 0 -> 43382 bytes
assets/images/logos/elementum-logo.png | Bin 0 -> 23999 bytes
assets/images/logos/entropy-data-logo.svg | 101 +
assets/images/logos/firebolt-logo.png | Bin 0 -> 18987 bytes
assets/images/logos/gooddata-logo.svg | 4 +
assets/images/logos/google-logo.png | Bin 0 -> 95160 bytes
assets/images/logos/gravity-logo.svg | 10 +
assets/images/logos/hex-logo.png | Bin 0 -> 61283 bytes
assets/images/logos/honeydew-logo.png | Bin 0 -> 17300 bytes
assets/images/logos/informatica-logo.png | Bin 0 -> 14346 bytes
assets/images/logos/instacart-logo.png | Bin 0 -> 58663 bytes
assets/images/logos/jetbrains-logo.png | Bin 0 -> 8187 bytes
assets/images/logos/kyvos-logo.svg | 10 +
assets/images/logos/lightdash-logo.png | Bin 0 -> 64893 bytes
assets/images/logos/metabase-logo.png | Bin 0 -> 47939 bytes
assets/images/logos/mistral-ai-logo.png | Bin 0 -> 27173 bytes
assets/images/logos/omni-logo.png | Bin 0 -> 7791 bytes
assets/images/logos/oracle-logo.png | Bin 0 -> 3140 bytes
assets/images/logos/preset-logo.png | Bin 0 -> 9521 bytes
assets/images/logos/puppygraph-logo.png | Bin 0 -> 82100 bytes
assets/images/logos/qlik-logo.png | Bin 0 -> 52436 bytes
assets/images/logos/relationalai-logo.png | Bin 0 -> 21113 bytes
assets/images/logos/saal-logo.png | Bin 0 -> 3586 bytes
assets/images/logos/saiku-logo.svg | 26 +
assets/images/logos/salesforce-logo.png | Bin 0 -> 44790 bytes
assets/images/logos/selectstar-logo.png | Bin 0 -> 105276 bytes
assets/images/logos/semantido-logo.png | Bin 0 -> 13986 bytes
assets/images/logos/servicenow-logo.png | Bin 0 -> 37404 bytes
assets/images/logos/sigma-logo.png | Bin 0 -> 30303 bytes
assets/images/logos/snowflake-logo.png | Bin 0 -> 24715 bytes
assets/images/logos/starburst-logo.png | Bin 0 -> 44573 bytes
assets/images/logos/strategy-logo.png | Bin 0 -> 20465 bytes
assets/images/logos/sundial-logo.png | Bin 0 -> 19687 bytes
assets/images/logos/thoughtspot-logo.png | Bin 0 -> 25657 bytes
assets/images/logos/veezoo-logo.svg | 1 +
assets/images/logos/wingarc1st-logo.svg | 1 +
assets/images/logos/witboost-logo.png | Bin 0 -> 34017 bytes
assets/images/logos/xsolcorp-korea-logo.png | Bin 0 -> 38035 bytes
assets/images/logos/zeta-global-logo.png | Bin 0 -> 9804 bytes
assets/images/ossie-logos/Ossie_DarkBlue.svg | 15 +
assets/images/ossie-logos/Ossie_Green.svg | 15 +
assets/images/ossie-logos/Ossie_LightBlue.svg | 15 +
assets/images/ossie-logos/logo-full-horizontal.svg | 25 +
assets/images/ossie-logos/logo-icon.svg | 22 +
assets/images/ossie-logos/logo-mark.svg | 14 +
assets/images/ossie-logos/ossie-social-card.png | Bin 0 -> 64420 bytes
assets/javascripts/bundle.d7400e89.min.js | 16 +
assets/javascripts/bundle.d7400e89.min.js.map | 7 +
assets/javascripts/ecosystem.js | 40 +
assets/javascripts/home.js | 62 +
assets/javascripts/lunr/min/lunr.ar.min.js | 1 +
assets/javascripts/lunr/min/lunr.da.min.js | 18 +
assets/javascripts/lunr/min/lunr.de.min.js | 18 +
assets/javascripts/lunr/min/lunr.du.min.js | 18 +
assets/javascripts/lunr/min/lunr.el.min.js | 1 +
assets/javascripts/lunr/min/lunr.es.min.js | 18 +
assets/javascripts/lunr/min/lunr.fi.min.js | 18 +
assets/javascripts/lunr/min/lunr.fr.min.js | 18 +
assets/javascripts/lunr/min/lunr.he.min.js | 1 +
assets/javascripts/lunr/min/lunr.hi.min.js | 1 +
assets/javascripts/lunr/min/lunr.hu.min.js | 18 +
assets/javascripts/lunr/min/lunr.hy.min.js | 1 +
assets/javascripts/lunr/min/lunr.it.min.js | 18 +
assets/javascripts/lunr/min/lunr.ja.min.js | 1 +
assets/javascripts/lunr/min/lunr.jp.min.js | 1 +
assets/javascripts/lunr/min/lunr.kn.min.js | 1 +
assets/javascripts/lunr/min/lunr.ko.min.js | 1 +
assets/javascripts/lunr/min/lunr.multi.min.js | 1 +
assets/javascripts/lunr/min/lunr.nl.min.js | 18 +
assets/javascripts/lunr/min/lunr.no.min.js | 18 +
assets/javascripts/lunr/min/lunr.pt.min.js | 18 +
assets/javascripts/lunr/min/lunr.ro.min.js | 18 +
assets/javascripts/lunr/min/lunr.ru.min.js | 18 +
assets/javascripts/lunr/min/lunr.sa.min.js | 1 +
.../lunr/min/lunr.stemmer.support.min.js | 1 +
assets/javascripts/lunr/min/lunr.sv.min.js | 18 +
assets/javascripts/lunr/min/lunr.ta.min.js | 1 +
assets/javascripts/lunr/min/lunr.te.min.js | 1 +
assets/javascripts/lunr/min/lunr.th.min.js | 1 +
assets/javascripts/lunr/min/lunr.tr.min.js | 18 +
assets/javascripts/lunr/min/lunr.vi.min.js | 1 +
assets/javascripts/lunr/min/lunr.zh.min.js | 1 +
assets/javascripts/lunr/tinyseg.js | 206 +
assets/javascripts/lunr/wordcut.js | 6708 ++++++++++++++++++++
assets/javascripts/workers/search.2c215733.min.js | 42 +
.../javascripts/workers/search.2c215733.min.js.map | 7 +
assets/stylesheets/bootstrap.min.css | 6 +
assets/stylesheets/global.css | 700 ++
assets/stylesheets/home.css | 908 +++
assets/stylesheets/main.ec1eaa64.min.css | 1 +
assets/stylesheets/main.ec1eaa64.min.css.map | 1 +
assets/stylesheets/palette.ab4e12ef.min.css | 1 +
assets/stylesheets/palette.ab4e12ef.min.css.map | 1 +
community/index.html | 870 +++
ecosystem/index.html | 1859 ++++++
index.html | 1222 ++++
sitemap.xml | 159 +
sitemap.xml.gz | Bin 0 -> 804 bytes
spec/index.html | 723 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
updates/archive/2025/index.html | 1113 ++++
updates/archive/2026/index.html | 925 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
updates/fsi-working-group-is-live/index.html | 896 +++
updates/index.html | 1384 ++++
.../index.html | 770 +++
.../index.html | 773 +++
updates/osi-april-2026-community-update/index.html | 960 +++
.../index.html | 773 +++
updates/osi-is-cool/index.html | 773 +++
.../index.html | 773 +++
updates/ossie-enters-apache-incubator/index.html | 938 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 773 +++
.../index.html | 771 +++
.../index.html | 773 +++
164 files changed, 43485 insertions(+)
diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..7d9dd62
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,71 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+# The format of this file is documented at
+# https://github.com/apache/infrastructure-asfyaml
+# also at
+# https://cwiki.apache.org/confluence/display/INFRA/Git+-+.asf.yaml+features
+
+github:
+ description: "Apache Ossie Website"
+ homepage: https://ossie.apache.org/
+ labels:
+ - semantic
+ - metadata
+
+ enabled_merge_buttons:
+ merge: false
+ squash: true
+ rebase: false
+
+ del_branch_on_merge: true
+
+ copilot_code_review:
+ enabled: true
+ review_drafts: false
+ review_on_push: false
+
+ protected_branches:
+ main:
+ required_pull_request_reviews:
+ require_code_owner_reviews: false
+ dismiss_stale_reviews: true
+ require_last_push_approval: false
+ required_approving_review_count: 1
+
+ required_linear_history: true
+
+ features:
+ wiki: false
+ issues: true
+ projects: true
+ discussions: true
+
+ ghp_branch: gh-pages
+ ghp_path: /
+
+notifications:
+ commits: commits@ossie.apache.org
+ issues: issues@ossie.apache.org
+ pullrequests: issues@ossie.apache.org
+ discussions: dev@ossie.apache.org
+ jira_options: link label
+
+publish:
+ whoami: asf-site
diff --git a/.nojekyll b/.nojekyll
new file mode 100644
index 0000000..e69de29
diff --git a/404.html b/404.html
new file mode 100644
index 0000000..84926e6
--- /dev/null
+++ b/404.html
@@ -0,0 +1,667 @@
+
+<!doctype html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+ <meta name="description" content="Apache Ossie (incubating) is a collaborative, open-source effort dedicated to standardizing semantic model exchange across analytics, AI, and BI platforms.">
+
+
+
+
+
+
+
+
+
+ <link rel="icon" href="/assets/images/ossie-logos/logo-mark.svg">
+ <meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.7">
+
+
+
+ <title>Apache Ossie (incubating)</title>
+
+
+
+ <link rel="stylesheet" href="/assets/stylesheets/main.ec1eaa64.min.css">
+
+
+ <link rel="stylesheet" href="/assets/stylesheets/palette.ab4e12ef.min.css">
+
+
+
+
+
+
+
+
+
+
+
+
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
+ <style>:root{--md-text-font:"Inter";--md-code-font:"Roboto Mono"}</style>
+
+
+
+ <link rel="stylesheet" href="/assets/stylesheets/bootstrap.min.css">
+
+ <link rel="stylesheet" href="/assets/stylesheets/global.css">
+
+ <script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
+
+
+
+
+
+ </head>
+
+
+
+
+
+
+
+ <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="custom">
+
+
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
+ <label class="md-overlay" for="__drawer"></label>
+ <div data-md-component="skip">
+
+ </div>
+ <div data-md-component="announce">
+
+ </div>
+
+
+
+<header class="md-header" data-md-component="header">
+ <nav class="md-header__inner md-grid" aria-label="Header">
+
+ <!-- Left: logo + mobile hamburger -->
+ <div class="md-header__left">
+ <label class="md-header__button md-icon md-header__hamburger" for="__drawer">
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
+ </label>
+ <a href="https://ossie.apache.org/" class="md-header__button md-logo md-header__brand" aria-label="Home">
+ <img src="/assets/images/ossie-logos/logo-mark.svg"
+ alt="Apache Ossie" class="md-header__brand-icon">
+ <span class="md-header__brand-text">Apache Ossie (incubating)</span>
+ </a>
+ </div>
+
+ <!-- Center: nav links (desktop only) -->
+ <div class="md-header__center">
+ <ul class="md-header__nav">
+
+
+
+
+
+ <li class="md-header__nav-item">
+ <a href="/." class="md-header__nav-link"
+ >
+ Home
+
+ </a>
+ </li>
+
+
+
+
+
+
+ <li class="md-header__nav-item">
+ <a href="/.#about" class="md-header__nav-link"
+ >
+ About
+
+ </a>
+ </li>
+
+
+
+
+
+ <li class="md-header__nav-item">
+ <a href="/community/" class="md-header__nav-link"
+ >
+ Community
+
+ </a>
+ </li>
+
+
+
+
+
+ <li class="md-header__nav-item">
+ <a href="/ecosystem/" class="md-header__nav-link"
+ >
+ Ecosystem
+
+ </a>
+ </li>
+
+
+
+
+
+ <li class="md-header__nav-item">
+ <a href="/updates/" class="md-header__nav-link"
+ >
+ Updates
+
+ </a>
+ </li>
+
+
+
+
+
+ <li class="md-header__nav-item">
+ <a href="https://github.com/apache/ossie" class="md-header__nav-link"
+ target="_blank" rel="noopener">
+ GitHub
+
+
+<svg class="ossie-external-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M352 0c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9L370.7 96 201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L416 141.3l41.4 41.4c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-128c0-17.7-14.3-32-32-32L352 0zM80 32C35.8 32 0 67.8 0 112L0 432c0 44.2 35.8 80 80 80l320 0c44.2 0 80-35.8 80-80l0-160c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160c0 8.8-7.2 16-16 16L80 44 [...]
+
+ </a>
+ </li>
+
+
+ <!-- Apache Software Foundation menu (kept next to the GitHub link) -->
+ <li class="md-header__nav-item md-header__nav-item--asf" role="none">
+ <div class="md-header__asf">
+ <button type="button" class="md-header__asf-trigger" aria-haspopup="true" aria-expanded="false">
+ ASF
+ <svg class="md-header__asf-caret" viewBox="0 0 24 24" aria-hidden="true">
+ <path d="M7 10l5 5 5-5z" fill="currentColor"/>
+ </svg>
+ </button>
+ <ul class="md-header__asf-menu" role="menu">
+ <li role="none"><a role="menuitem" href="https://www.apache.org/" target="_blank" rel="noopener">Foundation</a></li>
+ <li role="none"><a role="menuitem" href="https://www.apache.org/licenses/" target="_blank" rel="noopener">License</a></li>
+ <li role="none"><a role="menuitem" href="https://www.apache.org/events/current-event.html" target="_blank" rel="noopener">Events</a></li>
+ <li role="none"><a role="menuitem" href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener">Sponsorship</a></li>
+ <li role="none"><a role="menuitem" href="https://privacy.apache.org/policies/privacy-policy-public.html" target="_blank" rel="noopener">Privacy</a></li>
+ <li role="none"><a role="menuitem" href="https://www.apache.org/security/" target="_blank" rel="noopener">Security</a></li>
+ <li role="none"><a role="menuitem" href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener">Thanks</a></li>
+ </ul>
+ </div>
+ </li>
+ </ul>
+ </div>
+
+ </nav>
+</header>
+
+ <div class="md-container" data-md-component="container">
+
+
+
+
+
+<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
+ <div class="md-grid">
+ <ul class="md-tabs__list">
+
+
+
+
+
+
+ <li class="md-tabs__item">
+ <a href="/." class="md-tabs__link">
+
+
+
+
+
+ Home
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+ <li class="md-tabs__item">
+ <a href="/index.html#about" class="md-tabs__link">
+
+
+
+
+
+ About
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+ <li class="md-tabs__item">
+ <a href="/community/" class="md-tabs__link">
+
+
+
+
+
+ Community
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+ <li class="md-tabs__item">
+ <a href="/ecosystem/" class="md-tabs__link">
+
+
+
+
+
+ Ecosystem
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+ <li class="md-tabs__item">
+ <a href="/updates/" class="md-tabs__link">
+
+
+
+
+
+ Updates
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+ <li class="md-tabs__item">
+ <a href="https://github.com/apache/ossie" class="md-tabs__link">
+
+
+
+
+
+ GitHub
+
+ </a>
+ </li>
+
+
+
+ </ul>
+ </div>
+</nav>
+
+
+
+ <main class="md-main" data-md-component="main">
+ <div class="md-main__inner md-grid">
+
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+
+
+
+
+<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
+ <label class="md-nav__title" for="__drawer">
+ <a href="/." title="Apache Ossie (incubating)" class="md-nav__button md-logo" aria-label="Apache Ossie (incubating)" data-md-component="logo">
+
+ <img src="/assets/images/ossie-logos/Ossie_DarkBlue.svg" alt="logo">
+
+ </a>
+ Apache Ossie (incubating)
+ </label>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+
+
+
+ <a href="/." class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Home
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+
+
+
+
+ <a href="/.#about" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ About
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+
+
+
+ <a href="/community/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Community
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+
+
+
+ <a href="/ecosystem/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Ecosystem
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+
+
+
+ <a href="/updates/" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ Updates
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+
+
+
+ <a href="https://github.com/apache/ossie" class="md-nav__link">
+
+
+
+ <span class="md-ellipsis">
+
+
+ GitHub
+
+
+
+ </span>
+
+
+
+ </a>
+ </li>
+
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+
+<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
+
+
+
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content" data-md-component="content">
+
+
+
+
+
+
+
+
+
+ <article class="md-content__inner md-typeset">
+
+ <h1>404 - Not found</h1>
+
+ </article>
+ </div>
+
+
+ <script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
+
+<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
+ </div>
+
+ <button type="button" class="md-top md-icon" data-md-component="top" hidden>
+
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
+ Back to top
+</button>
+
+ </main>
+
+
+<footer class="md-footer">
+
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+
+
+<div class="md-copyright">
+ <div class="md-copyright__highlight">
+ Copyright © 2026 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. <br> Apache, the names of Apache projects, and the feather logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. All other marks mentioned may be trademarks or registered trademarks of their respective owners.
+ </div>
+
+ <a class="osi-incubator-logo" href="https://incubator.apache.org/" target="_blank" rel="noopener">
+ <img
+ src="/assets/images/apache-incubator.svg"
+ alt="Apache Incubator">
+ </a>
+ <div class="osi-disclaimer">
+ Apache Ossie is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the pro [...]
+ </div>
+
+
+ Made with
+ <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
+ Material for MkDocs
+ </a>
+
+</div>
+
+
+
+<div class="md-social">
+
+
+
+
+
+ <a href="https://github.com/apache/ossie" target="_blank" rel="noopener" title="Apache Ossie on GitHub" class="md-social__link">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 [...]
+ </a>
+
+</div>
+
+ </div>
+ </div>
+
+
+</footer>
+
+ </div>
+ <div class="md-dialog" data-md-component="dialog">
+ <div class="md-dialog__inner md-typeset"></div>
+ </div>
+
+
+
+
+
+ <script id="__config" type="application/json">{"annotate": null, "base": "/", "features": ["navigation.tabs", "navigation.path", "navigation.sections", "navigation.top", "navigation.tracking", "toc.follow", "content.tabs.link", "content.code.copy", "content.code.annotate"], "search": "/assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more [...]
+
+
+ <script src="/assets/javascripts/bundle.d7400e89.min.js"></script>
+
+ <script src="/assets/javascripts/home.js"></script>
+
+
+ </body>
+</html>
\ No newline at end of file
diff --git a/assets/images/apache-incubator-logo.png b/assets/images/apache-incubator-logo.png
new file mode 100644
index 0000000..759252f
Binary files /dev/null and b/assets/images/apache-incubator-logo.png differ
diff --git a/assets/images/apache-incubator.svg b/assets/images/apache-incubator.svg
new file mode 100644
index 0000000..1b4c364
--- /dev/null
+++ b/assets/images/apache-incubator.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 473.26 110.22"><defs><style>.cls-1,.cls-2{fill:#fff;}.cls-1{fill-rule:evenodd;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><polygon class="cls-1" points="445.81 13.29 467.03 13.29 467.03 15.29 448.03 15.29 448.03 27.09 465.11 27.09 465.11 29.09 448.03 29.09 448.03 41.1 467.24 41.1 467.24 43.11 445.81 43.11 445.81 13.29"/><polygon class="cls-1" points="377.65 13.29 379.86 13.29 379.86 27.13 3 [...]
\ No newline at end of file
diff --git a/assets/images/favicon.png b/assets/images/favicon.png
new file mode 100644
index 0000000..1cf13b9
Binary files /dev/null and b/assets/images/favicon.png differ
diff --git a/assets/images/logos/alation-logo.png b/assets/images/logos/alation-logo.png
new file mode 100644
index 0000000..7aa931c
Binary files /dev/null and b/assets/images/logos/alation-logo.png differ
diff --git a/assets/images/logos/anomalo-logo.svg b/assets/images/logos/anomalo-logo.svg
new file mode 100644
index 0000000..0bab4e5
--- /dev/null
+++ b/assets/images/logos/anomalo-logo.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 1275.3 238.1" style="enable-background:new 0 0 1275.3 238.1;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#FF6E4D;}
+</style>
+<g>
+ <g>
+ <path d="M166.1,172.5h-109l-22.9,58.8H0.9L91.3,2.8h41.8l89.8,228.5H189L166.1,172.5z M154.7,143.1L111.6,32.8L68.5,143.1H154.7z"
+ />
+ <path d="M244,68.1h31v22.8c9.8-14.7,26.1-26.1,52.2-26.1c37.5,0,58.7,22.8,58.7,57.1v109.4h-31V128.5c0-22.8-9.8-37.5-33-37.5
+ h-2.6c-23.2,0-44.4,18-44.4,49v91.3h-31L244,68.1L244,68.1z"/>
+ <path d="M415.2,149.7c0-50.6,34.3-84.9,78.3-84.9c44.1,0,78.3,34.3,78.3,84.9s-34.3,84.9-78.3,84.9
+ C449.5,234.5,415.2,200.3,415.2,149.7z M494.8,208.4c26.4,0,46-21.2,46-58.7S521.2,91,494.8,91h-2.6c-26.4,0-46,21.2-46,58.7
+ s19.6,58.7,46,58.7H494.8z"/>
+ <path d="M602.4,68.1h31v22.8c9.8-14.7,26.1-26.1,49-26.1c23.5,0,43.1,9.1,53.9,30.4c12.7-22.5,33.9-30.4,53.9-30.4
+ c37.5,0,58.7,22.8,58.7,57.1v109.4h-31V128.5c0-22.8-9.8-37.5-33-37.5h-2.6c-19.9,0-41.1,18-41.1,49v91.3h-31V128.5
+ c0-22.8-9.8-37.5-33-37.5h-2.6c-19.9,0-41.1,18-41.1,49v91.3h-31V68.1H602.4z"/>
+ <path d="M986.9,231.3c-1.6-8.2-1.6-24.5-1.6-26.1c-6.5,14.7-26.1,29.4-52.2,29.4c-31,0-53.9-20.6-53.9-48.3
+ c0-37.2,33-48.3,59.4-50.6l45-3.6v-5.2c0-22.8-13.1-35.9-33.9-35.9h-2.6c-17,0-31.7,8.2-33.6,24.5h-31c2-30,29-50.6,65.9-50.6
+ c43.4,0,66.3,28.7,66.3,62v68.5c0,9.8,0,24.5,1.6,35.9L986.9,231.3L986.9,231.3z M983.6,172.5v-16.6l-40.8,3.3
+ c-18.9,1.6-32.6,10.8-32.6,25.8c0,13.4,11.1,23.5,26.4,23.5h2.6C959.1,208.4,983.6,192.1,983.6,172.5z"/>
+ <path d="M1052.8,2.8h31v228.5h-31V2.8z"/>
+ <path d="M1114.4,149.7c0-50.6,34.3-84.9,78.3-84.9c44.1,0,78.3,34.3,78.3,84.9s-34.3,84.9-78.3,84.9
+ C1148.7,234.5,1114.4,200.3,1114.4,149.7z M1194,208.4c26.4,0,46-21.2,46-58.7S1220.4,91,1194,91h-2.6c-26.4,0-46,21.2-46,58.7
+ s19.6,58.7,46,58.7H1194z"/>
+ </g>
+ <g>
+ <path class="st0" d="M1214.4,137.2v25l-21.6,12.5l-21.6-12.5v-25l21.6-12.5L1214.4,137.2z"/>
+ </g>
+</g>
+</svg>
diff --git a/assets/images/logos/ataccama-logo.png b/assets/images/logos/ataccama-logo.png
new file mode 100644
index 0000000..241293b
Binary files /dev/null and b/assets/images/logos/ataccama-logo.png differ
diff --git a/assets/images/logos/atlan-logo.png b/assets/images/logos/atlan-logo.png
new file mode 100644
index 0000000..bdb98d2
Binary files /dev/null and b/assets/images/logos/atlan-logo.png differ
diff --git a/assets/images/logos/atscale-logo.png b/assets/images/logos/atscale-logo.png
new file mode 100644
index 0000000..18f562a
Binary files /dev/null and b/assets/images/logos/atscale-logo.png differ
diff --git a/assets/images/logos/aws-logo.png b/assets/images/logos/aws-logo.png
new file mode 100644
index 0000000..afda705
Binary files /dev/null and b/assets/images/logos/aws-logo.png differ
diff --git a/assets/images/logos/bigeye-logo.png b/assets/images/logos/bigeye-logo.png
new file mode 100644
index 0000000..36b62c1
Binary files /dev/null and b/assets/images/logos/bigeye-logo.png differ
diff --git a/assets/images/logos/blackrock-logo.png b/assets/images/logos/blackrock-logo.png
new file mode 100644
index 0000000..e215dca
Binary files /dev/null and b/assets/images/logos/blackrock-logo.png differ
diff --git a/assets/images/logos/blueyonder-logo.png b/assets/images/logos/blueyonder-logo.png
new file mode 100644
index 0000000..5a66c7d
Binary files /dev/null and b/assets/images/logos/blueyonder-logo.png differ
diff --git a/assets/images/logos/carto-logo.png b/assets/images/logos/carto-logo.png
new file mode 100644
index 0000000..29b803f
Binary files /dev/null and b/assets/images/logos/carto-logo.png differ
diff --git a/assets/images/logos/cloudera-logo.png b/assets/images/logos/cloudera-logo.png
new file mode 100644
index 0000000..762c1bb
Binary files /dev/null and b/assets/images/logos/cloudera-logo.png differ
diff --git a/assets/images/logos/coalesce-logo.png b/assets/images/logos/coalesce-logo.png
new file mode 100644
index 0000000..0267fa4
Binary files /dev/null and b/assets/images/logos/coalesce-logo.png differ
diff --git a/assets/images/logos/cogniti-logo.png b/assets/images/logos/cogniti-logo.png
new file mode 100644
index 0000000..a3a7be7
Binary files /dev/null and b/assets/images/logos/cogniti-logo.png differ
diff --git a/assets/images/logos/collate-logo.png b/assets/images/logos/collate-logo.png
new file mode 100644
index 0000000..78d4961
Binary files /dev/null and b/assets/images/logos/collate-logo.png differ
diff --git a/assets/images/logos/collibra-logo.png b/assets/images/logos/collibra-logo.png
new file mode 100644
index 0000000..2011cac
Binary files /dev/null and b/assets/images/logos/collibra-logo.png differ
diff --git a/assets/images/logos/count-logo.png b/assets/images/logos/count-logo.png
new file mode 100644
index 0000000..d304779
Binary files /dev/null and b/assets/images/logos/count-logo.png differ
diff --git a/assets/images/logos/credible-logo.png b/assets/images/logos/credible-logo.png
new file mode 100644
index 0000000..8016f7e
Binary files /dev/null and b/assets/images/logos/credible-logo.png differ
diff --git a/assets/images/logos/cube-logo.png b/assets/images/logos/cube-logo.png
new file mode 100644
index 0000000..46e58c9
Binary files /dev/null and b/assets/images/logos/cube-logo.png differ
diff --git a/assets/images/logos/databricks-logo.png b/assets/images/logos/databricks-logo.png
new file mode 100644
index 0000000..7c179ee
Binary files /dev/null and b/assets/images/logos/databricks-logo.png differ
diff --git a/assets/images/logos/datahub-logo.png b/assets/images/logos/datahub-logo.png
new file mode 100644
index 0000000..d5b3fd9
Binary files /dev/null and b/assets/images/logos/datahub-logo.png differ
diff --git a/assets/images/logos/dataiku-logo.png b/assets/images/logos/dataiku-logo.png
new file mode 100644
index 0000000..90e1c98
Binary files /dev/null and b/assets/images/logos/dataiku-logo.png differ
diff --git a/assets/images/logos/dbt-labs-logo.png b/assets/images/logos/dbt-labs-logo.png
new file mode 100644
index 0000000..18f07ec
Binary files /dev/null and b/assets/images/logos/dbt-labs-logo.png differ
diff --git a/assets/images/logos/denodo-logo.png b/assets/images/logos/denodo-logo.png
new file mode 100644
index 0000000..27663c1
Binary files /dev/null and b/assets/images/logos/denodo-logo.png differ
diff --git a/assets/images/logos/domo-logo.png b/assets/images/logos/domo-logo.png
new file mode 100644
index 0000000..2684713
Binary files /dev/null and b/assets/images/logos/domo-logo.png differ
diff --git a/assets/images/logos/dremio-logo.png b/assets/images/logos/dremio-logo.png
new file mode 100644
index 0000000..7a98c68
Binary files /dev/null and b/assets/images/logos/dremio-logo.png differ
diff --git a/assets/images/logos/elementum-logo.png b/assets/images/logos/elementum-logo.png
new file mode 100644
index 0000000..4b8397f
Binary files /dev/null and b/assets/images/logos/elementum-logo.png differ
diff --git a/assets/images/logos/entropy-data-logo.svg b/assets/images/logos/entropy-data-logo.svg
new file mode 100644
index 0000000..129e35d
--- /dev/null
+++ b/assets/images/logos/entropy-data-logo.svg
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ width="2607.2561"
+ height="633.54077"
+ viewBox="0 0 2607.2561 633.54077"
+ version="1.1"
+ xml:space="preserve"
+ style="clip-rule:evenodd;fill-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2"
+ id="svg21"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"><g
+ id="g4"
+ transform="translate(-640.395,-216.60425)"><path
+ d="M 1189.548,346.133 972.371,220.751 c -20.411,-11.771 -45.898,2.916 -45.898,26.459 v 112.098 l 120.09,69.333 c 14.255,8.208 23.003,23.327 23.003,39.742 v 303.789 l 120.09,-69.333 c 14.255,-8.208 23.003,-23.327 23.003,-39.742 v -277.33 c 0,-16.415 -8.748,-31.534 -23.003,-39.742 z"
+ style="fill:url(#_Linear1);fill-rule:nonzero"
+ id="path1" /><path
+ d="M 1046.455,428.749 829.278,303.367 c -20.411,-11.771 -45.898,2.916 -45.898,26.459 v 112.098 l 79.484,45.898 40.606,23.435 c 1.728,0.972 3.456,2.16 5.076,3.348 1.62,1.188 3.132,2.592 4.536,3.996 8.424,8.532 13.391,20.087 13.391,32.398 v 299.037 c 5.292,0 10.583,-1.404 15.335,-4.104 l 127.758,-73.76 V 468.383 c 0,-16.415 -8.748,-31.534 -23.003,-39.742 z"
+ style="fill:url(#_Linear2);fill-rule:nonzero"
+ id="path2" /><path
+ d="m 924.313,850.037 c -1.728,-0.108 -3.564,-0.432 -5.292,-0.864 1.728,0.432 3.456,0.756 5.292,0.864 z"
+ style="fill:#4d9b3a;fill-rule:nonzero"
+ id="path3" /><path
+ d="m 926.473,551.107 c 0,-12.311 -4.968,-23.867 -13.391,-32.398 -1.404,-1.404 -2.916,-2.7 -4.536,-3.996 -1.62,-1.296 -3.24,-2.376 -5.076,-3.348 L 862.864,487.93 686.293,385.983 c -20.411,-11.771 -45.898,2.916 -45.898,26.459 v 250.764 c 0,16.415 8.748,31.534 23.003,39.742 l 120.09,69.333 127.758,73.76 c 4.752,2.7 10.044,4.104 15.335,4.104 V 551.108 h -0.108 z"
+ style="fill:url(#_Linear3);fill-rule:nonzero"
+ id="path4" /></g><path
+ d="m 714.08,418.20075 v -235.265 h 146.77 v 39.948 H 758.98 v 56.843 h 94.215 v 39.316 H 758.98 v 59.211 h 102.165 v 39.948 H 714.081 Z"
+ style="fill-rule:nonzero"
+ id="path5" /><path
+ d="m 943.358,316.04175 v 102.159 h -44.163 v -176.528 h 41.661 l 0.589,36.474 c 4.613,-12.316 11.139,-21.842 19.579,-28.579 8.44,-6.737 18.99,-10.105 31.65,-10.105 17.076,0 30.767,5.895 41.072,17.684 10.305,11.79 15.457,28.053 15.457,48.79 v 112.264 h -44.163 v -104.054 c 0,-10.947 -2.625,-19.526 -7.876,-25.737 -5.251,-6.211 -12.537,-9.316 -21.861,-9.316 -9.422,0 -17.101,3.237 -23.039,9.711 -5.938,6.474 -8.906,15.553 -8.906,27.237 z"
+ style="fill-rule:nonzero"
+ id="path6" /><path
+ d="m 1171.606,241.67275 v 36.158 h -30.767 v 88.738 c 0,10.947 5.005,16.421 15.016,16.421 1.668,0 3.999,-0.237 6.993,-0.711 2.993,-0.474 5.324,-0.921 6.993,-1.342 l 6.33,35.527 c -4.907,1.579 -9.79,2.684 -14.648,3.316 -4.858,0.632 -9.495,0.947 -13.911,0.947 -16.488,0 -29.099,-4.29 -37.833,-12.869 -8.735,-8.579 -13.102,-20.974 -13.102,-37.185 v -92.843 h -22.671 v -36.158 h 22.671 v -42 h 44.163 v 42 h 30.767 z"
+ style="fill-rule:nonzero"
+ id="path7" /><path
+ d="m 1203.327,418.20075 v -176.528 h 42.691 v 30.79 h 1.767 c 3.042,-10.842 8.121,-19.079 15.236,-24.711 7.115,-5.632 15.285,-8.447 24.511,-8.447 5.005,0 9.765,0.526 14.279,1.579 v 42.316 c -1.963,-0.632 -4.833,-1.184 -8.612,-1.658 -3.778,-0.474 -7.287,-0.711 -10.526,-0.711 -10.207,0 -18.622,3.421 -25.247,10.263 -6.625,6.842 -9.937,15.737 -9.937,26.684 v 100.422 h -44.163 z"
+ style="fill-rule:nonzero"
+ id="path8" /><path
+ d="m 1395.361,421.67375 c -16.488,0 -30.767,-3.816 -42.838,-11.447 -12.071,-7.632 -21.37,-18.263 -27.897,-31.895 -6.526,-13.632 -9.79,-29.5 -9.79,-47.606 0,-18.211 3.263,-34.158 9.79,-47.843 6.526,-13.684 15.825,-24.342 27.897,-31.974 12.071,-7.632 26.351,-11.447 42.838,-11.447 16.488,0 30.767,3.816 42.838,11.447 12.071,7.632 21.37,18.29 27.897,31.974 6.526,13.684 9.79,29.632 9.79,47.843 0,18.105 -3.263,33.974 -9.79,47.606 -6.526,13.632 -15.825,24.263 -27.897,31.895 -12.071,7.632 -2 [...]
+ style="fill-rule:nonzero"
+ id="path9" /><path
+ d="m 1509.668,484.20075 v -242.529 h 43.427 v 29.684 h 2.061 c 1.963,-4.632 4.833,-9.421 8.612,-14.369 3.778,-4.947 8.784,-9.105 15.016,-12.474 6.232,-3.368 14.01,-5.053 23.333,-5.053 12.169,0 23.308,3.368 33.417,10.105 10.108,6.737 18.181,16.842 24.216,30.316 6.036,13.474 9.053,30.263 9.053,50.369 0,19.579 -2.944,36.132 -8.833,49.658 -5.888,13.526 -13.887,23.79 -23.995,30.79 -10.108,7 -21.493,10.5 -34.153,10.5 -8.931,0 -16.488,-1.632 -22.671,-4.895 -6.183,-3.263 -11.213,-7.29 -15.0 [...]
+ style="fill-rule:nonzero"
+ id="path10" /><path
+ d="m 1696.108,480.72775 10.158,-35.685 5.447,1.421 c 8.931,2.632 16.242,2.447 21.934,-0.553 5.692,-3 9.029,-8.921 10.01,-17.763 l 1.178,-9.474 -61.829,-177.002 h 46.96 l 27.676,91.58 c 2.257,7.684 4.171,15.342 5.741,22.974 1.57,7.632 3.141,15.342 4.711,23.132 1.767,-7.895 3.607,-15.658 5.52,-23.29 1.914,-7.632 4.048,-15.237 6.404,-22.816 l 28.853,-91.58 h 46.372 l -69.925,197.37 c -5.005,14.211 -12.194,25.5 -21.566,33.869 -9.372,8.368 -22.302,12.553 -38.79,12.553 -5.888,0 -11.384,-0 [...]
+ style="fill-rule:nonzero"
+ id="path11" /><path
+ d="m 2034.393,418.20075 h -77.139 v -235.265 h 77.875 c 21.984,0 40.9,4.711 56.75,14.132 15.85,9.421 28.044,22.895 36.582,40.421 8.538,17.526 12.807,38.5 12.807,62.922 0,24.527 -4.269,45.579 -12.807,63.158 -8.538,17.579 -20.806,31.079 -36.803,40.5 -15.997,9.421 -35.085,14.132 -57.265,14.132 z m -32.239,-41.527 h 30.031 c 21.1,0 37.097,-6.105 47.991,-18.316 10.894,-12.211 16.34,-31.527 16.34,-57.948 0,-26.316 -5.422,-45.553 -16.267,-57.711 -10.845,-12.158 -26.768,-18.237 -47.77,-18.2 [...]
+ style="fill-rule:nonzero"
+ id="path12" /><path
+ d="m 2222.894,421.67375 c -15.703,0 -28.755,-4.447 -39.158,-13.342 -10.403,-8.895 -15.604,-22.079 -15.604,-39.553 0,-13.158 2.944,-23.474 8.833,-30.948 5.888,-7.474 13.543,-12.947 22.965,-16.421 9.422,-3.474 19.53,-5.737 30.325,-6.79 14.132,-1.474 24.314,-3.026 30.546,-4.658 6.232,-1.632 9.348,-5.342 9.348,-11.132 v -0.789 c 0,-7.474 -2.233,-13.263 -6.698,-17.369 -4.465,-4.105 -10.82,-6.158 -19.064,-6.158 -8.538,0 -15.408,1.974 -20.61,5.921 -5.201,3.947 -8.685,8.763 -10.452,14.448 l [...]
+ style="fill-rule:nonzero"
+ id="path13" /><path
+ d="m 2436.715,241.67275 v 36.158 h -30.767 v 88.738 c 0,10.947 5.005,16.421 15.016,16.421 1.668,0 3.999,-0.237 6.993,-0.711 2.993,-0.474 5.324,-0.921 6.993,-1.342 l 6.33,35.527 c -4.907,1.579 -9.79,2.684 -14.648,3.316 -4.858,0.632 -9.495,0.947 -13.911,0.947 -16.488,0 -29.099,-4.29 -37.833,-12.869 -8.735,-8.579 -13.102,-20.974 -13.102,-37.185 v -92.843 h -22.671 v -36.158 h 22.671 v -42 h 44.163 v 42 h 30.767 z"
+ style="fill-rule:nonzero"
+ id="path14" /><path
+ d="m 2515.838,421.67375 c -15.703,0 -28.755,-4.447 -39.158,-13.342 -10.403,-8.895 -15.604,-22.079 -15.604,-39.553 0,-13.158 2.944,-23.474 8.833,-30.948 5.888,-7.474 13.543,-12.947 22.965,-16.421 9.422,-3.474 19.53,-5.737 30.325,-6.79 14.132,-1.474 24.314,-3.026 30.546,-4.658 6.232,-1.632 9.348,-5.342 9.348,-11.132 v -0.789 c 0,-7.474 -2.233,-13.263 -6.698,-17.369 -4.465,-4.105 -10.82,-6.158 -19.064,-6.158 -8.538,0 -15.408,1.974 -20.61,5.921 -5.201,3.947 -8.685,8.763 -10.452,14.448 l [...]
+ style="fill-rule:nonzero"
+ id="path15" /><defs
+ id="defs21"><linearGradient
+ id="_Linear1"
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-555.56776,555.56776,0,1069.5657,772.17235)"><stop
+ offset="0"
+ style="stop-color:#86198f;stop-opacity:1"
+ id="stop15" /><stop
+ offset="1"
+ style="stop-color:#86198f;stop-opacity:1"
+ id="stop16" /></linearGradient><linearGradient
+ id="_Linear2"
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-550.81599,550.81599,0,926.47275,850.03651)"><stop
+ offset="0"
+ style="stop-color:#c026d3;stop-opacity:1"
+ id="stop17" /><stop
+ offset="1"
+ style="stop-color:#d946ef;stop-opacity:1"
+ id="stop18" /></linearGradient><linearGradient
+ id="_Linear3"
+ x1="0"
+ y1="0"
+ x2="1"
+ y2="0"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0,-468.30807,468.30807,0,783.48781,850.1445)"><stop
+ offset="0"
+ style="stop-color:#d946ef;stop-opacity:1"
+ id="stop19" /><stop
+ offset="0.39"
+ style="stop-color:#e570f7;stop-opacity:1"
+ id="stop20" /><stop
+ offset="1"
+ style="stop-color:#e879f9;stop-opacity:1"
+ id="stop21" /></linearGradient></defs></svg>
diff --git a/assets/images/logos/firebolt-logo.png b/assets/images/logos/firebolt-logo.png
new file mode 100644
index 0000000..3751666
Binary files /dev/null and b/assets/images/logos/firebolt-logo.png differ
diff --git a/assets/images/logos/gooddata-logo.svg b/assets/images/logos/gooddata-logo.svg
new file mode 100644
index 0000000..0febe35
--- /dev/null
+++ b/assets/images/logos/gooddata-logo.svg
@@ -0,0 +1,4 @@
+<svg width="942" height="334" viewBox="0 0 942 334" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M233.631 188.407C233.147 167.701 221.729 151.266 204.297 144.842V108.804C199.896 105.988 195.211 103.659 190.322 101.869V179.399C190.322 194.757 183.205 201.615 171.766 201.615C160.631 201.615 151.316 193.196 151.316 179.116C151.316 163.401 163.552 153.803 179.574 153.803C181.058 153.776 182.569 153.854 184.053 154.086V140.366C182.569 140.11 181.084 139.983 179.574 140.009C155.795 140.009 137.163 154.601 137.163 179.146C137.163 202.746 153.978 215.338 172.715 215.338C181.596 215 [...]
+<path d="M255.898 165.692C255.898 142.476 273 123.79 297.01 121.976C298.256 121.861 299.501 121.861 300.86 121.861C302.105 121.861 303.465 121.861 304.599 121.976C321.246 123.221 332.233 132.394 336.423 137.943L325.325 146.891C320.341 140.323 312.527 135.339 300.864 135.228C283.651 135.228 271.644 148.365 271.644 165.578C271.644 182.905 283.647 196.268 300.864 196.268C310.151 196.154 317.4 193.549 322.38 189.814V175.091H300.295V162.179H337.214V196.494C330.305 202.948 318.187 209.631 300. [...]
+</svg>
diff --git a/assets/images/logos/google-logo.png b/assets/images/logos/google-logo.png
new file mode 100644
index 0000000..23fd7f2
Binary files /dev/null and b/assets/images/logos/google-logo.png differ
diff --git a/assets/images/logos/gravity-logo.svg b/assets/images/logos/gravity-logo.svg
new file mode 100644
index 0000000..0fa41ea
--- /dev/null
+++ b/assets/images/logos/gravity-logo.svg
@@ -0,0 +1,10 @@
+<svg width="920" height="440" viewBox="0 0 92 44" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <path d="M85.9303 26.6483L82.762 18.4809H84.1471L86.6467 24.9607L89.0667 18.4809H90.4518L86.7104 27.9698C86.2009 29.2753 85.8984 29.7848 84.7521 29.7848H83.1919V28.5907H84.3541C85.1024 28.5907 85.2298 28.3996 85.5323 27.6354L85.9303 26.6483Z" fill="#101113" />
+ <path d="M79.3817 24.4838V19.6757H77.917V18.4816H79.3817V16.2049H80.6872V18.4816H82.7888V19.6757H80.6872V24.4679C80.6872 25.1525 80.926 25.4072 81.6266 25.4072H82.9161V26.6013H81.4992C79.9389 26.6013 79.3817 25.9167 79.3817 24.4838Z" fill="#101113" />
+ <path d="M76.8324 17.1119C76.3547 17.1119 75.9886 16.7616 75.9886 16.268C75.9886 15.7745 76.3547 15.4242 76.8324 15.4242C77.31 15.4242 77.6762 15.7745 77.6762 16.268C77.6762 16.7616 77.31 17.1119 76.8324 17.1119ZM76.1637 26.6007V18.4811H77.4692V26.6007H76.1637Z" fill="#101113" />
+ <path d="M71.0478 26.6006L68.0069 18.4809H69.4079L71.8597 25.1199L74.2956 18.4809H75.6648L72.6239 26.6006H71.0478Z" fill="#101113" />
+ <path d="M68.1781 25.408H68.5921V26.6021H67.8756C66.793 26.6021 66.4268 26.1404 66.4109 25.3443C65.9014 26.0767 65.0895 26.6976 63.6884 26.6976C61.9053 26.6976 60.6953 25.806 60.6953 24.3254C60.6953 22.7014 61.8257 21.7939 63.9591 21.7939H66.3472V21.2367C66.3472 20.1859 65.5989 19.5491 64.3253 19.5491C63.179 19.5491 62.4148 20.0904 62.2555 20.9183H60.95C61.1411 19.3262 62.4307 18.3869 64.389 18.3869C66.4587 18.3869 67.6527 19.4217 67.6527 21.3163V24.8667C67.6527 25.2966 67.812 25.408 [...]
+ <path d="M60.2537 18.4809H60.6199V19.7546H59.9672C58.2636 19.7546 57.8019 21.1715 57.8019 22.4611V26.6006H56.4964V18.4809H57.6268L57.8019 19.7068C58.184 19.0859 58.8049 18.4809 60.2537 18.4809Z" fill="#101113" />
+ <path d="M50.0959 26.6964C47.0072 26.6964 44.8579 24.4038 44.8579 21.0286C44.8579 17.6533 46.9436 15.3607 50.1755 15.3607C52.6432 15.3607 54.506 16.7936 54.8881 19.0862H53.4075C53.0254 17.5419 51.8313 16.6344 50.1437 16.6344C47.8033 16.6344 46.2749 18.4494 46.2749 21.0286C46.2749 23.6078 47.8033 25.4228 50.1118 25.4228C52.1656 25.4228 53.6463 24.1968 53.6463 22.2226V21.8405H50.3029V20.5669H54.9995V26.6009H53.8055L53.71 24.977C53.2005 25.7889 52.0064 26.6964 50.0959 26.6964Z" fill="#1 [...]
+ <path d="M25.3813 17.6506L33.6766 3.99681L32.4705 3.28336L25.529 14.8707C25.529 14.8707 25.0009 15.7933 23.7813 15.4365C22.7721 15.1413 22.649 14.5263 22.649 14.108V0.85498H21.3228V14.12C21.3228 14.12 21.3936 15.1167 20.7044 15.3381C20.0445 15.5501 19.6952 15.4365 19.3014 14.7969C18.9075 14.1572 14.1568 5.98953 14.1568 5.98953L13.0245 6.70298L18.0706 15.4365C18.0706 15.4365 18.4644 16.1254 17.7506 16.888C17.0368 17.6506 16.2245 17.1094 16.2245 17.1094L1.70153 8.15447L1 9.33844L15.535 [...]
+ </svg>
diff --git a/assets/images/logos/hex-logo.png b/assets/images/logos/hex-logo.png
new file mode 100644
index 0000000..b2460ce
Binary files /dev/null and b/assets/images/logos/hex-logo.png differ
diff --git a/assets/images/logos/honeydew-logo.png b/assets/images/logos/honeydew-logo.png
new file mode 100644
index 0000000..9bd1f9e
Binary files /dev/null and b/assets/images/logos/honeydew-logo.png differ
diff --git a/assets/images/logos/informatica-logo.png b/assets/images/logos/informatica-logo.png
new file mode 100644
index 0000000..9dd9555
Binary files /dev/null and b/assets/images/logos/informatica-logo.png differ
diff --git a/assets/images/logos/instacart-logo.png b/assets/images/logos/instacart-logo.png
new file mode 100644
index 0000000..f75ea5d
Binary files /dev/null and b/assets/images/logos/instacart-logo.png differ
diff --git a/assets/images/logos/jetbrains-logo.png b/assets/images/logos/jetbrains-logo.png
new file mode 100644
index 0000000..f2e6239
Binary files /dev/null and b/assets/images/logos/jetbrains-logo.png differ
diff --git a/assets/images/logos/kyvos-logo.svg b/assets/images/logos/kyvos-logo.svg
new file mode 100644
index 0000000..a9b91be
--- /dev/null
+++ b/assets/images/logos/kyvos-logo.svg
@@ -0,0 +1,10 @@
+<svg width="1488" height="502" viewBox="0 0 1488 502" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_3594_69)">
+<path d="M530.867 110.015C536.518 108.28 542.043 108.314 547.283 110.445C554.24 113.274 559.141 118.067 561.745 124.687C563.858 128.777 564.908 133.328 564.706 138.204V138.205C564.592 140.955 563.988 144.187 562.249 147.262C561.773 148.905 561.197 150.56 560.52 152.227L518.566 255.392L492.943 318.839C492.425 320.132 491.852 321.389 491.231 322.612L427.66 478.94C424.166 487.533 419.016 493.964 412.012 497.727C404.805 501.873 397.084 502.3 389.232 499.107C382.362 496.314 377.653 490.598 37 [...]
+</g>
+<defs>
+<clipPath id="clip0_3594_69">
+<rect width="1488" height="502" fill="white"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/assets/images/logos/lightdash-logo.png b/assets/images/logos/lightdash-logo.png
new file mode 100644
index 0000000..994156f
Binary files /dev/null and b/assets/images/logos/lightdash-logo.png differ
diff --git a/assets/images/logos/metabase-logo.png b/assets/images/logos/metabase-logo.png
new file mode 100644
index 0000000..1606c98
Binary files /dev/null and b/assets/images/logos/metabase-logo.png differ
diff --git a/assets/images/logos/mistral-ai-logo.png b/assets/images/logos/mistral-ai-logo.png
new file mode 100644
index 0000000..a3c6327
Binary files /dev/null and b/assets/images/logos/mistral-ai-logo.png differ
diff --git a/assets/images/logos/omni-logo.png b/assets/images/logos/omni-logo.png
new file mode 100644
index 0000000..4e4ee4c
Binary files /dev/null and b/assets/images/logos/omni-logo.png differ
diff --git a/assets/images/logos/oracle-logo.png b/assets/images/logos/oracle-logo.png
new file mode 100644
index 0000000..6b23b40
Binary files /dev/null and b/assets/images/logos/oracle-logo.png differ
diff --git a/assets/images/logos/preset-logo.png b/assets/images/logos/preset-logo.png
new file mode 100644
index 0000000..ff35dea
Binary files /dev/null and b/assets/images/logos/preset-logo.png differ
diff --git a/assets/images/logos/puppygraph-logo.png b/assets/images/logos/puppygraph-logo.png
new file mode 100644
index 0000000..d735c7f
Binary files /dev/null and b/assets/images/logos/puppygraph-logo.png differ
diff --git a/assets/images/logos/qlik-logo.png b/assets/images/logos/qlik-logo.png
new file mode 100644
index 0000000..cbbcd43
Binary files /dev/null and b/assets/images/logos/qlik-logo.png differ
diff --git a/assets/images/logos/relationalai-logo.png b/assets/images/logos/relationalai-logo.png
new file mode 100644
index 0000000..6215fe5
Binary files /dev/null and b/assets/images/logos/relationalai-logo.png differ
diff --git a/assets/images/logos/saal-logo.png b/assets/images/logos/saal-logo.png
new file mode 100644
index 0000000..a4c46e1
Binary files /dev/null and b/assets/images/logos/saal-logo.png differ
diff --git a/assets/images/logos/saiku-logo.svg b/assets/images/logos/saiku-logo.svg
new file mode 100644
index 0000000..2805c5e
--- /dev/null
+++ b/assets/images/logos/saiku-logo.svg
@@ -0,0 +1,26 @@
+<svg viewBox="70 40 159 61" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_15_9)">
+<g clip-path="url(#clip1_15_9)">
+<path d="M84.7399 49.3761C82.737 49.7076 80.5269 51.4204 79.5737 53.3957C78.5239 55.5921 78.6483 58.3133 79.9053 60.2886C80.4716 61.1588 81.7839 62.3744 82.6127 62.8026C83.9664 63.4932 84.0769 63.4932 90.1686 63.5761L95.9425 63.659L96.5503 64.2945C97.5725 65.3857 97.4897 66.5184 96.3017 67.2919L95.7353 67.6649L88.0689 67.734C82.364 67.7892 80.3059 67.8444 80.0987 67.9688C79.256 68.4523 78.7173 69.5988 78.8554 70.5795C78.966 71.4083 79.256 71.9332 79.8638 72.3891L80.3611 72.7758L88.4833 7 [...]
+<path d="M107.739 49.4312C105.667 50.1633 105.474 53.3127 107.435 54.2106C107.974 54.4454 108.43 54.4731 114.301 54.4731C120.157 54.4731 120.627 54.4869 121.069 54.7355C122.464 55.4676 122.547 57.1667 121.249 58.1612L120.751 58.548L115.143 58.6171C109.811 58.6861 109.493 58.6999 108.803 58.99C105.46 60.3437 103.678 63.6174 104.355 67.1813C104.797 69.5158 106.924 71.8364 109.286 72.5685C110.129 72.831 110.612 72.8448 118.762 72.8448L127.354 72.8586L127.396 64.5982C127.423 59.3906 127.382 [...]
+<path d="M130.876 61.0346V72.845H133.432H135.987V61.0346V49.2241H133.432H130.876V61.0346Z" fill="#B0182A"/>
+<path d="M139.303 61.062V72.9138H141.858H144.414V69.3361C144.414 65.9933 144.427 65.7722 144.662 65.869C144.786 65.9104 147.798 67.4989 151.348 69.4052C157.37 72.6098 157.854 72.8447 158.517 72.8447C160.368 72.8447 161.528 70.9247 160.727 69.1842C160.589 68.8802 160.354 68.5349 160.216 68.4106C160.078 68.2863 157.37 66.8082 154.221 65.1092C146.568 61.0066 146.9 61.1863 146.9 61.0895C146.9 61.0343 147.48 60.6751 148.185 60.3021C148.875 59.9292 151.693 58.4236 154.428 56.9593C157.163 55.49 [...]
+<path d="M163.227 56.2272C163.296 64.1284 163.269 63.9903 164.374 66.2972C165.99 69.6676 169.029 71.9883 172.745 72.7065C173.988 72.9552 176.488 72.8862 177.787 72.5684C180.052 72.0297 181.71 71.0489 183.519 69.1566C184.79 67.8166 185.549 66.5873 186.157 64.8329L186.613 63.5207L186.655 56.3654L186.696 49.2239H184.21H181.723L181.682 55.8819C181.64 62.388 181.627 62.5676 181.323 63.3825C180.701 65.0678 179.099 66.6977 177.455 67.3193C176.488 67.6923 174.623 67.8305 173.546 67.6094C171.722 [...]
+</g>
+<g clip-path="url(#clip2_15_9)">
+<path d="M205.345 48.1928C200.063 49.3817 196.226 53.1288 195.022 58.2905C194.706 59.6749 194.706 62.6094 195.022 63.9789C195.594 66.4318 196.768 68.5537 198.559 70.4197L199.612 71.5182L199.627 67.4099C199.627 65.1678 199.657 63.3167 199.702 63.3167C199.883 63.3167 200.771 63.8133 201.267 64.1896C201.96 64.7012 202.878 66.176 203.239 67.3498C203.495 68.1624 203.54 68.7493 203.54 70.9915V73.6702L204.518 73.911C205.045 74.0465 205.586 74.1518 205.722 74.1518C205.917 74.1518 205.947 73.3091 [...]
+</g>
+</g>
+<path d="M78.6456 92.1516V85.6062H81.1513C81.6243 85.6062 82.0174 85.6807 82.3306 85.8299C82.646 85.9769 82.8814 86.1782 83.0369 86.4339C83.1946 86.6896 83.2734 86.9794 83.2734 87.3032C83.2734 87.5696 83.2223 87.7976 83.12 87.9872C83.0178 88.1747 82.8803 88.327 82.7077 88.4442C82.5352 88.5614 82.3423 88.6456 82.1293 88.6967V88.7606C82.3615 88.7734 82.5842 88.8448 82.7972 88.9748C83.0124 89.1026 83.1882 89.2837 83.3246 89.5181C83.4609 89.7525 83.5291 90.0358 83.5291 90.3682C83.5291 90.707 [...]
+<defs>
+<clipPath id="clip0_15_9">
+<rect width="142.332" height="26.1516" fill="white" transform="translate(78.8339 48)"/>
+</clipPath>
+<clipPath id="clip1_15_9">
+<rect width="107.951" height="23.7244" fill="white" transform="translate(78.8339 49.2136)"/>
+</clipPath>
+<clipPath id="clip2_15_9">
+<rect width="26.381" height="26.1516" fill="white" transform="translate(194.785 48)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/assets/images/logos/salesforce-logo.png b/assets/images/logos/salesforce-logo.png
new file mode 100644
index 0000000..8e5b95c
Binary files /dev/null and b/assets/images/logos/salesforce-logo.png differ
diff --git a/assets/images/logos/selectstar-logo.png b/assets/images/logos/selectstar-logo.png
new file mode 100644
index 0000000..7125cea
Binary files /dev/null and b/assets/images/logos/selectstar-logo.png differ
diff --git a/assets/images/logos/semantido-logo.png b/assets/images/logos/semantido-logo.png
new file mode 100644
index 0000000..0aedd48
Binary files /dev/null and b/assets/images/logos/semantido-logo.png differ
diff --git a/assets/images/logos/servicenow-logo.png b/assets/images/logos/servicenow-logo.png
new file mode 100644
index 0000000..49884b6
Binary files /dev/null and b/assets/images/logos/servicenow-logo.png differ
diff --git a/assets/images/logos/sigma-logo.png b/assets/images/logos/sigma-logo.png
new file mode 100644
index 0000000..0e0fac1
Binary files /dev/null and b/assets/images/logos/sigma-logo.png differ
diff --git a/assets/images/logos/snowflake-logo.png b/assets/images/logos/snowflake-logo.png
new file mode 100644
index 0000000..cac35da
Binary files /dev/null and b/assets/images/logos/snowflake-logo.png differ
diff --git a/assets/images/logos/starburst-logo.png b/assets/images/logos/starburst-logo.png
new file mode 100644
index 0000000..72e543a
Binary files /dev/null and b/assets/images/logos/starburst-logo.png differ
diff --git a/assets/images/logos/strategy-logo.png b/assets/images/logos/strategy-logo.png
new file mode 100644
index 0000000..45e8ba2
Binary files /dev/null and b/assets/images/logos/strategy-logo.png differ
diff --git a/assets/images/logos/sundial-logo.png b/assets/images/logos/sundial-logo.png
new file mode 100644
index 0000000..64d4c8d
Binary files /dev/null and b/assets/images/logos/sundial-logo.png differ
diff --git a/assets/images/logos/thoughtspot-logo.png b/assets/images/logos/thoughtspot-logo.png
new file mode 100644
index 0000000..8bb0688
Binary files /dev/null and b/assets/images/logos/thoughtspot-logo.png differ
diff --git a/assets/images/logos/veezoo-logo.svg b/assets/images/logos/veezoo-logo.svg
new file mode 100644
index 0000000..1ff5958
--- /dev/null
+++ b/assets/images/logos/veezoo-logo.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 49" width="400" height="77"><style> tspan { white-space:pre } .shp0 { fill: #30c7df } .shp1 { fill: #2c2e35 } </style><g><g><g><path fill-rule="evenodd" class="shp0" d="M189.69 2.59C201.92 2.59 211.82 12.5 211.82 24.73C211.82 36.95 201.92 46.86 189.69 46.86C177.47 46.86 167.56 36.95 167.56 24.73C167.56 12.5 177.47 2.59 189.69 2.59ZM209.34 24.73C209.34 15.22 201.64 7.52 192.14 7.52C182.64 7.52 [...]
\ No newline at end of file
diff --git a/assets/images/logos/wingarc1st-logo.svg b/assets/images/logos/wingarc1st-logo.svg
new file mode 100644
index 0000000..b940374
--- /dev/null
+++ b/assets/images/logos/wingarc1st-logo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 315 140"><defs><style>.cls-1{fill:none;}.cls-2{fill:#8e1d22;}.cls-3{fill:#c02b1f;}.cls-4{fill:#fff;}</style></defs><g id="logo"><g id="ベクトルスマートオブジェクト"><g id="WingArc_logo"><rect class="cls-1" width="315" height="140"/><path d="M257.31,87.79h7.16c1.76,0,3.17-.44,3.7-1.67a4,4,0,0,0-.71-4.27c-.33-.42-4.26-5.82-5.08-7.09a7.85,7.85,0,0,1-.92-6.8c.87-2.44,3-4.27,7-4.27h7.19l-.77,3.71h-6.61a2.86,2.86,0,0,0-2.86,1.89,3.94,3.94,0,0,0,.58,3.56c. [...]
\ No newline at end of file
diff --git a/assets/images/logos/witboost-logo.png b/assets/images/logos/witboost-logo.png
new file mode 100644
index 0000000..e092374
Binary files /dev/null and b/assets/images/logos/witboost-logo.png differ
diff --git a/assets/images/logos/xsolcorp-korea-logo.png b/assets/images/logos/xsolcorp-korea-logo.png
new file mode 100644
index 0000000..7c6f501
Binary files /dev/null and b/assets/images/logos/xsolcorp-korea-logo.png differ
diff --git a/assets/images/logos/zeta-global-logo.png b/assets/images/logos/zeta-global-logo.png
new file mode 100644
index 0000000..ae7617b
Binary files /dev/null and b/assets/images/logos/zeta-global-logo.png differ
diff --git a/assets/images/ossie-logos/Ossie_DarkBlue.svg b/assets/images/ossie-logos/Ossie_DarkBlue.svg
new file mode 100644
index 0000000..322f1fd
--- /dev/null
+++ b/assets/images/ossie-logos/Ossie_DarkBlue.svg
@@ -0,0 +1,15 @@
+<svg width="1534" height="469" viewBox="0 0 1534 469" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<mask id="mask0_3037_35" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="551" height="409">
+<rect width="551" height="408.403" fill="url(#pattern0_3037_35)"/>
+</mask>
+<g mask="url(#mask0_3037_35)">
+<rect x="-28.4331" y="-35.326" width="629.837" height="529.46" fill="#004C82"/>
+</g>
+<path d="M577.14 411.491C552.887 411.491 531.013 406.277 511.52 395.851C492.027 385.197 476.727 370.577 465.62 351.991C454.513 333.177 448.96 312.211 448.96 289.091C448.96 265.971 454.513 245.117 465.62 226.531C476.727 207.717 492.027 193.097 511.52 182.671C531.013 172.017 552.887 166.691 577.14 166.691C601.393 166.691 623.267 172.017 642.76 182.671C662.253 193.097 677.553 207.604 688.66 226.191C699.767 244.777 705.32 265.744 705.32 289.091C705.32 312.437 699.767 333.404 688.66 351.991C6 [...]
+<defs>
+<pattern id="pattern0_3037_35" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_3037_35" transform="scale(0.000781861 0.00105485)"/>
+</pattern>
+<image id="image0_3037_35" width="1279" height="948" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABP8AAAO0CAYAAADappN6AAAQAElEQVR4Aez9CbhsyVkdiK4VsTPPfKe6NajGW1UqSZjZGEmlmicJBJh5MljMiLEBi5k2NMbYDQYEkkoqqSapJMHz0G73R3/2Z+y222CD3+u232e/z22DkKpKNd15nk7m3hFvrciT514JySpJNdy694/KPyPin+KPlad2nlh3Z56EaIFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIHC+I3BB7++RG+54zSPX3/6WB6+7/YF377r5oXdf/bpfuqABic1fUAgE+XdBvdyx2UAgEAgEAoFAIBAIBAKBQCAQCAQCgUDgwkPgFPpbT66Ov/3J0fr3TF+27bvyxV [...]
+</defs>
+</svg>
diff --git a/assets/images/ossie-logos/Ossie_Green.svg b/assets/images/ossie-logos/Ossie_Green.svg
new file mode 100644
index 0000000..309863a
--- /dev/null
+++ b/assets/images/ossie-logos/Ossie_Green.svg
@@ -0,0 +1,15 @@
+<svg width="1534" height="469" viewBox="0 0 1534 469" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<mask id="mask0_3037_34" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="551" height="409">
+<rect width="551" height="408.403" fill="url(#pattern0_3037_34)"/>
+</mask>
+<g mask="url(#mask0_3037_34)">
+<rect x="-28.4331" y="-35.326" width="629.837" height="529.46" fill="#07A77F"/>
+</g>
+<path d="M577.14 411.491C552.887 411.491 531.013 406.277 511.52 395.851C492.027 385.197 476.727 370.577 465.62 351.991C454.513 333.177 448.96 312.211 448.96 289.091C448.96 265.971 454.513 245.117 465.62 226.531C476.727 207.717 492.027 193.097 511.52 182.671C531.013 172.017 552.887 166.691 577.14 166.691C601.393 166.691 623.267 172.017 642.76 182.671C662.253 193.097 677.553 207.604 688.66 226.191C699.767 244.777 705.32 265.744 705.32 289.091C705.32 312.437 699.767 333.404 688.66 351.991C6 [...]
+<defs>
+<pattern id="pattern0_3037_34" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_3037_34" transform="scale(0.000781861 0.00105485)"/>
+</pattern>
+<image id="image0_3037_34" width="1279" height="948" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABP8AAAO0CAYAAADappN6AAAQAElEQVR4Aez9CbhsyVkdiK4VsTPPfKe6NajGW1UqSZjZGEmlmicJBJh5MljMiLEBi5k2NMbYDQYEkkoqqSapJMHz0G73R3/2Z+y222CD3+u232e/z22DkKpKNd15nk7m3hFvrciT514JySpJNdy694/KPyPin+KPlad2nlh3Z56EaIFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIHC+I3BB7++RG+54zSPX3/6WB6+7/YF377r5oXdf/bpfuqABic1fUAgE+XdBvdyx2UAgEAgEAoFAIBAIBAKBQCAQCAQCgUDgwkPgFPpbT66Ov/3J0fr3TF+27bvyxV [...]
+</defs>
+</svg>
diff --git a/assets/images/ossie-logos/Ossie_LightBlue.svg b/assets/images/ossie-logos/Ossie_LightBlue.svg
new file mode 100644
index 0000000..82a4d32
--- /dev/null
+++ b/assets/images/ossie-logos/Ossie_LightBlue.svg
@@ -0,0 +1,15 @@
+<svg width="1534" height="469" viewBox="0 0 1534 469" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<mask id="mask0_3037_33" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="551" height="409">
+<rect width="551" height="408.403" fill="url(#pattern0_3037_33)"/>
+</mask>
+<g mask="url(#mask0_3037_33)">
+<rect x="-28.4331" y="-35.326" width="629.837" height="529.46" fill="#0093C7"/>
+</g>
+<path d="M577.14 411.491C552.887 411.491 531.013 406.277 511.52 395.851C492.027 385.197 476.727 370.577 465.62 351.991C454.513 333.177 448.96 312.211 448.96 289.091C448.96 265.971 454.513 245.117 465.62 226.531C476.727 207.717 492.027 193.097 511.52 182.671C531.013 172.017 552.887 166.691 577.14 166.691C601.393 166.691 623.267 172.017 642.76 182.671C662.253 193.097 677.553 207.604 688.66 226.191C699.767 244.777 705.32 265.744 705.32 289.091C705.32 312.437 699.767 333.404 688.66 351.991C6 [...]
+<defs>
+<pattern id="pattern0_3037_33" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_3037_33" transform="scale(0.000781861 0.00105485)"/>
+</pattern>
+<image id="image0_3037_33" width="1279" height="948" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABP8AAAO0CAYAAADappN6AAAQAElEQVR4Aez9CbhsyVkdiK4VsTPPfKe6NajGW1UqSZjZGEmlmicJBJh5MljMiLEBi5k2NMbYDQYEkkoqqSapJMHz0G73R3/2Z+y222CD3+u232e/z22DkKpKNd15nk7m3hFvrciT514JySpJNdy694/KPyPin+KPlad2nlh3Z56EaIFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIHC+I3BB7++RG+54zSPX3/6WB6+7/YF377r5oXdf/bpfuqABic1fUAgE+XdBvdyx2UAgEAgEAoFAIBAIBAKBQCAQCAQCgUDgwkPgFPpbT66Ov/3J0fr3TF+27bvyxV [...]
+</defs>
+</svg>
diff --git a/assets/images/ossie-logos/logo-full-horizontal.svg b/assets/images/ossie-logos/logo-full-horizontal.svg
new file mode 100644
index 0000000..57e2ae7
--- /dev/null
+++ b/assets/images/ossie-logos/logo-full-horizontal.svg
@@ -0,0 +1,25 @@
+<svg width="3528" height="349" viewBox="0 0 3528 349" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M453 258C440.833 258 429.333 255.833 418.5 251.5C407.833 247.167 398.417 241.083 390.25 233.25C382.25 225.25 376 215.75 371.5 204.75C367 193.583 364.75 181.167 364.75 167.5C364.75 153.833 367 141.5 371.5 130.5C376 119.333 382.25 109.833 390.25 102C398.417 94 407.833 87.8333 418.5 83.5C429.167 79.1667 440.667 77 453 77C465.333 77 476.833 79.1667 487.5 83.5C498.167 87.6667 507.5 93.75 515.5 101.75C523.667 109.583 530 119.083 534.5 130.25C539.167 141.417 541.5 153.833 541.5 167.5C5 [...]
+<path d="M1121.14 258C1109.14 258 1098.23 255.917 1088.39 251.75C1078.56 247.417 1070.73 241.167 1064.89 233C1059.23 224.667 1056.31 214.417 1056.14 202.25H1085.89C1086.06 211.583 1089.31 219.25 1095.64 225.25C1101.98 231.083 1110.39 234 1120.89 234C1130.23 234 1137.73 231.833 1143.39 227.5C1149.06 223.167 1151.89 217.083 1151.89 209.25C1151.89 204.75 1151.14 201 1149.64 198C1148.14 194.833 1145.64 192.083 1142.14 189.75C1138.64 187.25 1133.98 184.917 1128.14 182.75C1122.31 180.417 1114. [...]
+<path d="M2201.07 255V80H2229.57V255H2201.07ZM2259.58 255V131H2287.08L2287.58 148C2291.75 141.5 2297.5 136.583 2304.83 133.25C2312.17 129.75 2319.83 128 2327.83 128C2342.33 128 2354.08 132.583 2363.08 141.75C2372.08 150.917 2376.58 164.417 2376.58 182.25V255H2348.58V185.75C2348.58 175.25 2346.08 167 2341.08 161C2336.08 155 2328.75 152 2319.08 152C2309.42 152 2301.75 155.25 2296.08 161.75C2290.58 168.083 2287.83 176.75 2287.83 187.75V255H2259.58ZM2449.94 255C2437.27 255 2427.6 251.917 242 [...]
+<path fill-rule="evenodd" clip-rule="evenodd" d="M155.763 211.581L155.769 211.576L182.639 238.446L174.154 246.931L161.761 234.539V266.537H149.761V234.531L137.368 246.926L128.882 238.44L155.753 211.57L155.763 211.581ZM155.755 228.537H155.759L155.757 228.535L155.755 228.537Z" fill="#4ABE53"/>
+<path d="M161.761 266.537V254.539C159.831 257.818 151.8 257.631 149.761 254.531V266.537H161.761Z" fill="#04A685"/>
+<path d="M150.556 262.362C154.258 261.318 158.167 261.412 161.822 262.625C171.361 265.79 177.232 275.836 175.596 286.197C173.961 296.563 165.317 304.084 155.314 303.848C145.312 303.617 136.994 295.697 135.798 285.273C134.602 274.844 140.892 265.081 150.556 262.362Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M189.41 191.379L189.409 191.371L226.114 181.536L229.22 193.127L212.292 197.663L240.003 213.662L234.003 224.055L206.285 208.052L210.822 224.982L199.231 228.088L189.396 191.383L189.41 191.379ZM204.091 199.863L204.093 199.86L204.09 199.861L204.091 199.863Z" fill="#4ABE53"/>
+<path d="M240.003 213.662L229.612 207.663C231.487 210.974 227.309 217.836 223.605 218.052L234.003 224.055L240.003 213.662Z" fill="#04A685"/>
+<path d="M230.785 221.279C231.731 217.551 233.768 214.213 236.645 211.654C244.156 204.975 255.791 204.914 263.946 211.511C272.106 218.11 274.297 229.357 269.092 237.901C263.89 246.448 252.872 249.691 243.247 245.515C233.617 241.336 228.307 231.008 230.785 221.279Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M189.408 154.641L189.401 154.638L199.236 117.933L210.827 121.039L206.291 137.967L234.002 121.968L240.002 132.361L212.284 148.364L229.215 152.9L226.109 164.491L189.404 154.656L189.408 154.641ZM204.096 146.17L204.094 146.166L204.094 146.169L204.096 146.17Z" fill="#4ABE53"/>
+<path d="M234.002 121.968L223.612 127.967C227.417 127.999 231.27 135.048 229.605 138.364L240.002 132.361L234.002 121.968Z" fill="#04A685"/>
+<path d="M235.99 133.76C233.234 131.076 231.361 127.644 230.584 123.872C228.555 114.028 234.32 103.921 244.111 100.157C253.906 96.3904 264.741 100.116 269.538 108.896C274.339 117.674 271.639 128.837 263.21 135.085C254.776 141.335 243.176 140.77 235.99 133.76Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M156.223 134.983L156.217 134.988L129.347 108.118L137.832 99.6323L150.225 112.025L150.225 80.0269L162.225 80.0269L162.225 112.033L174.618 99.6382L183.104 108.124L156.234 134.994L156.223 134.983ZM156.231 118.027H156.227L156.229 118.029L156.231 118.027Z" fill="#4ABE53"/>
+<path d="M150.225 80.0269V92.0249C152.155 88.7456 160.186 88.9331 162.225 92.0327V80.0269H150.225Z" fill="#04A685"/>
+<path d="M161.43 84.2015C157.728 85.2459 153.819 85.1515 150.164 83.939C140.625 80.7741 134.754 70.7281 136.39 60.3672C138.025 50.001 146.669 42.4796 156.672 42.7158C166.674 42.9468 174.992 50.867 176.188 61.2909C177.384 71.7201 171.094 81.4826 161.43 84.2015Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M120.737 155.446L120.738 155.453L84.0326 165.288L80.9267 153.697L97.8553 149.161L70.1442 133.162L76.1442 122.77L103.862 138.773L99.3249 121.842L110.916 118.736L120.751 155.442L120.737 155.446ZM106.056 146.961L106.054 146.964L106.057 146.963L106.056 146.961Z" fill="#4ABE53"/>
+<path d="M70.1441 133.162L80.5347 139.161C78.6599 135.85 82.8379 128.988 86.5415 128.773L76.1441 122.77L70.1441 133.162Z" fill="#04A685"/>
+<path d="M79.3622 125.545C78.4158 129.273 76.3795 132.611 73.5019 135.17C65.9913 141.849 54.3559 141.91 46.2009 135.314C38.0413 128.714 35.8496 117.468 41.0554 108.923C46.2566 100.376 57.2745 97.1332 66.8999 101.309C76.5298 105.488 81.8397 115.816 79.3622 125.545Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M122.67 194.164L122.677 194.166L112.842 230.871L101.251 227.766L105.787 210.837L78.0757 226.836L72.0757 216.444L99.7936 200.441L82.8628 195.905L85.9687 184.314L122.674 194.149L122.67 194.164ZM107.982 202.635L107.984 202.638L107.984 202.636L107.982 202.635Z" fill="#4ABE53"/>
+<path d="M78.0756 226.836L88.4663 220.837C84.6612 220.805 80.808 213.756 82.473 210.441L72.0756 216.444L78.0756 226.836Z" fill="#04A685"/>
+<path d="M76.0883 215.045C78.8439 217.728 80.7166 221.161 81.4941 224.932C83.5229 234.776 77.758 244.883 67.9675 248.647C58.1724 252.414 47.3367 248.689 42.54 239.908C37.7387 231.13 40.4391 219.967 48.8685 213.719C57.3024 207.469 68.9018 208.035 76.0883 215.045Z" fill="#0093C7"/>
+<path d="M151.418 150.47C160.094 148.903 168.941 152.13 174.57 158.916C180.198 165.702 181.734 174.993 178.59 183.23C175.446 191.466 168.108 197.37 159.39 198.678C146.185 200.661 133.834 191.675 131.656 178.501C129.477 165.327 138.278 152.844 151.418 150.47Z" fill="#4ABE53"/>
+<path d="M150.445 0.21919C157.753 -0.20331 162.819 -0.38432 169.536 3.27168C179.734 8.82218 189.92 15.0057 199.948 20.8947L254.347 52.7402C265.104 59.0272 275.901 65.2472 286.736 71.3992C291.48 74.1352 299.282 78.2022 303.163 81.6442C315.145 92.2727 312.117 116.466 312.091 131.081L312.053 180.328L312.088 222.504C312.116 261.264 313.604 259.719 280.046 279.384L241.877 301.764C223.389 312.634 205.219 324.149 186.404 334.389C178.984 338.429 169.565 344.909 161.804 347.349L161.328 347.439C15 [...]
+</svg>
diff --git a/assets/images/ossie-logos/logo-icon.svg b/assets/images/ossie-logos/logo-icon.svg
new file mode 100644
index 0000000..1f817e9
--- /dev/null
+++ b/assets/images/ossie-logos/logo-icon.svg
@@ -0,0 +1,22 @@
+<svg width="312" height="349" viewBox="0 0 312 349" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M155.763 211.581L155.769 211.576L182.639 238.446L174.154 246.931L161.761 234.539V266.537H149.761V234.531L137.368 246.926L128.882 238.44L155.753 211.57L155.763 211.581ZM155.755 228.537H155.759L155.757 228.535L155.755 228.537Z" fill="#4ABE53"/>
+<path d="M161.761 266.537V254.539C159.831 257.818 151.8 257.631 149.761 254.531V266.537H161.761Z" fill="#04A685"/>
+<path d="M150.556 262.362C154.258 261.318 158.167 261.412 161.822 262.625C171.361 265.79 177.232 275.836 175.596 286.197C173.961 296.563 165.317 304.084 155.314 303.848C145.312 303.617 136.994 295.697 135.798 285.273C134.602 274.844 140.892 265.081 150.556 262.362Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M189.41 191.379L189.409 191.371L226.114 181.536L229.22 193.127L212.292 197.663L240.003 213.662L234.003 224.055L206.285 208.052L210.822 224.982L199.231 228.088L189.396 191.383L189.41 191.379ZM204.091 199.863L204.093 199.86L204.09 199.861L204.091 199.863Z" fill="#4ABE53"/>
+<path d="M240.003 213.662L229.612 207.663C231.487 210.974 227.309 217.836 223.605 218.052L234.003 224.055L240.003 213.662Z" fill="#04A685"/>
+<path d="M230.785 221.279C231.731 217.551 233.768 214.213 236.645 211.654C244.156 204.975 255.791 204.914 263.946 211.511C272.106 218.11 274.297 229.357 269.092 237.901C263.89 246.448 252.872 249.691 243.247 245.515C233.617 241.336 228.307 231.008 230.785 221.279Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M189.408 154.641L189.401 154.638L199.236 117.933L210.827 121.039L206.291 137.967L234.002 121.968L240.002 132.361L212.284 148.364L229.215 152.9L226.109 164.491L189.404 154.656L189.408 154.641ZM204.096 146.17L204.094 146.166L204.094 146.169L204.096 146.17Z" fill="#4ABE53"/>
+<path d="M234.002 121.968L223.612 127.967C227.417 127.999 231.27 135.048 229.605 138.364L240.002 132.361L234.002 121.968Z" fill="#04A685"/>
+<path d="M235.99 133.76C233.234 131.076 231.361 127.644 230.584 123.872C228.555 114.028 234.32 103.921 244.111 100.157C253.906 96.3904 264.741 100.116 269.538 108.896C274.339 117.674 271.639 128.837 263.21 135.085C254.776 141.335 243.176 140.77 235.99 133.76Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M156.223 134.983L156.217 134.988L129.347 108.118L137.832 99.6323L150.225 112.025L150.225 80.0269L162.225 80.0269L162.225 112.033L174.618 99.6382L183.104 108.124L156.234 134.994L156.223 134.983ZM156.231 118.027H156.227L156.229 118.029L156.231 118.027Z" fill="#4ABE53"/>
+<path d="M150.225 80.0269V92.0249C152.155 88.7456 160.186 88.9331 162.225 92.0327V80.0269H150.225Z" fill="#04A685"/>
+<path d="M161.43 84.2015C157.728 85.2459 153.819 85.1515 150.164 83.939C140.625 80.7741 134.754 70.7281 136.39 60.3672C138.025 50.001 146.669 42.4796 156.672 42.7158C166.674 42.9468 174.992 50.867 176.188 61.2909C177.384 71.7201 171.094 81.4826 161.43 84.2015Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M120.737 155.446L120.738 155.453L84.0326 165.288L80.9267 153.697L97.8553 149.161L70.1442 133.162L76.1442 122.77L103.862 138.773L99.3249 121.842L110.916 118.736L120.751 155.442L120.737 155.446ZM106.056 146.961L106.054 146.964L106.057 146.963L106.056 146.961Z" fill="#4ABE53"/>
+<path d="M70.1441 133.162L80.5347 139.161C78.6599 135.85 82.8379 128.988 86.5415 128.773L76.1441 122.77L70.1441 133.162Z" fill="#04A685"/>
+<path d="M79.3622 125.545C78.4158 129.273 76.3795 132.611 73.5019 135.17C65.9913 141.849 54.3559 141.91 46.2009 135.314C38.0413 128.714 35.8496 117.468 41.0554 108.923C46.2566 100.376 57.2745 97.1332 66.8999 101.309C76.5298 105.488 81.8397 115.816 79.3622 125.545Z" fill="#0093C7"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M122.67 194.164L122.677 194.166L112.842 230.871L101.251 227.766L105.787 210.837L78.0757 226.836L72.0757 216.444L99.7936 200.441L82.8628 195.905L85.9687 184.314L122.674 194.149L122.67 194.164ZM107.982 202.635L107.984 202.638L107.984 202.636L107.982 202.635Z" fill="#4ABE53"/>
+<path d="M78.0756 226.836L88.4663 220.837C84.6612 220.805 80.808 213.756 82.473 210.441L72.0756 216.444L78.0756 226.836Z" fill="#04A685"/>
+<path d="M76.0883 215.045C78.8439 217.728 80.7166 221.161 81.4941 224.932C83.5229 234.776 77.758 244.883 67.9675 248.647C58.1724 252.414 47.3367 248.689 42.54 239.908C37.7387 231.13 40.4391 219.967 48.8685 213.719C57.3024 207.469 68.9018 208.035 76.0883 215.045Z" fill="#0093C7"/>
+<path d="M151.418 150.47C160.094 148.903 168.941 152.13 174.57 158.916C180.198 165.702 181.734 174.993 178.59 183.23C175.446 191.466 168.108 197.37 159.39 198.678C146.185 200.661 133.834 191.675 131.656 178.501C129.477 165.327 138.278 152.844 151.418 150.47Z" fill="#4ABE53"/>
+<path d="M150.445 0.21919C157.753 -0.20331 162.819 -0.38432 169.536 3.27168C179.734 8.82218 189.92 15.0057 199.948 20.8947L254.347 52.7402C265.104 59.0272 275.901 65.2472 286.736 71.3992C291.48 74.1352 299.282 78.2022 303.163 81.6442C315.145 92.2727 312.117 116.466 312.091 131.081L312.053 180.328L312.088 222.504C312.116 261.264 313.604 259.719 280.046 279.384L241.877 301.764C223.389 312.634 205.219 324.149 186.404 334.389C178.984 338.429 169.565 344.909 161.804 347.349L161.328 347.439C15 [...]
+</svg>
diff --git a/assets/images/ossie-logos/logo-mark.svg b/assets/images/ossie-logos/logo-mark.svg
new file mode 100644
index 0000000..2de0eff
--- /dev/null
+++ b/assets/images/ossie-logos/logo-mark.svg
@@ -0,0 +1,14 @@
+<svg width="551" height="409" viewBox="0 0 551 409" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<mask id="mask0_3037_35" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="551" height="409">
+<rect width="551" height="408.403" fill="url(#pattern0_3037_35)"/>
+</mask>
+<g mask="url(#mask0_3037_35)">
+<rect x="-28.4331" y="-35.326" width="629.837" height="529.46" fill="#004C82"/>
+</g>
+<defs>
+<pattern id="pattern0_3037_35" patternContentUnits="objectBoundingBox" width="1" height="1">
+<use xlink:href="#image0_3037_35" transform="scale(0.003367003 0.004545455)"/>
+</pattern>
+<image id="image0_3037_35" width="297" height="220" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASkAAADcCAYAAAAssVecAACDyElEQVR42uy9CZQkV3kmqocWFoPBdEVGZlblvlRWVaslhNSVseSetXRLQh573jl4HT8f4/09PN49w9hG3V1LZlZlZuUaWUu3JDZvM2DjGXvO8zLPy4CPsAFjm8Ub2IBZBAgJJNQdEe/eG/feuDcisroFAiR13HPuyX27GfeL7///7///G27whz/8cd2MnYXi5s7J8h9MMqUFfzX84Q9/PKvGJFOc2c0VvtCN543WvPqFbq70M1q8cKO/Mv7whz++pnExWb7lMF1NH8SKXxOgjG5d+bndhHRZm80bvfBpYyOyfLmRKrxxEpNu8lfZH/7wx1c9xov11Bv [...]
+</defs>
+</svg>
diff --git a/assets/images/ossie-logos/ossie-social-card.png b/assets/images/ossie-logos/ossie-social-card.png
new file mode 100644
index 0000000..1e43b21
Binary files /dev/null and b/assets/images/ossie-logos/ossie-social-card.png differ
diff --git a/assets/javascripts/bundle.d7400e89.min.js b/assets/javascripts/bundle.d7400e89.min.js
new file mode 100644
index 0000000..6308ac3
--- /dev/null
+++ b/assets/javascripts/bundle.d7400e89.min.js
@@ -0,0 +1,16 @@
+"use strict";(()=>{var Zi=Object.create;var _r=Object.defineProperty;var ea=Object.getOwnPropertyDescriptor;var ta=Object.getOwnPropertyNames,Bt=Object.getOwnPropertySymbols,ra=Object.getPrototypeOf,Ar=Object.prototype.hasOwnProperty,bo=Object.prototype.propertyIsEnumerable;var ho=(e,t,r)=>t in e?_r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Ar.call(t,r)&&ho(e,r,t[r]);if(Bt)for(var r of Bt(t))bo.call(t,r)&&ho(e,r,t[r]);return e};var v [...]
+ * escape-html
+ * Copyright(c) 2012-2013 TJ Holowaychuk
+ * Copyright(c) 2015 Andreas Lubbe
+ * Copyright(c) 2015 Tiancheng "Timothy" Gu
+ * MIT Licensed
+ */var qa=/["'&<>]/;Rn.exports=Ka;function Ka(e){var t=""+e,r=qa.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i<t.length;i++){switch(t.charCodeAt(i)){case 34:o=""";break;case 38:o="&";break;case 39:o="'";break;case 60:o="<";break;case 62:o=">";break;default:continue}s!==i&&(n+=t.substring(s,i)),s=i+1,n+=o}return s!==i?n+t.substring(s,i):n}});var ao=Cr((Nt,io)=>{/*!
+ * clipboard.js v2.0.11
+ * https://clipboardjs.com/
+ *
+ * Licensed MIT © Zeno Rocha
+ */(function(t,r){typeof Nt=="object"&&typeof io=="object"?io.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Nt=="object"?Nt.ClipboardJS=r():t.ClipboardJS=r()})(Nt,function(){return(function(){var e={686:(function(o,n,i){"use strict";i.d(n,{default:function(){return Xi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(C){return!1}}var d=function(C){var _=f()(C);return u("cut"),_},v=d;function S(q){va [...]
+`+r.map(function(o,n){return n+1+") "+o.toString()}).join(`
+ `):"",this.name="UnsubscriptionError",this.errors=r}});function Ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var qe=(function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Oe(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(S){t={error:S}} [...]
+//# sourceMappingURL=bundle.d7400e89.min.js.map
+
diff --git a/assets/javascripts/bundle.d7400e89.min.js.map b/assets/javascripts/bundle.d7400e89.min.js.map
new file mode 100644
index 0000000..bd88dc9
--- /dev/null
+++ b/assets/javascripts/bundle.d7400e89.min.js.map
@@ -0,0 +1,7 @@
+{
+ "version": 3,
+ "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subsc [...]
+ "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-vis [...]
+ "mappings": "2rCAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EAAC,SAAUC,EAAQC,EAAS,CAC1B,OAAOH,IAAY,UAAY,OAAOC,IAAW,YAAcE,EAAQ,EACvE,OAAO,QAAW,YAAc,OAAO,IAAM,OAAOA,CAAO,EAC1DA,EAAQ,CACX,GAAEH,IAAO,UAAY,CAAE,aASrB,SAASI,EAA0BC,EAAO,CACxC,IAAIC,EAAmB,GACnBC,EAA0B,GAC1BC,EAAiC,KAEjCC,EAAsB,CACxB,KAAM,GACN,OAAQ,GACR,IAAK,GACL,IAAK,GACL,MAAO,GACP,SAAU,GACV,OAAQ,GACR,KAAM,GACN,MAAO,GACP,KAAM,GACN,KAAM,GACN,SAAU,GACV,iBAAkB,EACpB,EAOA,SAASC,EAAmBC,EAAI,CAC9B,MACE,GAAAA,GACAA,IAAO,UACPA,EAAG,WAAa,QAC [...]
+ "names": ["require_focus_visible", "__commonJSMin", "exports", "module", "global", "factory", "applyFocusVisiblePolyfill", "scope", "hadKeyboardEvent", "hadFocusVisibleRecently", "hadFocusVisibleRecentlyTimeout", "inputTypesAllowlist", "isValidFocusTarget", "el", "focusTriggersKeyboardModality", "type", "tagName", "addFocusVisibleClass", "removeFocusVisibleClass", "onKeyDown", "e", "onPointerDown", "onFocus", "onBlur", "onVisibilityChange", "addInitialPointerMoveListeners", "onInitialP [...]
+}
diff --git a/assets/javascripts/ecosystem.js b/assets/javascripts/ecosystem.js
new file mode 100644
index 0000000..47a42d6
--- /dev/null
+++ b/assets/javascripts/ecosystem.js
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+document.addEventListener("DOMContentLoaded", function () {
+ document.querySelectorAll(".ossie-details-link").forEach(function (btn) {
+ btn.addEventListener("click", function () {
+ var name = btn.getAttribute("data-vendor").toLowerCase().replace(/ /g, "-");
+ var modal = document.getElementById("modal-" + name);
+ if (modal) modal.showModal();
+ });
+ });
+
+ document.querySelectorAll(".ossie-vendor-modal__close").forEach(function (btn) {
+ btn.addEventListener("click", function () {
+ btn.closest("dialog").close();
+ });
+ });
+
+ document.querySelectorAll(".ossie-vendor-modal").forEach(function (modal) {
+ modal.addEventListener("click", function (e) {
+ if (e.target === modal) modal.close();
+ });
+ });
+});
diff --git a/assets/javascripts/home.js b/assets/javascripts/home.js
new file mode 100644
index 0000000..391cbc8
--- /dev/null
+++ b/assets/javascripts/home.js
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+/*
+ * home.js — Animations and interactive effects for the Apache Ossie landing page.
+ *
+ * This script only targets elements with "ossie-" prefixed classes, so it
+ * will not interfere with standard MkDocs docs/blog pages.
+ */
+
+document.addEventListener("DOMContentLoaded", function () {
+
+ var observerOptions = {
+ threshold: 0.1,
+ rootMargin: "0px 0px -50px 0px"
+ };
+
+ var observer = new IntersectionObserver(function (entries) {
+ entries.forEach(function (entry) {
+ if (entry.isIntersecting) {
+ entry.target.style.opacity = "1";
+ entry.target.style.transform = "translateY(0)";
+ }
+ });
+ }, observerOptions);
+
+ var animatedElements = document.querySelectorAll(
+ ".ossie-feature-card, .ossie-involvement-card, .ossie-member-card, " +
+ ".ossie-update-card, .ossie-check-item, .ossie-code-block, .ossie-stat, " +
+ ".ossie-pitch-card, .ossie-class-card, .ossie-wg-card, .ossie-community-bar"
+ );
+
+ animatedElements.forEach(function (el) {
+ el.style.opacity = "0";
+ el.style.transform = "translateY(20px)";
+ el.style.transition = "opacity 0.6s ease, transform 0.6s ease";
+ observer.observe(el);
+ });
+
+ document.body.style.opacity = "0";
+ setTimeout(function () {
+ document.body.style.transition = "opacity 0.5s ease";
+ document.body.style.opacity = "1";
+ }, 100);
+
+});
diff --git a/assets/javascripts/lunr/min/lunr.ar.min.js b/assets/javascripts/lunr/min/lunr.ar.min.js
new file mode 100644
index 0000000..9b06c26
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ar.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ar=function(){this.pipeline.reset(),this.pipeline.add(e.ar.trimmer,e.ar.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.da.min.js b/assets/javascripts/lunr/min/lunr.da.min.js
new file mode 100644
index 0000000..b9d8509
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.da.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Danish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.de.min.js b/assets/javascripts/lunr/min/lunr.de.min.js
new file mode 100644
index 0000000..f3b5c10
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.de.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `German` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.du.min.js b/assets/javascripts/lunr/min/lunr.du.min.js
new file mode 100644
index 0000000..49a0f3f
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.du.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Dutch` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" c [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.el.min.js b/assets/javascripts/lunr/min/lunr.el.min.js
new file mode 100644
index 0000000..ace017b
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.el.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.el=function(){this.pipeline.reset(),void 0===this.searchPipeline&&this.pipeline. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.es.min.js b/assets/javascripts/lunr/min/lunr.es.min.js
new file mode 100644
index 0000000..2989d34
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.es.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Spanish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.fi.min.js b/assets/javascripts/lunr/min/lunr.fi.min.js
new file mode 100644
index 0000000..29f5dfc
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.fi.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Finnish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.fr.min.js b/assets/javascripts/lunr/min/lunr.fr.min.js
new file mode 100644
index 0000000..68cd009
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.fr.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `French` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.he.min.js b/assets/javascripts/lunr/min/lunr.he.min.js
new file mode 100644
index 0000000..b863d3e
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.he.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.he=function(){this.pipeline.reset(),this.pipeline.add(e.he.trimmer,e.he.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.hi.min.js b/assets/javascripts/lunr/min/lunr.hi.min.js
new file mode 100644
index 0000000..7dbc414
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.hi.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.hu.min.js b/assets/javascripts/lunr/min/lunr.hu.min.js
new file mode 100644
index 0000000..ed9d909
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.hu.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Hungarian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.hy.min.js b/assets/javascripts/lunr/min/lunr.hy.min.js
new file mode 100644
index 0000000..b37f792
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.hy.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.it.min.js b/assets/javascripts/lunr/min/lunr.it.min.js
new file mode 100644
index 0000000..344b6a3
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.it.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Italian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ja.min.js b/assets/javascripts/lunr/min/lunr.ja.min.js
new file mode 100644
index 0000000..5f254eb
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ja.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.jp.min.js b/assets/javascripts/lunr/min/lunr.jp.min.js
new file mode 100644
index 0000000..c055eba
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.jp.min.js
@@ -0,0 +1 @@
+module.exports=require("./lunr.ja");
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.kn.min.js b/assets/javascripts/lunr/min/lunr.kn.min.js
new file mode 100644
index 0000000..1cef9be
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.kn.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.kn=function(){this.pipeline.reset(),this.pipeline.add(e.kn.trimmer,e.kn.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ko.min.js b/assets/javascripts/lunr/min/lunr.ko.min.js
new file mode 100644
index 0000000..eaf9dab
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ko.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ko=function(){this.pipeline.reset(),this.pipeline.add(e.ko.trimmer,e.ko.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.multi.min.js b/assets/javascripts/lunr/min/lunr.multi.min.js
new file mode 100644
index 0000000..7debad0
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.multi.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p<t.length;++p)"en"==t[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[t[p]].wordCharacters,e[t[p]].stopWordFilter&&n.unshift(e[t[p]].stopWordFilter),e[t[p]].stemmer&&(n.push(e[t[p]].stemmer),s [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.nl.min.js b/assets/javascripts/lunr/min/lunr.nl.min.js
new file mode 100644
index 0000000..c4a2535
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.nl.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Dutch` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(r,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.nl=function(){this.pipeline.reset(),this.pipeline.add(r.nl.trimmer,r.nl.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.no.min.js b/assets/javascripts/lunr/min/lunr.no.min.js
new file mode 100644
index 0000000..92bc7e4
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.no.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Norwegian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.pt.min.js b/assets/javascripts/lunr/min/lunr.pt.min.js
new file mode 100644
index 0000000..6c16996
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.pt.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Portuguese` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ro.min.js b/assets/javascripts/lunr/min/lunr.ro.min.js
new file mode 100644
index 0000000..7277140
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ro.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Romanian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ru.min.js b/assets/javascripts/lunr/min/lunr.ru.min.js
new file mode 100644
index 0000000..186cc48
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ru.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Russian` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.sa.min.js b/assets/javascripts/lunr/min/lunr.sa.min.js
new file mode 100644
index 0000000..50ee564
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.sa.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.stemmer.support.min.js b/assets/javascripts/lunr/min/lunr.stemmer.support.min.js
new file mode 100644
index 0000000..abd4475
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.stemmer.support.min.js
@@ -0,0 +1 @@
+!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.met [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.sv.min.js b/assets/javascripts/lunr/min/lunr.sv.min.js
new file mode 100644
index 0000000..3e5eb64
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.sv.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Swedish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.ta.min.js b/assets/javascripts/lunr/min/lunr.ta.min.js
new file mode 100644
index 0000000..a644bed
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.ta.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.te.min.js b/assets/javascripts/lunr/min/lunr.te.min.js
new file mode 100644
index 0000000..9fa7a93
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.te.min.js
@@ -0,0 +1 @@
+!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.th.min.js b/assets/javascripts/lunr/min/lunr.th.min.js
new file mode 100644
index 0000000..dee3aac
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.th.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.tr.min.js b/assets/javascripts/lunr/min/lunr.tr.min.js
new file mode 100644
index 0000000..563f6ec
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.tr.min.js
@@ -0,0 +1,18 @@
+/*!
+ * Lunr languages, `Turkish` language
+ * https://github.com/MihaiValentin/lunr-languages
+ *
+ * Copyright 2014, Mihai Valentin
+ * http://www.mozilla.org/MPL/
+ */
+/*!
+ * based on
+ * Snowball JavaScript Library v0.3
+ * http://code.google.com/p/urim/
+ * http://snowball.tartarus.org/
+ *
+ * Copyright 2010, Oleg Mazko
+ * http://www.mozilla.org/MPL/
+ */
+
+!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWord [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.vi.min.js b/assets/javascripts/lunr/min/lunr.vi.min.js
new file mode 100644
index 0000000..22aed28
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.vi.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.t [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/min/lunr.zh.min.js b/assets/javascripts/lunr/min/lunr.zh.min.js
new file mode 100644
index 0000000..fda66e9
--- /dev/null
+++ b/assets/javascripts/lunr/min/lunr.zh.min.js
@@ -0,0 +1 @@
+!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline. [...]
\ No newline at end of file
diff --git a/assets/javascripts/lunr/tinyseg.js b/assets/javascripts/lunr/tinyseg.js
new file mode 100644
index 0000000..167fa6d
--- /dev/null
+++ b/assets/javascripts/lunr/tinyseg.js
@@ -0,0 +1,206 @@
+/**
+ * export the module via AMD, CommonJS or as a browser global
+ * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
+ */
+;(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(factory)
+ } else if (typeof exports === 'object') {
+ /**
+ * Node. Does not work with strict CommonJS, but
+ * only CommonJS-like environments that support module.exports,
+ * like Node.
+ */
+ module.exports = factory()
+ } else {
+ // Browser globals (root is window)
+ factory()(root.lunr);
+ }
+}(this, function () {
+ /**
+ * Just return a value to define the module export.
+ * This example returns an object, but the module
+ * can return a function as the exported value.
+ */
+
+ return function(lunr) {
+ // TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript
+ // (c) 2008 Taku Kudo <ta...@chasen.org>
+ // TinySegmenter is freely distributable under the terms of a new BSD licence.
+ // For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt
+
+ function TinySegmenter() {
+ var patterns = {
+ "[一二三四五六七八九十百千万億兆]":"M",
+ "[一-龠々〆ヵヶ]":"H",
+ "[ぁ-ん]":"I",
+ "[ァ-ヴーア-ン゙ー]":"K",
+ "[a-zA-Za-zA-Z]":"A",
+ "[0-90-9]":"N"
+ }
+ this.chartype_ = [];
+ for (var i in patterns) {
+ var regexp = new RegExp(i);
+ this.chartype_.push([regexp, patterns[i]]);
+ }
+
+ this.BIAS__ = -332
+ this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378};
+ this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920};
+ this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266};
+ this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352};
+ this.BP2__ = {"BO":60,"OO":-1762};
+ this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965};
+ this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146};
+ this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699};
+ this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973};
+ this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741," [...]
+ this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1 [...]
+ this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":65 [...]
+ this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832};
+ this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649};
+ this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393};
+ this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841};
+ this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68};
+ this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591};
+ this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685};
+ this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156};
+ this.TW1__ = {"につい":-4681,"東京都":2026};
+ this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216};
+ this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287};
+ this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865};
+ this.UC1__ = {"A":484,"K":93,"M":645,"O":-505};
+ this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646};
+ this.UC3__ = {"A":-1370,"I":2311};
+ this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646};
+ this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831};
+ this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387};
+ this.UP1__ = {"O":-214};
+ this.UP2__ = {"B":69,"O":935};
+ this.UP3__ = {"B":189};
+ this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422};
+ this.UQ2__ = {"BH":216,"BI":113,"OK":1759};
+ this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212};
+ this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135};
+ this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978, [...]
+ this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":277 [...]
+ this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":14 [...]
+ this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区 [...]
+ this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496};
+
+ return this;
+ }
+ TinySegmenter.prototype.ctype_ = function(str) {
+ for (var i in this.chartype_) {
+ if (str.match(this.chartype_[i][0])) {
+ return this.chartype_[i][1];
+ }
+ }
+ return "O";
+ }
+
+ TinySegmenter.prototype.ts_ = function(v) {
+ if (v) { return v; }
+ return 0;
+ }
+
+ TinySegmenter.prototype.segment = function(input) {
+ if (input == null || input == undefined || input == "") {
+ return [];
+ }
+ var result = [];
+ var seg = ["B3","B2","B1"];
+ var ctype = ["O","O","O"];
+ var o = input.split("");
+ for (i = 0; i < o.length; ++i) {
+ seg.push(o[i]);
+ ctype.push(this.ctype_(o[i]))
+ }
+ seg.push("E1");
+ seg.push("E2");
+ seg.push("E3");
+ ctype.push("O");
+ ctype.push("O");
+ ctype.push("O");
+ var word = seg[3];
+ var p1 = "U";
+ var p2 = "U";
+ var p3 = "U";
+ for (var i = 4; i < seg.length - 3; ++i) {
+ var score = this.BIAS__;
+ var w1 = seg[i-3];
+ var w2 = seg[i-2];
+ var w3 = seg[i-1];
+ var w4 = seg[i];
+ var w5 = seg[i+1];
+ var w6 = seg[i+2];
+ var c1 = ctype[i-3];
+ var c2 = ctype[i-2];
+ var c3 = ctype[i-1];
+ var c4 = ctype[i];
+ var c5 = ctype[i+1];
+ var c6 = ctype[i+2];
+ score += this.ts_(this.UP1__[p1]);
+ score += this.ts_(this.UP2__[p2]);
+ score += this.ts_(this.UP3__[p3]);
+ score += this.ts_(this.BP1__[p1 + p2]);
+ score += this.ts_(this.BP2__[p2 + p3]);
+ score += this.ts_(this.UW1__[w1]);
+ score += this.ts_(this.UW2__[w2]);
+ score += this.ts_(this.UW3__[w3]);
+ score += this.ts_(this.UW4__[w4]);
+ score += this.ts_(this.UW5__[w5]);
+ score += this.ts_(this.UW6__[w6]);
+ score += this.ts_(this.BW1__[w2 + w3]);
+ score += this.ts_(this.BW2__[w3 + w4]);
+ score += this.ts_(this.BW3__[w4 + w5]);
+ score += this.ts_(this.TW1__[w1 + w2 + w3]);
+ score += this.ts_(this.TW2__[w2 + w3 + w4]);
+ score += this.ts_(this.TW3__[w3 + w4 + w5]);
+ score += this.ts_(this.TW4__[w4 + w5 + w6]);
+ score += this.ts_(this.UC1__[c1]);
+ score += this.ts_(this.UC2__[c2]);
+ score += this.ts_(this.UC3__[c3]);
+ score += this.ts_(this.UC4__[c4]);
+ score += this.ts_(this.UC5__[c5]);
+ score += this.ts_(this.UC6__[c6]);
+ score += this.ts_(this.BC1__[c2 + c3]);
+ score += this.ts_(this.BC2__[c3 + c4]);
+ score += this.ts_(this.BC3__[c4 + c5]);
+ score += this.ts_(this.TC1__[c1 + c2 + c3]);
+ score += this.ts_(this.TC2__[c2 + c3 + c4]);
+ score += this.ts_(this.TC3__[c3 + c4 + c5]);
+ score += this.ts_(this.TC4__[c4 + c5 + c6]);
+ // score += this.ts_(this.TC5__[c4 + c5 + c6]);
+ score += this.ts_(this.UQ1__[p1 + c1]);
+ score += this.ts_(this.UQ2__[p2 + c2]);
+ score += this.ts_(this.UQ3__[p3 + c3]);
+ score += this.ts_(this.BQ1__[p2 + c2 + c3]);
+ score += this.ts_(this.BQ2__[p2 + c3 + c4]);
+ score += this.ts_(this.BQ3__[p3 + c2 + c3]);
+ score += this.ts_(this.BQ4__[p3 + c3 + c4]);
+ score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);
+ score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);
+ score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);
+ score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);
+ var p = "O";
+ if (score > 0) {
+ result.push(word);
+ word = "";
+ p = "B";
+ }
+ p1 = p2;
+ p2 = p3;
+ p3 = p;
+ word += seg[i];
+ }
+ result.push(word);
+
+ return result;
+ }
+
+ lunr.TinySegmenter = TinySegmenter;
+ };
+
+}));
\ No newline at end of file
diff --git a/assets/javascripts/lunr/wordcut.js b/assets/javascripts/lunr/wordcut.js
new file mode 100644
index 0000000..0d898c9
--- /dev/null
+++ b/assets/javascripts/lunr/wordcut.js
@@ -0,0 +1,6708 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.lunr || (g.lunr = {})).wordcut = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(! [...]
+var _ = require("underscore");
+
+var Acceptors = {
+ creators: null,
+ current: null,
+ tag: null,
+
+ init: function() {
+ this.creators = [];
+ this.current = [];
+ this.tag = {};
+ },
+
+ reset: function() {
+ this.current = [];
+ this.tag = {}
+ },
+
+ transit: function(ch) {
+ var self = this;
+
+ self.creators.forEach(function(creator) {
+ var acceptor = creator.createAcceptor(self.tag);
+ if (acceptor)
+ self.current.push(acceptor);
+ });
+
+ var _current = [];
+ self.tag = {};
+
+ for (var i = 0; i < self.current.length; i++) {
+ var _acceptor = self.current[i]
+ , acceptor = _acceptor.transit(ch);
+
+ if (!acceptor.isError) {
+ _current.push(acceptor);
+ self.tag[acceptor.tag] = acceptor;
+ }
+ }
+ self.current = _current;
+
+ },
+
+ getFinalAcceptors: function() {
+ return this.current.filter(function(acceptor) {
+ return acceptor.isFinal;
+ });
+ }
+};
+
+module.exports = function() {
+ var acceptors = _.clone(Acceptors);
+ acceptors.init();
+ return acceptors;
+};
+
+},{"underscore":25}],2:[function(require,module,exports){
+(function (__dirname){
+
+var LEFT = 0;
+var RIGHT = 1;
+var path = require("path");
+var glob = require("glob");
+
+var WordcutDict = {
+
+
+ init: function (dictPathFile, withDefault, words) {
+ withDefault = withDefault || false
+ var defaultDict = path.normalize(__dirname + "/..") + "/data/tdict-*.txt";
+ this.dict=[]
+ var dictPathIsDefined = dictPathFile !== undefined
+ var dictPath = (withDefault || !dictPathIsDefined) ? [defaultDict]: [];
+ var dictPathFile = dictPathFile || defaultDict
+
+ if(dictPathIsDefined){
+ if (Array.isArray(dictPathFile)) {
+ dictPath.concat.apply(dictPath, dictPathFile);
+ } else {
+ dictPath.push(dictPathFile)
+ }
+ }
+
+ this.addFiles(dictPath, false)
+
+ if(words!==undefined){
+ this.addWords(words, false)
+ }
+ this.finalizeDict();
+ },
+
+ addWords: function(words, finalize){
+ finalize = finalize===undefined || finalize;
+ this.dict.push.apply(this.dict, words)
+ if(finalize){
+ this.finalizeDict();
+ }
+ },
+
+ finalizeDict: function(){
+ this.dict = this.sortuniq(this.dict);
+ },
+
+ addFiles: function(files, finalize){
+ finalize = finalize===undefined || finalize;
+
+ for (var i = 0; i < 1; i++) {
+ var words = "ก.ก.\nก.ก.น.\nก.ข.ค.\nก.ค.\nก.จ.\nก.ช.น.\nก.ฌ.\nก.ต.\nก.ต.ง.\nก.ต.ช.\nก.ตร.\nก.ท.\nก.น.ช.\nก.บช.\nก.บถ.\nก.ป.ส.\nก.พ.\nก.ม.\nก.ย.\nก.ร.\nก.ล.ต.\nก.ว.\nก.ศ.ว.\nก.ส.ท.\nก.ส.ธ.\nก.ส.อ.\nก.อ.\nกก.ตชด.\nกก.ตร.น.\nกก.ภ.จว.\nกก.รสช.\nกกบ.ขส.ทบ.\nกกล.รพน.\nกง.กห.\nกง.ทบ.\nกง.ทร.\nกซข.ป.\nกซม.ป.\nกทม.กรุงเทพมหานคร\nกบ.ทบ.\nกป.สป.\nกพ.ทบ.\nกพ.ทร.\nกพ.ทหาร\nกร.ทบ.\nกรป.กลาง\nกรอ.พอ.\nกศ.ด.\nกศ.บ.\nกศ.บป.\nกศ.ม.\nกษ.ด.\nกษ.บ.\nกษ.ม.\nกส.ด.\nกส.ทบ.\nกส.บ.\nกส.ม.\nกอ.ปค.\nกอ.รพน.\nก [...]
+ .split(/[\r\n]+/)
+ .filter(function (w) {
+ return w.length > 1;
+ })
+ this.addWords(words, false)
+ }
+ if(finalize){
+ this.finalizeDict();
+ }
+ },
+
+ dictSeek: function (l, r, ch, strOffset, pos) {
+ var ans = null;
+ while (l <= r) {
+ var m = Math.floor((l + r) / 2),
+ dict_item = this.dict[m],
+ len = dict_item.length;
+ if (len <= strOffset) {
+ l = m + 1;
+ } else {
+ var ch_ = dict_item[strOffset];
+ if (ch_ < ch) {
+ l = m + 1;
+ } else if (ch_ > ch) {
+ r = m - 1;
+ } else {
+ ans = m;
+ if (pos == LEFT) {
+ r = m - 1;
+ } else {
+ l = m + 1;
+ }
+ }
+ }
+ }
+ return ans;
+ },
+
+ isFinal: function (acceptor) {
+ return this.dict[acceptor.l].length == acceptor.strOffset;
+ },
+
+ createAcceptor: function () {
+ return {
+ l: 0,
+ r: this.dict.length - 1,
+ strOffset: 0,
+ isFinal: false,
+ dict: this,
+ transit: function (ch) {
+ return this.dict.transit(this, ch);
+ },
+ isError: false,
+ tag: "DICT",
+ w: 1,
+ type: "DICT"
+ };
+ },
+
+ transit: function (acceptor, ch) {
+ var l = this.dictSeek(acceptor.l,
+ acceptor.r,
+ ch,
+ acceptor.strOffset,
+ LEFT);
+ if (l !== null) {
+ var r = this.dictSeek(l,
+ acceptor.r,
+ ch,
+ acceptor.strOffset,
+ RIGHT);
+ acceptor.l = l;
+ acceptor.r = r;
+ acceptor.strOffset++;
+ acceptor.isFinal = this.isFinal(acceptor);
+ } else {
+ acceptor.isError = true;
+ }
+ return acceptor;
+ },
+
+ sortuniq: function(a){
+ return a.sort().filter(function(item, pos, arr){
+ return !pos || item != arr[pos - 1];
+ })
+ },
+
+ flatten: function(a){
+ //[[1,2],[3]] -> [1,2,3]
+ return [].concat.apply([], a);
+ }
+};
+module.exports = WordcutDict;
+
+}).call(this,"/dist/tmp")
+},{"glob":16,"path":22}],3:[function(require,module,exports){
+var WordRule = {
+ createAcceptor: function(tag) {
+ if (tag["WORD_RULE"])
+ return null;
+
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ var lch = ch.toLowerCase();
+ if (lch >= "a" && lch <= "z") {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "WORD_RULE",
+ type: "WORD_RULE",
+ w: 1};
+ }
+};
+
+var NumberRule = {
+ createAcceptor: function(tag) {
+ if (tag["NUMBER_RULE"])
+ return null;
+
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (ch >= "0" && ch <= "9") {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "NUMBER_RULE",
+ type: "NUMBER_RULE",
+ w: 1};
+ }
+};
+
+var SpaceRule = {
+ tag: "SPACE_RULE",
+ createAcceptor: function(tag) {
+
+ if (tag["SPACE_RULE"])
+ return null;
+
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (ch == " " || ch == "\t" || ch == "\r" || ch == "\n" ||
+ ch == "\u00A0" || ch=="\u2003"//nbsp and emsp
+ ) {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: SpaceRule.tag,
+ w: 1,
+ type: "SPACE_RULE"};
+ }
+}
+
+var SingleSymbolRule = {
+ tag: "SINSYM",
+ createAcceptor: function(tag) {
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (this.strOffset == 0 && ch.match(/^[\@\(\)\/\,\-\."`]$/)) {
+ this.isFinal = true;
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "SINSYM",
+ w: 1,
+ type: "SINSYM"};
+ }
+}
+
+
+var LatinRules = [WordRule, SpaceRule, SingleSymbolRule, NumberRule];
+
+module.exports = LatinRules;
+
+},{}],4:[function(require,module,exports){
+var _ = require("underscore")
+ , WordcutCore = require("./wordcut_core");
+var PathInfoBuilder = {
+
+ /*
+ buildByPartAcceptors: function(path, acceptors, i) {
+ var
+ var genInfos = partAcceptors.reduce(function(genInfos, acceptor) {
+
+ }, []);
+
+ return genInfos;
+ }
+ */
+
+ buildByAcceptors: function(path, finalAcceptors, i) {
+ var self = this;
+ var infos = finalAcceptors.map(function(acceptor) {
+ var p = i - acceptor.strOffset + 1
+ , _info = path[p];
+
+ var info = {p: p,
+ mw: _info.mw + (acceptor.mw === undefined ? 0 : acceptor.mw),
+ w: acceptor.w + _info.w,
+ unk: (acceptor.unk ? acceptor.unk : 0) + _info.unk,
+ type: acceptor.type};
+
+ if (acceptor.type == "PART") {
+ for(var j = p + 1; j <= i; j++) {
+ path[j].merge = p;
+ }
+ info.merge = p;
+ }
+
+ return info;
+ });
+ return infos.filter(function(info) { return info; });
+ },
+
+ fallback: function(path, leftBoundary, text, i) {
+ var _info = path[leftBoundary];
+ if (text[i].match(/[\u0E48-\u0E4E]/)) {
+ if (leftBoundary != 0)
+ leftBoundary = path[leftBoundary].p;
+ return {p: leftBoundary,
+ mw: 0,
+ w: 1 + _info.w,
+ unk: 1 + _info.unk,
+ type: "UNK"};
+/* } else if(leftBoundary > 0 && path[leftBoundary].type !== "UNK") {
+ leftBoundary = path[leftBoundary].p;
+ return {p: leftBoundary,
+ w: 1 + _info.w,
+ unk: 1 + _info.unk,
+ type: "UNK"}; */
+ } else {
+ return {p: leftBoundary,
+ mw: _info.mw,
+ w: 1 + _info.w,
+ unk: 1 + _info.unk,
+ type: "UNK"};
+ }
+ },
+
+ build: function(path, finalAcceptors, i, leftBoundary, text) {
+ var basicPathInfos = this.buildByAcceptors(path, finalAcceptors, i);
+ if (basicPathInfos.length > 0) {
+ return basicPathInfos;
+ } else {
+ return [this.fallback(path, leftBoundary, text, i)];
+ }
+ }
+};
+
+module.exports = function() {
+ return _.clone(PathInfoBuilder);
+}
+
+},{"./wordcut_core":8,"underscore":25}],5:[function(require,module,exports){
+var _ = require("underscore");
+
+
+var PathSelector = {
+ selectPath: function(paths) {
+ var path = paths.reduce(function(selectedPath, path) {
+ if (selectedPath == null) {
+ return path;
+ } else {
+ if (path.unk < selectedPath.unk)
+ return path;
+ if (path.unk == selectedPath.unk) {
+ if (path.mw < selectedPath.mw)
+ return path
+ if (path.mw == selectedPath.mw) {
+ if (path.w < selectedPath.w)
+ return path;
+ }
+ }
+ return selectedPath;
+ }
+ }, null);
+ return path;
+ },
+
+ createPath: function() {
+ return [{p:null, w:0, unk:0, type: "INIT", mw:0}];
+ }
+};
+
+module.exports = function() {
+ return _.clone(PathSelector);
+};
+
+},{"underscore":25}],6:[function(require,module,exports){
+function isMatch(pat, offset, ch) {
+ if (pat.length <= offset)
+ return false;
+ var _ch = pat[offset];
+ return _ch == ch ||
+ (_ch.match(/[กข]/) && ch.match(/[ก-ฮ]/)) ||
+ (_ch.match(/[มบ]/) && ch.match(/[ก-ฮ]/)) ||
+ (_ch.match(/\u0E49/) && ch.match(/[\u0E48-\u0E4B]/));
+}
+
+var Rule0 = {
+ pat: "เหก็ม",
+ createAcceptor: function(tag) {
+ return {strOffset: 0,
+ isFinal: false,
+ transit: function(ch) {
+ if (isMatch(Rule0.pat, this.strOffset,ch)) {
+ this.isFinal = (this.strOffset + 1 == Rule0.pat.length);
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "THAI_RULE",
+ type: "THAI_RULE",
+ w: 1};
+ }
+};
+
+var PartRule = {
+ createAcceptor: function(tag) {
+ return {strOffset: 0,
+ patterns: [
+ "แก", "เก", "ก้", "กก์", "กา", "กี", "กิ", "กืก"
+ ],
+ isFinal: false,
+ transit: function(ch) {
+ var offset = this.strOffset;
+ this.patterns = this.patterns.filter(function(pat) {
+ return isMatch(pat, offset, ch);
+ });
+
+ if (this.patterns.length > 0) {
+ var len = 1 + offset;
+ this.isFinal = this.patterns.some(function(pat) {
+ return pat.length == len;
+ });
+ this.strOffset++;
+ } else {
+ this.isError = true;
+ }
+ return this;
+ },
+ isError: false,
+ tag: "PART",
+ type: "PART",
+ unk: 1,
+ w: 1};
+ }
+};
+
+var ThaiRules = [Rule0, PartRule];
+
+module.exports = ThaiRules;
+
+},{}],7:[function(require,module,exports){
+var sys = require("sys")
+ , WordcutDict = require("./dict")
+ , WordcutCore = require("./wordcut_core")
+ , PathInfoBuilder = require("./path_info_builder")
+ , PathSelector = require("./path_selector")
+ , Acceptors = require("./acceptors")
+ , latinRules = require("./latin_rules")
+ , thaiRules = require("./thai_rules")
+ , _ = require("underscore");
+
+
+var Wordcut = Object.create(WordcutCore);
+Wordcut.defaultPathInfoBuilder = PathInfoBuilder;
+Wordcut.defaultPathSelector = PathSelector;
+Wordcut.defaultAcceptors = Acceptors;
+Wordcut.defaultLatinRules = latinRules;
+Wordcut.defaultThaiRules = thaiRules;
+Wordcut.defaultDict = WordcutDict;
+
+
+Wordcut.initNoDict = function(dict_path) {
+ var self = this;
+ self.pathInfoBuilder = new self.defaultPathInfoBuilder;
+ self.pathSelector = new self.defaultPathSelector;
+ self.acceptors = new self.defaultAcceptors;
+ self.defaultLatinRules.forEach(function(rule) {
+ self.acceptors.creators.push(rule);
+ });
+ self.defaultThaiRules.forEach(function(rule) {
+ self.acceptors.creators.push(rule);
+ });
+};
+
+Wordcut.init = function(dict_path, withDefault, additionalWords) {
+ withDefault = withDefault || false;
+ this.initNoDict();
+ var dict = _.clone(this.defaultDict);
+ dict.init(dict_path, withDefault, additionalWords);
+ this.acceptors.creators.push(dict);
+};
+
+module.exports = Wordcut;
+
+},{"./acceptors":1,"./dict":2,"./latin_rules":3,"./path_info_builder":4,"./path_selector":5,"./thai_rules":6,"./wordcut_core":8,"sys":28,"underscore":25}],8:[function(require,module,exports){
+var WordcutCore = {
+
+ buildPath: function(text) {
+ var self = this
+ , path = self.pathSelector.createPath()
+ , leftBoundary = 0;
+ self.acceptors.reset();
+ for (var i = 0; i < text.length; i++) {
+ var ch = text[i];
+ self.acceptors.transit(ch);
+
+ var possiblePathInfos = self
+ .pathInfoBuilder
+ .build(path,
+ self.acceptors.getFinalAcceptors(),
+ i,
+ leftBoundary,
+ text);
+ var selectedPath = self.pathSelector.selectPath(possiblePathInfos)
+
+ path.push(selectedPath);
+ if (selectedPath.type !== "UNK") {
+ leftBoundary = i;
+ }
+ }
+ return path;
+ },
+
+ pathToRanges: function(path) {
+ var e = path.length - 1
+ , ranges = [];
+
+ while (e > 0) {
+ var info = path[e]
+ , s = info.p;
+
+ if (info.merge !== undefined && ranges.length > 0) {
+ var r = ranges[ranges.length - 1];
+ r.s = info.merge;
+ s = r.s;
+ } else {
+ ranges.push({s:s, e:e});
+ }
+ e = s;
+ }
+ return ranges.reverse();
+ },
+
+ rangesToText: function(text, ranges, delimiter) {
+ return ranges.map(function(r) {
+ return text.substring(r.s, r.e);
+ }).join(delimiter);
+ },
+
+ cut: function(text, delimiter) {
+ var path = this.buildPath(text)
+ , ranges = this.pathToRanges(path);
+ return this
+ .rangesToText(text, ranges,
+ (delimiter === undefined ? "|" : delimiter));
+ },
+
+ cutIntoRanges: function(text, noText) {
+ var path = this.buildPath(text)
+ , ranges = this.pathToRanges(path);
+
+ if (!noText) {
+ ranges.forEach(function(r) {
+ r.text = text.substring(r.s, r.e);
+ });
+ }
+ return ranges;
+ },
+
+ cutIntoArray: function(text) {
+ var path = this.buildPath(text)
+ , ranges = this.pathToRanges(path);
+
+ return ranges.map(function(r) {
+ return text.substring(r.s, r.e)
+ });
+ }
+};
+
+module.exports = WordcutCore;
+
+},{}],9:[function(require,module,exports){
+// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
+//
+// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
+//
+// Originally from narwhal.js (http://narwhaljs.org)
+// Copyright (c) 2009 Thomas Robinson <280north.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the 'Software'), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// when used in node, this will actually load the util module we depend on
+// versus loading the builtin util module as happens otherwise
+// this is a bug in node module loading as far as I am concerned
+var util = require('util/');
+
+var pSlice = Array.prototype.slice;
+var hasOwn = Object.prototype.hasOwnProperty;
+
+// 1. The assert module provides functions that throw
+// AssertionError's when particular conditions are not met. The
+// assert module must conform to the following interface.
+
+var assert = module.exports = ok;
+
+// 2. The AssertionError is defined in assert.
+// new assert.AssertionError({ message: message,
+// actual: actual,
+// expected: expected })
+
+assert.AssertionError = function AssertionError(options) {
+ this.name = 'AssertionError';
+ this.actual = options.actual;
+ this.expected = options.expected;
+ this.operator = options.operator;
+ if (options.message) {
+ this.message = options.message;
+ this.generatedMessage = false;
+ } else {
+ this.message = getMessage(this);
+ this.generatedMessage = true;
+ }
+ var stackStartFunction = options.stackStartFunction || fail;
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, stackStartFunction);
+ }
+ else {
+ // non v8 browsers so we can have a stacktrace
+ var err = new Error();
+ if (err.stack) {
+ var out = err.stack;
+
+ // try to strip useless frames
+ var fn_name = stackStartFunction.name;
+ var idx = out.indexOf('\n' + fn_name);
+ if (idx >= 0) {
+ // once we have located the function frame
+ // we need to strip out everything before it (and its line)
+ var next_line = out.indexOf('\n', idx + 1);
+ out = out.substring(next_line + 1);
+ }
+
+ this.stack = out;
+ }
+ }
+};
+
+// assert.AssertionError instanceof Error
+util.inherits(assert.AssertionError, Error);
+
+function replacer(key, value) {
+ if (util.isUndefined(value)) {
+ return '' + value;
+ }
+ if (util.isNumber(value) && !isFinite(value)) {
+ return value.toString();
+ }
+ if (util.isFunction(value) || util.isRegExp(value)) {
+ return value.toString();
+ }
+ return value;
+}
+
+function truncate(s, n) {
+ if (util.isString(s)) {
+ return s.length < n ? s : s.slice(0, n);
+ } else {
+ return s;
+ }
+}
+
+function getMessage(self) {
+ return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +
+ self.operator + ' ' +
+ truncate(JSON.stringify(self.expected, replacer), 128);
+}
+
+// At present only the three keys mentioned above are used and
+// understood by the spec. Implementations or sub modules can pass
+// other keys to the AssertionError's constructor - they will be
+// ignored.
+
+// 3. All of the following functions must throw an AssertionError
+// when a corresponding condition is not met, with a message that
+// may be undefined if not provided. All assertion methods provide
+// both the actual and expected values to the assertion error for
+// display purposes.
+
+function fail(actual, expected, message, operator, stackStartFunction) {
+ throw new assert.AssertionError({
+ message: message,
+ actual: actual,
+ expected: expected,
+ operator: operator,
+ stackStartFunction: stackStartFunction
+ });
+}
+
+// EXTENSION! allows for well behaved errors defined elsewhere.
+assert.fail = fail;
+
+// 4. Pure assertion tests whether a value is truthy, as determined
+// by !!guard.
+// assert.ok(guard, message_opt);
+// This statement is equivalent to assert.equal(true, !!guard,
+// message_opt);. To test strictly for the value true, use
+// assert.strictEqual(true, guard, message_opt);.
+
+function ok(value, message) {
+ if (!value) fail(value, true, message, '==', assert.ok);
+}
+assert.ok = ok;
+
+// 5. The equality assertion tests shallow, coercive equality with
+// ==.
+// assert.equal(actual, expected, message_opt);
+
+assert.equal = function equal(actual, expected, message) {
+ if (actual != expected) fail(actual, expected, message, '==', assert.equal);
+};
+
+// 6. The non-equality assertion tests for whether two objects are not equal
+// with != assert.notEqual(actual, expected, message_opt);
+
+assert.notEqual = function notEqual(actual, expected, message) {
+ if (actual == expected) {
+ fail(actual, expected, message, '!=', assert.notEqual);
+ }
+};
+
+// 7. The equivalence assertion tests a deep equality relation.
+// assert.deepEqual(actual, expected, message_opt);
+
+assert.deepEqual = function deepEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected)) {
+ fail(actual, expected, message, 'deepEqual', assert.deepEqual);
+ }
+};
+
+function _deepEqual(actual, expected) {
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+
+ } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
+ if (actual.length != expected.length) return false;
+
+ for (var i = 0; i < actual.length; i++) {
+ if (actual[i] !== expected[i]) return false;
+ }
+
+ return true;
+
+ // 7.2. If the expected value is a Date object, the actual value is
+ // equivalent if it is also a Date object that refers to the same time.
+ } else if (util.isDate(actual) && util.isDate(expected)) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3 If the expected value is a RegExp object, the actual value is
+ // equivalent if it is also a RegExp object with the same source and
+ // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
+ } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
+ return actual.source === expected.source &&
+ actual.global === expected.global &&
+ actual.multiline === expected.multiline &&
+ actual.lastIndex === expected.lastIndex &&
+ actual.ignoreCase === expected.ignoreCase;
+
+ // 7.4. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (!util.isObject(actual) && !util.isObject(expected)) {
+ return actual == expected;
+
+ // 7.5 For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected);
+ }
+}
+
+function isArguments(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+
+function objEquiv(a, b) {
+ if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
+ return false;
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ // if one is a primitive, the other must be same
+ if (util.isPrimitive(a) || util.isPrimitive(b)) {
+ return a === b;
+ }
+ var aIsArgs = isArguments(a),
+ bIsArgs = isArguments(b);
+ if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
+ return false;
+ if (aIsArgs) {
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return _deepEqual(a, b);
+ }
+ var ka = objectKeys(a),
+ kb = objectKeys(b),
+ key, i;
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!_deepEqual(a[key], b[key])) return false;
+ }
+ return true;
+}
+
+// 8. The non-equivalence assertion tests for any deep inequality.
+// assert.notDeepEqual(actual, expected, message_opt);
+
+assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected)) {
+ fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
+ }
+};
+
+// 9. The strict equality assertion tests strict equality, as determined by ===.
+// assert.strictEqual(actual, expected, message_opt);
+
+assert.strictEqual = function strictEqual(actual, expected, message) {
+ if (actual !== expected) {
+ fail(actual, expected, message, '===', assert.strictEqual);
+ }
+};
+
+// 10. The strict non-equality assertion tests for strict inequality, as
+// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
+
+assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
+ if (actual === expected) {
+ fail(actual, expected, message, '!==', assert.notStrictEqual);
+ }
+};
+
+function expectedException(actual, expected) {
+ if (!actual || !expected) {
+ return false;
+ }
+
+ if (Object.prototype.toString.call(expected) == '[object RegExp]') {
+ return expected.test(actual);
+ } else if (actual instanceof expected) {
+ return true;
+ } else if (expected.call({}, actual) === true) {
+ return true;
+ }
+
+ return false;
+}
+
+function _throws(shouldThrow, block, expected, message) {
+ var actual;
+
+ if (util.isString(expected)) {
+ message = expected;
+ expected = null;
+ }
+
+ try {
+ block();
+ } catch (e) {
+ actual = e;
+ }
+
+ message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
+ (message ? ' ' + message : '.');
+
+ if (shouldThrow && !actual) {
+ fail(actual, expected, 'Missing expected exception' + message);
+ }
+
+ if (!shouldThrow && expectedException(actual, expected)) {
+ fail(actual, expected, 'Got unwanted exception' + message);
+ }
+
+ if ((shouldThrow && actual && expected &&
+ !expectedException(actual, expected)) || (!shouldThrow && actual)) {
+ throw actual;
+ }
+}
+
+// 11. Expected to throw an error:
+// assert.throws(block, Error_opt, message_opt);
+
+assert.throws = function(block, /*optional*/error, /*optional*/message) {
+ _throws.apply(this, [true].concat(pSlice.call(arguments)));
+};
+
+// EXTENSION! This is annoying to write outside this module.
+assert.doesNotThrow = function(block, /*optional*/message) {
+ _throws.apply(this, [false].concat(pSlice.call(arguments)));
+};
+
+assert.ifError = function(err) { if (err) {throw err;}};
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ if (hasOwn.call(obj, key)) keys.push(key);
+ }
+ return keys;
+};
+
+},{"util/":28}],10:[function(require,module,exports){
+'use strict';
+module.exports = balanced;
+function balanced(a, b, str) {
+ if (a instanceof RegExp) a = maybeMatch(a, str);
+ if (b instanceof RegExp) b = maybeMatch(b, str);
+
+ var r = range(a, b, str);
+
+ return r && {
+ start: r[0],
+ end: r[1],
+ pre: str.slice(0, r[0]),
+ body: str.slice(r[0] + a.length, r[1]),
+ post: str.slice(r[1] + b.length)
+ };
+}
+
+function maybeMatch(reg, str) {
+ var m = str.match(reg);
+ return m ? m[0] : null;
+}
+
+balanced.range = range;
+function range(a, b, str) {
+ var begs, beg, left, right, result;
+ var ai = str.indexOf(a);
+ var bi = str.indexOf(b, ai + 1);
+ var i = ai;
+
+ if (ai >= 0 && bi > 0) {
+ begs = [];
+ left = str.length;
+
+ while (i >= 0 && !result) {
+ if (i == ai) {
+ begs.push(i);
+ ai = str.indexOf(a, i + 1);
+ } else if (begs.length == 1) {
+ result = [ begs.pop(), bi ];
+ } else {
+ beg = begs.pop();
+ if (beg < left) {
+ left = beg;
+ right = bi;
+ }
+
+ bi = str.indexOf(b, i + 1);
+ }
+
+ i = ai < bi && ai >= 0 ? ai : bi;
+ }
+
+ if (begs.length) {
+ result = [ left, right ];
+ }
+ }
+
+ return result;
+}
+
+},{}],11:[function(require,module,exports){
+var concatMap = require('concat-map');
+var balanced = require('balanced-match');
+
+module.exports = expandTop;
+
+var escSlash = '\0SLASH'+Math.random()+'\0';
+var escOpen = '\0OPEN'+Math.random()+'\0';
+var escClose = '\0CLOSE'+Math.random()+'\0';
+var escComma = '\0COMMA'+Math.random()+'\0';
+var escPeriod = '\0PERIOD'+Math.random()+'\0';
+
+function numeric(str) {
+ return parseInt(str, 10) == str
+ ? parseInt(str, 10)
+ : str.charCodeAt(0);
+}
+
+function escapeBraces(str) {
+ return str.split('\\\\').join(escSlash)
+ .split('\\{').join(escOpen)
+ .split('\\}').join(escClose)
+ .split('\\,').join(escComma)
+ .split('\\.').join(escPeriod);
+}
+
+function unescapeBraces(str) {
+ return str.split(escSlash).join('\\')
+ .split(escOpen).join('{')
+ .split(escClose).join('}')
+ .split(escComma).join(',')
+ .split(escPeriod).join('.');
+}
+
+
+// Basically just str.split(","), but handling cases
+// where we have nested braced sections, which should be
+// treated as individual members, like {a,{b,c},d}
+function parseCommaParts(str) {
+ if (!str)
+ return [''];
+
+ var parts = [];
+ var m = balanced('{', '}', str);
+
+ if (!m)
+ return str.split(',');
+
+ var pre = m.pre;
+ var body = m.body;
+ var post = m.post;
+ var p = pre.split(',');
+
+ p[p.length-1] += '{' + body + '}';
+ var postParts = parseCommaParts(post);
+ if (post.length) {
+ p[p.length-1] += postParts.shift();
+ p.push.apply(p, postParts);
+ }
+
+ parts.push.apply(parts, p);
+
+ return parts;
+}
+
+function expandTop(str) {
+ if (!str)
+ return [];
+
+ // I don't know why Bash 4.3 does this, but it does.
+ // Anything starting with {} will have the first two bytes preserved
+ // but *only* at the top level, so {},a}b will not expand to anything,
+ // but a{},b}c will be expanded to [a}c,abc].
+ // One could argue that this is a bug in Bash, but since the goal of
+ // this module is to match Bash's rules, we escape a leading {}
+ if (str.substr(0, 2) === '{}') {
+ str = '\\{\\}' + str.substr(2);
+ }
+
+ return expand(escapeBraces(str), true).map(unescapeBraces);
+}
+
+function identity(e) {
+ return e;
+}
+
+function embrace(str) {
+ return '{' + str + '}';
+}
+function isPadded(el) {
+ return /^-?0\d/.test(el);
+}
+
+function lte(i, y) {
+ return i <= y;
+}
+function gte(i, y) {
+ return i >= y;
+}
+
+function expand(str, isTop) {
+ var expansions = [];
+
+ var m = balanced('{', '}', str);
+ if (!m || /\$$/.test(m.pre)) return [str];
+
+ var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
+ var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
+ var isSequence = isNumericSequence || isAlphaSequence;
+ var isOptions = m.body.indexOf(',') >= 0;
+ if (!isSequence && !isOptions) {
+ // {a},b}
+ if (m.post.match(/,.*\}/)) {
+ str = m.pre + '{' + m.body + escClose + m.post;
+ return expand(str);
+ }
+ return [str];
+ }
+
+ var n;
+ if (isSequence) {
+ n = m.body.split(/\.\./);
+ } else {
+ n = parseCommaParts(m.body);
+ if (n.length === 1) {
+ // x{{a,b}}y ==> x{a}y x{b}y
+ n = expand(n[0], false).map(embrace);
+ if (n.length === 1) {
+ var post = m.post.length
+ ? expand(m.post, false)
+ : [''];
+ return post.map(function(p) {
+ return m.pre + n[0] + p;
+ });
+ }
+ }
+ }
+
+ // at this point, n is the parts, and we know it's not a comma set
+ // with a single entry.
+
+ // no need to expand pre, since it is guaranteed to be free of brace-sets
+ var pre = m.pre;
+ var post = m.post.length
+ ? expand(m.post, false)
+ : [''];
+
+ var N;
+
+ if (isSequence) {
+ var x = numeric(n[0]);
+ var y = numeric(n[1]);
+ var width = Math.max(n[0].length, n[1].length)
+ var incr = n.length == 3
+ ? Math.abs(numeric(n[2]))
+ : 1;
+ var test = lte;
+ var reverse = y < x;
+ if (reverse) {
+ incr *= -1;
+ test = gte;
+ }
+ var pad = n.some(isPadded);
+
+ N = [];
+
+ for (var i = x; test(i, y); i += incr) {
+ var c;
+ if (isAlphaSequence) {
+ c = String.fromCharCode(i);
+ if (c === '\\')
+ c = '';
+ } else {
+ c = String(i);
+ if (pad) {
+ var need = width - c.length;
+ if (need > 0) {
+ var z = new Array(need + 1).join('0');
+ if (i < 0)
+ c = '-' + z + c.slice(1);
+ else
+ c = z + c;
+ }
+ }
+ }
+ N.push(c);
+ }
+ } else {
+ N = concatMap(n, function(el) { return expand(el, false) });
+ }
+
+ for (var j = 0; j < N.length; j++) {
+ for (var k = 0; k < post.length; k++) {
+ var expansion = pre + N[j] + post[k];
+ if (!isTop || isSequence || expansion)
+ expansions.push(expansion);
+ }
+ }
+
+ return expansions;
+}
+
+
+},{"balanced-match":10,"concat-map":13}],12:[function(require,module,exports){
+
+},{}],13:[function(require,module,exports){
+module.exports = function (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ var x = fn(xs[i], i);
+ if (isArray(x)) res.push.apply(res, x);
+ else res.push(x);
+ }
+ return res;
+};
+
+var isArray = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+},{}],14:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+function EventEmitter() {
+ this._events = this._events || {};
+ this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+EventEmitter.defaultMaxListeners = 10;
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!isNumber(n) || n < 0 || isNaN(n))
+ throw TypeError('n must be a positive number');
+ this._maxListeners = n;
+ return this;
+};
+
+EventEmitter.prototype.emit = function(type) {
+ var er, handler, len, args, i, listeners;
+
+ if (!this._events)
+ this._events = {};
+
+ // If there is no 'error' event listener then throw.
+ if (type === 'error') {
+ if (!this._events.error ||
+ (isObject(this._events.error) && !this._events.error.length)) {
+ er = arguments[1];
+ if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ }
+ throw TypeError('Uncaught, unspecified "error" event.');
+ }
+ }
+
+ handler = this._events[type];
+
+ if (isUndefined(handler))
+ return false;
+
+ if (isFunction(handler)) {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+ default:
+ len = arguments.length;
+ args = new Array(len - 1);
+ for (i = 1; i < len; i++)
+ args[i - 1] = arguments[i];
+ handler.apply(this, args);
+ }
+ } else if (isObject(handler)) {
+ len = arguments.length;
+ args = new Array(len - 1);
+ for (i = 1; i < len; i++)
+ args[i - 1] = arguments[i];
+
+ listeners = handler.slice();
+ len = listeners.length;
+ for (i = 0; i < len; i++)
+ listeners[i].apply(this, args);
+ }
+
+ return true;
+};
+
+EventEmitter.prototype.addListener = function(type, listener) {
+ var m;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events)
+ this._events = {};
+
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (this._events.newListener)
+ this.emit('newListener', type,
+ isFunction(listener.listener) ?
+ listener.listener : listener);
+
+ if (!this._events[type])
+ // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;
+ else if (isObject(this._events[type]))
+ // If we've already got an array, just append.
+ this._events[type].push(listener);
+ else
+ // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener];
+
+ // Check for listener leak
+ if (isObject(this._events[type]) && !this._events[type].warned) {
+ var m;
+ if (!isUndefined(this._maxListeners)) {
+ m = this._maxListeners;
+ } else {
+ m = EventEmitter.defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ if (typeof console.trace === 'function') {
+ // not supported in IE 10
+ console.trace();
+ }
+ }
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ var fired = false;
+
+ function g() {
+ this.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(this, arguments);
+ }
+ }
+
+ g.listener = listener;
+ this.on(type, g);
+
+ return this;
+};
+
+// emits a 'removeListener' event iff the listener was removed
+EventEmitter.prototype.removeListener = function(type, listener) {
+ var list, position, length, i;
+
+ if (!isFunction(listener))
+ throw TypeError('listener must be a function');
+
+ if (!this._events || !this._events[type])
+ return this;
+
+ list = this._events[type];
+ length = list.length;
+ position = -1;
+
+ if (list === listener ||
+ (isFunction(list.listener) && list.listener === listener)) {
+ delete this._events[type];
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+
+ } else if (isObject(list)) {
+ for (i = length; i-- > 0;) {
+ if (list[i] === listener ||
+ (list[i].listener && list[i].listener === listener)) {
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0)
+ return this;
+
+ if (list.length === 1) {
+ list.length = 0;
+ delete this._events[type];
+ } else {
+ list.splice(position, 1);
+ }
+
+ if (this._events.removeListener)
+ this.emit('removeListener', type, listener);
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ var key, listeners;
+
+ if (!this._events)
+ return this;
+
+ // not listening for removeListener, no need to emit
+ if (!this._events.removeListener) {
+ if (arguments.length === 0)
+ this._events = {};
+ else if (this._events[type])
+ delete this._events[type];
+ return this;
+ }
+
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ for (key in this._events) {
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = {};
+ return this;
+ }
+
+ listeners = this._events[type];
+
+ if (isFunction(listeners)) {
+ this.removeListener(type, listeners);
+ } else {
+ // LIFO order
+ while (listeners.length)
+ this.removeListener(type, listeners[listeners.length - 1]);
+ }
+ delete this._events[type];
+
+ return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+ var ret;
+ if (!this._events || !this._events[type])
+ ret = [];
+ else if (isFunction(this._events[type]))
+ ret = [this._events[type]];
+ else
+ ret = this._events[type].slice();
+ return ret;
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+ var ret;
+ if (!emitter._events || !emitter._events[type])
+ ret = 0;
+ else if (isFunction(emitter._events[type]))
+ ret = 1;
+ else
+ ret = emitter._events[type].length;
+ return ret;
+};
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+
+},{}],15:[function(require,module,exports){
+(function (process){
+exports.alphasort = alphasort
+exports.alphasorti = alphasorti
+exports.setopts = setopts
+exports.ownProp = ownProp
+exports.makeAbs = makeAbs
+exports.finish = finish
+exports.mark = mark
+exports.isIgnored = isIgnored
+exports.childrenIgnored = childrenIgnored
+
+function ownProp (obj, field) {
+ return Object.prototype.hasOwnProperty.call(obj, field)
+}
+
+var path = require("path")
+var minimatch = require("minimatch")
+var isAbsolute = require("path-is-absolute")
+var Minimatch = minimatch.Minimatch
+
+function alphasorti (a, b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase())
+}
+
+function alphasort (a, b) {
+ return a.localeCompare(b)
+}
+
+function setupIgnores (self, options) {
+ self.ignore = options.ignore || []
+
+ if (!Array.isArray(self.ignore))
+ self.ignore = [self.ignore]
+
+ if (self.ignore.length) {
+ self.ignore = self.ignore.map(ignoreMap)
+ }
+}
+
+function ignoreMap (pattern) {
+ var gmatcher = null
+ if (pattern.slice(-3) === '/**') {
+ var gpattern = pattern.replace(/(\/\*\*)+$/, '')
+ gmatcher = new Minimatch(gpattern)
+ }
+
+ return {
+ matcher: new Minimatch(pattern),
+ gmatcher: gmatcher
+ }
+}
+
+function setopts (self, pattern, options) {
+ if (!options)
+ options = {}
+
+ // base-matching: just use globstar for that.
+ if (options.matchBase && -1 === pattern.indexOf("/")) {
+ if (options.noglobstar) {
+ throw new Error("base matching requires globstar")
+ }
+ pattern = "**/" + pattern
+ }
+
+ self.silent = !!options.silent
+ self.pattern = pattern
+ self.strict = options.strict !== false
+ self.realpath = !!options.realpath
+ self.realpathCache = options.realpathCache || Object.create(null)
+ self.follow = !!options.follow
+ self.dot = !!options.dot
+ self.mark = !!options.mark
+ self.nodir = !!options.nodir
+ if (self.nodir)
+ self.mark = true
+ self.sync = !!options.sync
+ self.nounique = !!options.nounique
+ self.nonull = !!options.nonull
+ self.nosort = !!options.nosort
+ self.nocase = !!options.nocase
+ self.stat = !!options.stat
+ self.noprocess = !!options.noprocess
+
+ self.maxLength = options.maxLength || Infinity
+ self.cache = options.cache || Object.create(null)
+ self.statCache = options.statCache || Object.create(null)
+ self.symlinks = options.symlinks || Object.create(null)
+
+ setupIgnores(self, options)
+
+ self.changedCwd = false
+ var cwd = process.cwd()
+ if (!ownProp(options, "cwd"))
+ self.cwd = cwd
+ else {
+ self.cwd = options.cwd
+ self.changedCwd = path.resolve(options.cwd) !== cwd
+ }
+
+ self.root = options.root || path.resolve(self.cwd, "/")
+ self.root = path.resolve(self.root)
+ if (process.platform === "win32")
+ self.root = self.root.replace(/\\/g, "/")
+
+ self.nomount = !!options.nomount
+
+ // disable comments and negation unless the user explicitly
+ // passes in false as the option.
+ options.nonegate = options.nonegate === false ? false : true
+ options.nocomment = options.nocomment === false ? false : true
+ deprecationWarning(options)
+
+ self.minimatch = new Minimatch(pattern, options)
+ self.options = self.minimatch.options
+}
+
+// TODO(isaacs): remove entirely in v6
+// exported to reset in tests
+exports.deprecationWarned
+function deprecationWarning(options) {
+ if (!options.nonegate || !options.nocomment) {
+ if (process.noDeprecation !== true && !exports.deprecationWarned) {
+ var msg = 'glob WARNING: comments and negation will be disabled in v6'
+ if (process.throwDeprecation)
+ throw new Error(msg)
+ else if (process.traceDeprecation)
+ console.trace(msg)
+ else
+ console.error(msg)
+
+ exports.deprecationWarned = true
+ }
+ }
+}
+
+function finish (self) {
+ var nou = self.nounique
+ var all = nou ? [] : Object.create(null)
+
+ for (var i = 0, l = self.matches.length; i < l; i ++) {
+ var matches = self.matches[i]
+ if (!matches || Object.keys(matches).length === 0) {
+ if (self.nonull) {
+ // do like the shell, and spit out the literal glob
+ var literal = self.minimatch.globSet[i]
+ if (nou)
+ all.push(literal)
+ else
+ all[literal] = true
+ }
+ } else {
+ // had matches
+ var m = Object.keys(matches)
+ if (nou)
+ all.push.apply(all, m)
+ else
+ m.forEach(function (m) {
+ all[m] = true
+ })
+ }
+ }
+
+ if (!nou)
+ all = Object.keys(all)
+
+ if (!self.nosort)
+ all = all.sort(self.nocase ? alphasorti : alphasort)
+
+ // at *some* point we statted all of these
+ if (self.mark) {
+ for (var i = 0; i < all.length; i++) {
+ all[i] = self._mark(all[i])
+ }
+ if (self.nodir) {
+ all = all.filter(function (e) {
+ return !(/\/$/.test(e))
+ })
+ }
+ }
+
+ if (self.ignore.length)
+ all = all.filter(function(m) {
+ return !isIgnored(self, m)
+ })
+
+ self.found = all
+}
+
+function mark (self, p) {
+ var abs = makeAbs(self, p)
+ var c = self.cache[abs]
+ var m = p
+ if (c) {
+ var isDir = c === 'DIR' || Array.isArray(c)
+ var slash = p.slice(-1) === '/'
+
+ if (isDir && !slash)
+ m += '/'
+ else if (!isDir && slash)
+ m = m.slice(0, -1)
+
+ if (m !== p) {
+ var mabs = makeAbs(self, m)
+ self.statCache[mabs] = self.statCache[abs]
+ self.cache[mabs] = self.cache[abs]
+ }
+ }
+
+ return m
+}
+
+// lotta situps...
+function makeAbs (self, f) {
+ var abs = f
+ if (f.charAt(0) === '/') {
+ abs = path.join(self.root, f)
+ } else if (isAbsolute(f) || f === '') {
+ abs = f
+ } else if (self.changedCwd) {
+ abs = path.resolve(self.cwd, f)
+ } else {
+ abs = path.resolve(f)
+ }
+ return abs
+}
+
+
+// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
+// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
+function isIgnored (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
+
+function childrenIgnored (self, path) {
+ if (!self.ignore.length)
+ return false
+
+ return self.ignore.some(function(item) {
+ return !!(item.gmatcher && item.gmatcher.match(path))
+ })
+}
+
+}).call(this,require('_process'))
+},{"_process":24,"minimatch":20,"path":22,"path-is-absolute":23}],16:[function(require,module,exports){
+(function (process){
+// Approach:
+//
+// 1. Get the minimatch set
+// 2. For each pattern in the set, PROCESS(pattern, false)
+// 3. Store matches per-set, then uniq them
+//
+// PROCESS(pattern, inGlobStar)
+// Get the first [n] items from pattern that are all strings
+// Join these together. This is PREFIX.
+// If there is no more remaining, then stat(PREFIX) and
+// add to matches if it succeeds. END.
+//
+// If inGlobStar and PREFIX is symlink and points to dir
+// set ENTRIES = []
+// else readdir(PREFIX) as ENTRIES
+// If fail, END
+//
+// with ENTRIES
+// If pattern[n] is GLOBSTAR
+// // handle the case where the globstar match is empty
+// // by pruning it out, and testing the resulting pattern
+// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
+// // handle other cases.
+// for ENTRY in ENTRIES (not dotfiles)
+// // attach globstar + tail onto the entry
+// // Mark that this entry is a globstar match
+// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
+//
+// else // not globstar
+// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
+// Test ENTRY against pattern[n]
+// If fails, continue
+// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
+//
+// Caveat:
+// Cache all stats and readdirs results to minimize syscall. Since all
+// we ever care about is existence and directory-ness, we can just keep
+// `true` for files, and [children,...] for directories, or `false` for
+// things that don't exist.
+
+module.exports = glob
+
+var fs = require('fs')
+var minimatch = require('minimatch')
+var Minimatch = minimatch.Minimatch
+var inherits = require('inherits')
+var EE = require('events').EventEmitter
+var path = require('path')
+var assert = require('assert')
+var isAbsolute = require('path-is-absolute')
+var globSync = require('./sync.js')
+var common = require('./common.js')
+var alphasort = common.alphasort
+var alphasorti = common.alphasorti
+var setopts = common.setopts
+var ownProp = common.ownProp
+var inflight = require('inflight')
+var util = require('util')
+var childrenIgnored = common.childrenIgnored
+var isIgnored = common.isIgnored
+
+var once = require('once')
+
+function glob (pattern, options, cb) {
+ if (typeof options === 'function') cb = options, options = {}
+ if (!options) options = {}
+
+ if (options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return globSync(pattern, options)
+ }
+
+ return new Glob(pattern, options, cb)
+}
+
+glob.sync = globSync
+var GlobSync = glob.GlobSync = globSync.GlobSync
+
+// old api surface
+glob.glob = glob
+
+glob.hasMagic = function (pattern, options_) {
+ var options = util._extend({}, options_)
+ options.noprocess = true
+
+ var g = new Glob(pattern, options)
+ var set = g.minimatch.set
+ if (set.length > 1)
+ return true
+
+ for (var j = 0; j < set[0].length; j++) {
+ if (typeof set[0][j] !== 'string')
+ return true
+ }
+
+ return false
+}
+
+glob.Glob = Glob
+inherits(Glob, EE)
+function Glob (pattern, options, cb) {
+ if (typeof options === 'function') {
+ cb = options
+ options = null
+ }
+
+ if (options && options.sync) {
+ if (cb)
+ throw new TypeError('callback provided to sync glob')
+ return new GlobSync(pattern, options)
+ }
+
+ if (!(this instanceof Glob))
+ return new Glob(pattern, options, cb)
+
+ setopts(this, pattern, options)
+ this._didRealPath = false
+
+ // process each pattern in the minimatch set
+ var n = this.minimatch.set.length
+
+ // The matches are stored as {<filename>: true,...} so that
+ // duplicates are automagically pruned.
+ // Later, we do an Object.keys() on these.
+ // Keep them as a list so we can fill in when nonull is set.
+ this.matches = new Array(n)
+
+ if (typeof cb === 'function') {
+ cb = once(cb)
+ this.on('error', cb)
+ this.on('end', function (matches) {
+ cb(null, matches)
+ })
+ }
+
+ var self = this
+ var n = this.minimatch.set.length
+ this._processing = 0
+ this.matches = new Array(n)
+
+ this._emitQueue = []
+ this._processQueue = []
+ this.paused = false
+
+ if (this.noprocess)
+ return this
+
+ if (n === 0)
+ return done()
+
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false, done)
+ }
+
+ function done () {
+ --self._processing
+ if (self._processing <= 0)
+ self._finish()
+ }
+}
+
+Glob.prototype._finish = function () {
+ assert(this instanceof Glob)
+ if (this.aborted)
+ return
+
+ if (this.realpath && !this._didRealpath)
+ return this._realpath()
+
+ common.finish(this)
+ this.emit('end', this.found)
+}
+
+Glob.prototype._realpath = function () {
+ if (this._didRealpath)
+ return
+
+ this._didRealpath = true
+
+ var n = this.matches.length
+ if (n === 0)
+ return this._finish()
+
+ var self = this
+ for (var i = 0; i < this.matches.length; i++)
+ this._realpathSet(i, next)
+
+ function next () {
+ if (--n === 0)
+ self._finish()
+ }
+}
+
+Glob.prototype._realpathSet = function (index, cb) {
+ var matchset = this.matches[index]
+ if (!matchset)
+ return cb()
+
+ var found = Object.keys(matchset)
+ var self = this
+ var n = found.length
+
+ if (n === 0)
+ return cb()
+
+ var set = this.matches[index] = Object.create(null)
+ found.forEach(function (p, i) {
+ // If there's a problem with the stat, then it means that
+ // one or more of the links in the realpath couldn't be
+ // resolved. just return the abs value in that case.
+ p = self._makeAbs(p)
+ fs.realpath(p, self.realpathCache, function (er, real) {
+ if (!er)
+ set[real] = true
+ else if (er.syscall === 'stat')
+ set[p] = true
+ else
+ self.emit('error', er) // srsly wtf right here
+
+ if (--n === 0) {
+ self.matches[index] = set
+ cb()
+ }
+ })
+ })
+}
+
+Glob.prototype._mark = function (p) {
+ return common.mark(this, p)
+}
+
+Glob.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
+}
+
+Glob.prototype.abort = function () {
+ this.aborted = true
+ this.emit('abort')
+}
+
+Glob.prototype.pause = function () {
+ if (!this.paused) {
+ this.paused = true
+ this.emit('pause')
+ }
+}
+
+Glob.prototype.resume = function () {
+ if (this.paused) {
+ this.emit('resume')
+ this.paused = false
+ if (this._emitQueue.length) {
+ var eq = this._emitQueue.slice(0)
+ this._emitQueue.length = 0
+ for (var i = 0; i < eq.length; i ++) {
+ var e = eq[i]
+ this._emitMatch(e[0], e[1])
+ }
+ }
+ if (this._processQueue.length) {
+ var pq = this._processQueue.slice(0)
+ this._processQueue.length = 0
+ for (var i = 0; i < pq.length; i ++) {
+ var p = pq[i]
+ this._processing--
+ this._process(p[0], p[1], p[2], p[3])
+ }
+ }
+ }
+}
+
+Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
+ assert(this instanceof Glob)
+ assert(typeof cb === 'function')
+
+ if (this.aborted)
+ return
+
+ this._processing++
+ if (this.paused) {
+ this._processQueue.push([pattern, index, inGlobStar, cb])
+ return
+ }
+
+ //console.error('PROCESS %d', this._processing, pattern)
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0
+ while (typeof pattern[n] === 'string') {
+ n ++
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // see if there's anything else
+ var prefix
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index, cb)
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/')
+ break
+ }
+
+ var remain = pattern.slice(n)
+
+ // get the list of entries.
+ var read
+ if (prefix === null)
+ read = '.'
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
+ if (!prefix || !isAbsolute(prefix))
+ prefix = '/' + prefix
+ read = prefix
+ } else
+ read = prefix
+
+ var abs = this._makeAbs(read)
+
+ //if ignored, skip _processing
+ if (childrenIgnored(this, read))
+ return cb()
+
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
+}
+
+Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return cb()
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === '.'
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
+ }
+ }
+
+ //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return cb()
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this._emitMatch(index, e)
+ }
+ // This was the last one, and no stats were needed
+ return cb()
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix) {
+ if (prefix !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+ this._process([e].concat(remain), index, inGlobStar, cb)
+ }
+ cb()
+}
+
+Glob.prototype._emitMatch = function (index, e) {
+ if (this.aborted)
+ return
+
+ if (this.matches[index][e])
+ return
+
+ if (isIgnored(this, e))
+ return
+
+ if (this.paused) {
+ this._emitQueue.push([index, e])
+ return
+ }
+
+ var abs = this._makeAbs(e)
+
+ if (this.nodir) {
+ var c = this.cache[abs]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ if (this.mark)
+ e = this._mark(e)
+
+ this.matches[index][e] = true
+
+ var st = this.statCache[abs]
+ if (st)
+ this.emit('stat', e, st)
+
+ this.emit('match', e)
+}
+
+Glob.prototype._readdirInGlobStar = function (abs, cb) {
+ if (this.aborted)
+ return
+
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false, cb)
+
+ var lstatkey = 'lstat\0' + abs
+ var self = this
+ var lstatcb = inflight(lstatkey, lstatcb_)
+
+ if (lstatcb)
+ fs.lstat(abs, lstatcb)
+
+ function lstatcb_ (er, lstat) {
+ if (er)
+ return cb()
+
+ var isSym = lstat.isSymbolicLink()
+ self.symlinks[abs] = isSym
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && !lstat.isDirectory()) {
+ self.cache[abs] = 'FILE'
+ cb()
+ } else
+ self._readdir(abs, false, cb)
+ }
+}
+
+Glob.prototype._readdir = function (abs, inGlobStar, cb) {
+ if (this.aborted)
+ return
+
+ cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
+ if (!cb)
+ return
+
+ //console.error('RD %j %j', +inGlobStar, abs)
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs, cb)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return cb()
+
+ if (Array.isArray(c))
+ return cb(null, c)
+ }
+
+ var self = this
+ fs.readdir(abs, readdirCb(this, abs, cb))
+}
+
+function readdirCb (self, abs, cb) {
+ return function (er, entries) {
+ if (er)
+ self._readdirError(abs, er, cb)
+ else
+ self._readdirEntries(abs, entries, cb)
+ }
+}
+
+Glob.prototype._readdirEntries = function (abs, entries, cb) {
+ if (this.aborted)
+ return
+
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === '/')
+ e = abs + e
+ else
+ e = abs + '/' + e
+ this.cache[e] = true
+ }
+ }
+
+ this.cache[abs] = entries
+ return cb(null, entries)
+}
+
+Glob.prototype._readdirError = function (f, er, cb) {
+ if (this.aborted)
+ return
+
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ this.cache[this._makeAbs(f)] = 'FILE'
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false
+ if (this.strict) {
+ this.emit('error', er)
+ // If the error is handled, then we abort
+ // if not, we threw out of here
+ this.abort()
+ }
+ if (!this.silent)
+ console.error('glob error', er)
+ break
+ }
+
+ return cb()
+}
+
+Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
+ var self = this
+ this._readdir(abs, inGlobStar, function (er, entries) {
+ self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
+ })
+}
+
+
+Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
+ //console.error('pgs2', prefix, remain[0], entries)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return cb()
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false, cb)
+
+ var isSym = this.symlinks[abs]
+ var len = entries.length
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return cb()
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true, cb)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true, cb)
+ }
+
+ cb()
+}
+
+Glob.prototype._processSimple = function (prefix, index, cb) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var self = this
+ this._stat(prefix, function (er, exists) {
+ self._processSimple2(prefix, index, er, exists, cb)
+ })
+}
+Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
+
+ //console.error('ps2', prefix, exists)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return cb()
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === '/') {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/')
+
+ // Mark this as a match
+ this._emitMatch(index, prefix)
+ cb()
+}
+
+// Returns either 'DIR', 'FILE', or false
+Glob.prototype._stat = function (f, cb) {
+ var abs = this._makeAbs(f)
+ var needDir = f.slice(-1) === '/'
+
+ if (f.length > this.maxLength)
+ return cb()
+
+ if (!this.stat && ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return cb(null, c)
+
+ if (needDir && c === 'FILE')
+ return cb()
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (stat !== undefined) {
+ if (stat === false)
+ return cb(null, stat)
+ else {
+ var type = stat.isDirectory() ? 'DIR' : 'FILE'
+ if (needDir && type === 'FILE')
+ return cb()
+ else
+ return cb(null, type, stat)
+ }
+ }
+
+ var self = this
+ var statcb = inflight('stat\0' + abs, lstatcb_)
+ if (statcb)
+ fs.lstat(abs, statcb)
+
+ function lstatcb_ (er, lstat) {
+ if (lstat && lstat.isSymbolicLink()) {
+ // If it's a symlink, then treat it as the target, unless
+ // the target does not exist, then treat it as a file.
+ return fs.stat(abs, function (er, stat) {
+ if (er)
+ self._stat2(f, abs, null, lstat, cb)
+ else
+ self._stat2(f, abs, er, stat, cb)
+ })
+ } else {
+ self._stat2(f, abs, er, lstat, cb)
+ }
+ }
+}
+
+Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
+ if (er) {
+ this.statCache[abs] = false
+ return cb()
+ }
+
+ var needDir = f.slice(-1) === '/'
+ this.statCache[abs] = stat
+
+ if (abs.slice(-1) === '/' && !stat.isDirectory())
+ return cb(null, false, stat)
+
+ var c = stat.isDirectory() ? 'DIR' : 'FILE'
+ this.cache[abs] = this.cache[abs] || c
+
+ if (needDir && c !== 'DIR')
+ return cb()
+
+ return cb(null, c, stat)
+}
+
+}).call(this,require('_process'))
+},{"./common.js":15,"./sync.js":17,"_process":24,"assert":9,"events":14,"fs":12,"inflight":18,"inherits":19,"minimatch":20,"once":21,"path":22,"path-is-absolute":23,"util":28}],17:[function(require,module,exports){
+(function (process){
+module.exports = globSync
+globSync.GlobSync = GlobSync
+
+var fs = require('fs')
+var minimatch = require('minimatch')
+var Minimatch = minimatch.Minimatch
+var Glob = require('./glob.js').Glob
+var util = require('util')
+var path = require('path')
+var assert = require('assert')
+var isAbsolute = require('path-is-absolute')
+var common = require('./common.js')
+var alphasort = common.alphasort
+var alphasorti = common.alphasorti
+var setopts = common.setopts
+var ownProp = common.ownProp
+var childrenIgnored = common.childrenIgnored
+
+function globSync (pattern, options) {
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ return new GlobSync(pattern, options).found
+}
+
+function GlobSync (pattern, options) {
+ if (!pattern)
+ throw new Error('must provide pattern')
+
+ if (typeof options === 'function' || arguments.length === 3)
+ throw new TypeError('callback provided to sync glob\n'+
+ 'See: https://github.com/isaacs/node-glob/issues/167')
+
+ if (!(this instanceof GlobSync))
+ return new GlobSync(pattern, options)
+
+ setopts(this, pattern, options)
+
+ if (this.noprocess)
+ return this
+
+ var n = this.minimatch.set.length
+ this.matches = new Array(n)
+ for (var i = 0; i < n; i ++) {
+ this._process(this.minimatch.set[i], i, false)
+ }
+ this._finish()
+}
+
+GlobSync.prototype._finish = function () {
+ assert(this instanceof GlobSync)
+ if (this.realpath) {
+ var self = this
+ this.matches.forEach(function (matchset, index) {
+ var set = self.matches[index] = Object.create(null)
+ for (var p in matchset) {
+ try {
+ p = self._makeAbs(p)
+ var real = fs.realpathSync(p, self.realpathCache)
+ set[real] = true
+ } catch (er) {
+ if (er.syscall === 'stat')
+ set[self._makeAbs(p)] = true
+ else
+ throw er
+ }
+ }
+ })
+ }
+ common.finish(this)
+}
+
+
+GlobSync.prototype._process = function (pattern, index, inGlobStar) {
+ assert(this instanceof GlobSync)
+
+ // Get the first [n] parts of pattern that are all strings.
+ var n = 0
+ while (typeof pattern[n] === 'string') {
+ n ++
+ }
+ // now n is the index of the first one that is *not* a string.
+
+ // See if there's anything else
+ var prefix
+ switch (n) {
+ // if not, then this is rather simple
+ case pattern.length:
+ this._processSimple(pattern.join('/'), index)
+ return
+
+ case 0:
+ // pattern *starts* with some non-trivial item.
+ // going to readdir(cwd), but not include the prefix in matches.
+ prefix = null
+ break
+
+ default:
+ // pattern has some string bits in the front.
+ // whatever it starts with, whether that's 'absolute' like /foo/bar,
+ // or 'relative' like '../baz'
+ prefix = pattern.slice(0, n).join('/')
+ break
+ }
+
+ var remain = pattern.slice(n)
+
+ // get the list of entries.
+ var read
+ if (prefix === null)
+ read = '.'
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
+ if (!prefix || !isAbsolute(prefix))
+ prefix = '/' + prefix
+ read = prefix
+ } else
+ read = prefix
+
+ var abs = this._makeAbs(read)
+
+ //if ignored, skip processing
+ if (childrenIgnored(this, read))
+ return
+
+ var isGlobStar = remain[0] === minimatch.GLOBSTAR
+ if (isGlobStar)
+ this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
+ else
+ this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
+}
+
+
+GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
+ var entries = this._readdir(abs, inGlobStar)
+
+ // if the abs isn't a dir, then nothing can match!
+ if (!entries)
+ return
+
+ // It will only match dot entries if it starts with a dot, or if
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
+ var pn = remain[0]
+ var negate = !!this.minimatch.negate
+ var rawGlob = pn._glob
+ var dotOk = this.dot || rawGlob.charAt(0) === '.'
+
+ var matchedEntries = []
+ for (var i = 0; i < entries.length; i++) {
+ var e = entries[i]
+ if (e.charAt(0) !== '.' || dotOk) {
+ var m
+ if (negate && !prefix) {
+ m = !e.match(pn)
+ } else {
+ m = e.match(pn)
+ }
+ if (m)
+ matchedEntries.push(e)
+ }
+ }
+
+ var len = matchedEntries.length
+ // If there are no matched entries, then nothing matches.
+ if (len === 0)
+ return
+
+ // if this is the last remaining pattern bit, then no need for
+ // an additional stat *unless* the user has specified mark or
+ // stat explicitly. We know they exist, since readdir returned
+ // them.
+
+ if (remain.length === 1 && !this.mark && !this.stat) {
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ if (prefix) {
+ if (prefix.slice(-1) !== '/')
+ e = prefix + '/' + e
+ else
+ e = prefix + e
+ }
+
+ if (e.charAt(0) === '/' && !this.nomount) {
+ e = path.join(this.root, e)
+ }
+ this.matches[index][e] = true
+ }
+ // This was the last one, and no stats were needed
+ return
+ }
+
+ // now test all matched entries as stand-ins for that part
+ // of the pattern.
+ remain.shift()
+ for (var i = 0; i < len; i ++) {
+ var e = matchedEntries[i]
+ var newPattern
+ if (prefix)
+ newPattern = [prefix, e]
+ else
+ newPattern = [e]
+ this._process(newPattern.concat(remain), index, inGlobStar)
+ }
+}
+
+
+GlobSync.prototype._emitMatch = function (index, e) {
+ var abs = this._makeAbs(e)
+ if (this.mark)
+ e = this._mark(e)
+
+ if (this.matches[index][e])
+ return
+
+ if (this.nodir) {
+ var c = this.cache[this._makeAbs(e)]
+ if (c === 'DIR' || Array.isArray(c))
+ return
+ }
+
+ this.matches[index][e] = true
+ if (this.stat)
+ this._stat(e)
+}
+
+
+GlobSync.prototype._readdirInGlobStar = function (abs) {
+ // follow all symlinked directories forever
+ // just proceed as if this is a non-globstar situation
+ if (this.follow)
+ return this._readdir(abs, false)
+
+ var entries
+ var lstat
+ var stat
+ try {
+ lstat = fs.lstatSync(abs)
+ } catch (er) {
+ // lstat failed, doesn't exist
+ return null
+ }
+
+ var isSym = lstat.isSymbolicLink()
+ this.symlinks[abs] = isSym
+
+ // If it's not a symlink or a dir, then it's definitely a regular file.
+ // don't bother doing a readdir in that case.
+ if (!isSym && !lstat.isDirectory())
+ this.cache[abs] = 'FILE'
+ else
+ entries = this._readdir(abs, false)
+
+ return entries
+}
+
+GlobSync.prototype._readdir = function (abs, inGlobStar) {
+ var entries
+
+ if (inGlobStar && !ownProp(this.symlinks, abs))
+ return this._readdirInGlobStar(abs)
+
+ if (ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+ if (!c || c === 'FILE')
+ return null
+
+ if (Array.isArray(c))
+ return c
+ }
+
+ try {
+ return this._readdirEntries(abs, fs.readdirSync(abs))
+ } catch (er) {
+ this._readdirError(abs, er)
+ return null
+ }
+}
+
+GlobSync.prototype._readdirEntries = function (abs, entries) {
+ // if we haven't asked to stat everything, then just
+ // assume that everything in there exists, so we can avoid
+ // having to stat it a second time.
+ if (!this.mark && !this.stat) {
+ for (var i = 0; i < entries.length; i ++) {
+ var e = entries[i]
+ if (abs === '/')
+ e = abs + e
+ else
+ e = abs + '/' + e
+ this.cache[e] = true
+ }
+ }
+
+ this.cache[abs] = entries
+
+ // mark and cache dir-ness
+ return entries
+}
+
+GlobSync.prototype._readdirError = function (f, er) {
+ // handle errors, and cache the information
+ switch (er.code) {
+ case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
+ case 'ENOTDIR': // totally normal. means it *does* exist.
+ this.cache[this._makeAbs(f)] = 'FILE'
+ break
+
+ case 'ENOENT': // not terribly unusual
+ case 'ELOOP':
+ case 'ENAMETOOLONG':
+ case 'UNKNOWN':
+ this.cache[this._makeAbs(f)] = false
+ break
+
+ default: // some unusual error. Treat as failure.
+ this.cache[this._makeAbs(f)] = false
+ if (this.strict)
+ throw er
+ if (!this.silent)
+ console.error('glob error', er)
+ break
+ }
+}
+
+GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
+
+ var entries = this._readdir(abs, inGlobStar)
+
+ // no entries means not a dir, so it can never have matches
+ // foo.txt/** doesn't match foo.txt
+ if (!entries)
+ return
+
+ // test without the globstar, and with every child both below
+ // and replacing the globstar.
+ var remainWithoutGlobStar = remain.slice(1)
+ var gspref = prefix ? [ prefix ] : []
+ var noGlobStar = gspref.concat(remainWithoutGlobStar)
+
+ // the noGlobStar pattern exits the inGlobStar state
+ this._process(noGlobStar, index, false)
+
+ var len = entries.length
+ var isSym = this.symlinks[abs]
+
+ // If it's a symlink, and we're in a globstar, then stop
+ if (isSym && inGlobStar)
+ return
+
+ for (var i = 0; i < len; i++) {
+ var e = entries[i]
+ if (e.charAt(0) === '.' && !this.dot)
+ continue
+
+ // these two cases enter the inGlobStar state
+ var instead = gspref.concat(entries[i], remainWithoutGlobStar)
+ this._process(instead, index, true)
+
+ var below = gspref.concat(entries[i], remain)
+ this._process(below, index, true)
+ }
+}
+
+GlobSync.prototype._processSimple = function (prefix, index) {
+ // XXX review this. Shouldn't it be doing the mounting etc
+ // before doing stat? kinda weird?
+ var exists = this._stat(prefix)
+
+ if (!this.matches[index])
+ this.matches[index] = Object.create(null)
+
+ // If it doesn't exist, then just mark the lack of results
+ if (!exists)
+ return
+
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
+ var trail = /[\/\\]$/.test(prefix)
+ if (prefix.charAt(0) === '/') {
+ prefix = path.join(this.root, prefix)
+ } else {
+ prefix = path.resolve(this.root, prefix)
+ if (trail)
+ prefix += '/'
+ }
+ }
+
+ if (process.platform === 'win32')
+ prefix = prefix.replace(/\\/g, '/')
+
+ // Mark this as a match
+ this.matches[index][prefix] = true
+}
+
+// Returns either 'DIR', 'FILE', or false
+GlobSync.prototype._stat = function (f) {
+ var abs = this._makeAbs(f)
+ var needDir = f.slice(-1) === '/'
+
+ if (f.length > this.maxLength)
+ return false
+
+ if (!this.stat && ownProp(this.cache, abs)) {
+ var c = this.cache[abs]
+
+ if (Array.isArray(c))
+ c = 'DIR'
+
+ // It exists, but maybe not how we need it
+ if (!needDir || c === 'DIR')
+ return c
+
+ if (needDir && c === 'FILE')
+ return false
+
+ // otherwise we have to stat, because maybe c=true
+ // if we know it exists, but not what it is.
+ }
+
+ var exists
+ var stat = this.statCache[abs]
+ if (!stat) {
+ var lstat
+ try {
+ lstat = fs.lstatSync(abs)
+ } catch (er) {
+ return false
+ }
+
+ if (lstat.isSymbolicLink()) {
+ try {
+ stat = fs.statSync(abs)
+ } catch (er) {
+ stat = lstat
+ }
+ } else {
+ stat = lstat
+ }
+ }
+
+ this.statCache[abs] = stat
+
+ var c = stat.isDirectory() ? 'DIR' : 'FILE'
+ this.cache[abs] = this.cache[abs] || c
+
+ if (needDir && c !== 'DIR')
+ return false
+
+ return c
+}
+
+GlobSync.prototype._mark = function (p) {
+ return common.mark(this, p)
+}
+
+GlobSync.prototype._makeAbs = function (f) {
+ return common.makeAbs(this, f)
+}
+
+}).call(this,require('_process'))
+},{"./common.js":15,"./glob.js":16,"_process":24,"assert":9,"fs":12,"minimatch":20,"path":22,"path-is-absolute":23,"util":28}],18:[function(require,module,exports){
+(function (process){
+var wrappy = require('wrappy')
+var reqs = Object.create(null)
+var once = require('once')
+
+module.exports = wrappy(inflight)
+
+function inflight (key, cb) {
+ if (reqs[key]) {
+ reqs[key].push(cb)
+ return null
+ } else {
+ reqs[key] = [cb]
+ return makeres(key)
+ }
+}
+
+function makeres (key) {
+ return once(function RES () {
+ var cbs = reqs[key]
+ var len = cbs.length
+ var args = slice(arguments)
+
+ // XXX It's somewhat ambiguous whether a new callback added in this
+ // pass should be queued for later execution if something in the
+ // list of callbacks throws, or if it should just be discarded.
+ // However, it's such an edge case that it hardly matters, and either
+ // choice is likely as surprising as the other.
+ // As it happens, we do go ahead and schedule it for later execution.
+ try {
+ for (var i = 0; i < len; i++) {
+ cbs[i].apply(null, args)
+ }
+ } finally {
+ if (cbs.length > len) {
+ // added more in the interim.
+ // de-zalgo, just in case, but don't call again.
+ cbs.splice(0, len)
+ process.nextTick(function () {
+ RES.apply(null, args)
+ })
+ } else {
+ delete reqs[key]
+ }
+ }
+ })
+}
+
+function slice (args) {
+ var length = args.length
+ var array = []
+
+ for (var i = 0; i < length; i++) array[i] = args[i]
+ return array
+}
+
+}).call(this,require('_process'))
+},{"_process":24,"once":21,"wrappy":29}],19:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+},{}],20:[function(require,module,exports){
+module.exports = minimatch
+minimatch.Minimatch = Minimatch
+
+var path = { sep: '/' }
+try {
+ path = require('path')
+} catch (er) {}
+
+var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
+var expand = require('brace-expansion')
+
+var plTypes = {
+ '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
+ '?': { open: '(?:', close: ')?' },
+ '+': { open: '(?:', close: ')+' },
+ '*': { open: '(?:', close: ')*' },
+ '@': { open: '(?:', close: ')' }
+}
+
+// any single thing other than /
+// don't need to escape / when using new RegExp()
+var qmark = '[^/]'
+
+// * => any number of characters
+var star = qmark + '*?'
+
+// ** when dots are allowed. Anything goes, except .. and .
+// not (^ or / followed by one or two dots followed by $ or /),
+// followed by anything, any number of times.
+var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
+
+// not a ^ or / followed by a dot,
+// followed by anything, any number of times.
+var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
+
+// characters that need to be escaped in RegExp.
+var reSpecials = charSet('().*{}+?[]^$\\!')
+
+// "abc" -> { a:true, b:true, c:true }
+function charSet (s) {
+ return s.split('').reduce(function (set, c) {
+ set[c] = true
+ return set
+ }, {})
+}
+
+// normalizes slashes.
+var slashSplit = /\/+/
+
+minimatch.filter = filter
+function filter (pattern, options) {
+ options = options || {}
+ return function (p, i, list) {
+ return minimatch(p, pattern, options)
+ }
+}
+
+function ext (a, b) {
+ a = a || {}
+ b = b || {}
+ var t = {}
+ Object.keys(b).forEach(function (k) {
+ t[k] = b[k]
+ })
+ Object.keys(a).forEach(function (k) {
+ t[k] = a[k]
+ })
+ return t
+}
+
+minimatch.defaults = function (def) {
+ if (!def || !Object.keys(def).length) return minimatch
+
+ var orig = minimatch
+
+ var m = function minimatch (p, pattern, options) {
+ return orig.minimatch(p, pattern, ext(def, options))
+ }
+
+ m.Minimatch = function Minimatch (pattern, options) {
+ return new orig.Minimatch(pattern, ext(def, options))
+ }
+
+ return m
+}
+
+Minimatch.defaults = function (def) {
+ if (!def || !Object.keys(def).length) return Minimatch
+ return minimatch.defaults(def).Minimatch
+}
+
+function minimatch (p, pattern, options) {
+ if (typeof pattern !== 'string') {
+ throw new TypeError('glob pattern string required')
+ }
+
+ if (!options) options = {}
+
+ // shortcut: comments match nothing.
+ if (!options.nocomment && pattern.charAt(0) === '#') {
+ return false
+ }
+
+ // "" only matches ""
+ if (pattern.trim() === '') return p === ''
+
+ return new Minimatch(pattern, options).match(p)
+}
+
+function Minimatch (pattern, options) {
+ if (!(this instanceof Minimatch)) {
+ return new Minimatch(pattern, options)
+ }
+
+ if (typeof pattern !== 'string') {
+ throw new TypeError('glob pattern string required')
+ }
+
+ if (!options) options = {}
+ pattern = pattern.trim()
+
+ // windows support: need to use /, not \
+ if (path.sep !== '/') {
+ pattern = pattern.split(path.sep).join('/')
+ }
+
+ this.options = options
+ this.set = []
+ this.pattern = pattern
+ this.regexp = null
+ this.negate = false
+ this.comment = false
+ this.empty = false
+
+ // make the set of regexps etc.
+ this.make()
+}
+
+Minimatch.prototype.debug = function () {}
+
+Minimatch.prototype.make = make
+function make () {
+ // don't do it more than once.
+ if (this._made) return
+
+ var pattern = this.pattern
+ var options = this.options
+
+ // empty patterns and comments match nothing.
+ if (!options.nocomment && pattern.charAt(0) === '#') {
+ this.comment = true
+ return
+ }
+ if (!pattern) {
+ this.empty = true
+ return
+ }
+
+ // step 1: figure out negation, etc.
+ this.parseNegate()
+
+ // step 2: expand braces
+ var set = this.globSet = this.braceExpand()
+
+ if (options.debug) this.debug = console.error
+
+ this.debug(this.pattern, set)
+
+ // step 3: now we have a set, so turn each one into a series of path-portion
+ // matching patterns.
+ // These will be regexps, except in the case of "**", which is
+ // set to the GLOBSTAR object for globstar behavior,
+ // and will not contain any / characters
+ set = this.globParts = set.map(function (s) {
+ return s.split(slashSplit)
+ })
+
+ this.debug(this.pattern, set)
+
+ // glob --> regexps
+ set = set.map(function (s, si, set) {
+ return s.map(this.parse, this)
+ }, this)
+
+ this.debug(this.pattern, set)
+
+ // filter out everything that didn't compile properly.
+ set = set.filter(function (s) {
+ return s.indexOf(false) === -1
+ })
+
+ this.debug(this.pattern, set)
+
+ this.set = set
+}
+
+Minimatch.prototype.parseNegate = parseNegate
+function parseNegate () {
+ var pattern = this.pattern
+ var negate = false
+ var options = this.options
+ var negateOffset = 0
+
+ if (options.nonegate) return
+
+ for (var i = 0, l = pattern.length
+ ; i < l && pattern.charAt(i) === '!'
+ ; i++) {
+ negate = !negate
+ negateOffset++
+ }
+
+ if (negateOffset) this.pattern = pattern.substr(negateOffset)
+ this.negate = negate
+}
+
+// Brace expansion:
+// a{b,c}d -> abd acd
+// a{b,}c -> abc ac
+// a{0..3}d -> a0d a1d a2d a3d
+// a{b,c{d,e}f}g -> abg acdfg acefg
+// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
+//
+// Invalid sets are not expanded.
+// a{2..}b -> a{2..}b
+// a{b}c -> a{b}c
+minimatch.braceExpand = function (pattern, options) {
+ return braceExpand(pattern, options)
+}
+
+Minimatch.prototype.braceExpand = braceExpand
+
+function braceExpand (pattern, options) {
+ if (!options) {
+ if (this instanceof Minimatch) {
+ options = this.options
+ } else {
+ options = {}
+ }
+ }
+
+ pattern = typeof pattern === 'undefined'
+ ? this.pattern : pattern
+
+ if (typeof pattern === 'undefined') {
+ throw new TypeError('undefined pattern')
+ }
+
+ if (options.nobrace ||
+ !pattern.match(/\{.*\}/)) {
+ // shortcut. no need to expand.
+ return [pattern]
+ }
+
+ return expand(pattern)
+}
+
+// parse a component of the expanded set.
+// At this point, no pattern may contain "/" in it
+// so we're going to return a 2d array, where each entry is the full
+// pattern, split on '/', and then turned into a regular expression.
+// A regexp is made at the end which joins each array with an
+// escaped /, and another full one which joins each regexp with |.
+//
+// Following the lead of Bash 4.1, note that "**" only has special meaning
+// when it is the *only* thing in a path portion. Otherwise, any series
+// of * is equivalent to a single *. Globstar behavior is enabled by
+// default, and can be disabled by setting options.noglobstar.
+Minimatch.prototype.parse = parse
+var SUBPARSE = {}
+function parse (pattern, isSub) {
+ if (pattern.length > 1024 * 64) {
+ throw new TypeError('pattern is too long')
+ }
+
+ var options = this.options
+
+ // shortcuts
+ if (!options.noglobstar && pattern === '**') return GLOBSTAR
+ if (pattern === '') return ''
+
+ var re = ''
+ var hasMagic = !!options.nocase
+ var escaping = false
+ // ? => one single character
+ var patternListStack = []
+ var negativeLists = []
+ var stateChar
+ var inClass = false
+ var reClassStart = -1
+ var classStart = -1
+ // . and .. never match anything that doesn't start with .,
+ // even when options.dot is set.
+ var patternStart = pattern.charAt(0) === '.' ? '' // anything
+ // not (start or / followed by . or .. followed by / or end)
+ : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
+ : '(?!\\.)'
+ var self = this
+
+ function clearStateChar () {
+ if (stateChar) {
+ // we had some state-tracking character
+ // that wasn't consumed by this pass.
+ switch (stateChar) {
+ case '*':
+ re += star
+ hasMagic = true
+ break
+ case '?':
+ re += qmark
+ hasMagic = true
+ break
+ default:
+ re += '\\' + stateChar
+ break
+ }
+ self.debug('clearStateChar %j %j', stateChar, re)
+ stateChar = false
+ }
+ }
+
+ for (var i = 0, len = pattern.length, c
+ ; (i < len) && (c = pattern.charAt(i))
+ ; i++) {
+ this.debug('%s\t%s %s %j', pattern, i, re, c)
+
+ // skip over any that are escaped.
+ if (escaping && reSpecials[c]) {
+ re += '\\' + c
+ escaping = false
+ continue
+ }
+
+ switch (c) {
+ case '/':
+ // completely not allowed, even escaped.
+ // Should already be path-split by now.
+ return false
+
+ case '\\':
+ clearStateChar()
+ escaping = true
+ continue
+
+ // the various stateChar values
+ // for the "extglob" stuff.
+ case '?':
+ case '*':
+ case '+':
+ case '@':
+ case '!':
+ this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
+
+ // all of those are literals inside a class, except that
+ // the glob [!a] means [^a] in regexp
+ if (inClass) {
+ this.debug(' in class')
+ if (c === '!' && i === classStart + 1) c = '^'
+ re += c
+ continue
+ }
+
+ // if we already have a stateChar, then it means
+ // that there was something like ** or +? in there.
+ // Handle the stateChar, then proceed with this one.
+ self.debug('call clearStateChar %j', stateChar)
+ clearStateChar()
+ stateChar = c
+ // if extglob is disabled, then +(asdf|foo) isn't a thing.
+ // just clear the statechar *now*, rather than even diving into
+ // the patternList stuff.
+ if (options.noext) clearStateChar()
+ continue
+
+ case '(':
+ if (inClass) {
+ re += '('
+ continue
+ }
+
+ if (!stateChar) {
+ re += '\\('
+ continue
+ }
+
+ patternListStack.push({
+ type: stateChar,
+ start: i - 1,
+ reStart: re.length,
+ open: plTypes[stateChar].open,
+ close: plTypes[stateChar].close
+ })
+ // negation is (?:(?!js)[^/]*)
+ re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
+ this.debug('plType %j %j', stateChar, re)
+ stateChar = false
+ continue
+
+ case ')':
+ if (inClass || !patternListStack.length) {
+ re += '\\)'
+ continue
+ }
+
+ clearStateChar()
+ hasMagic = true
+ var pl = patternListStack.pop()
+ // negation is (?:(?!js)[^/]*)
+ // The others are (?:<pattern>)<type>
+ re += pl.close
+ if (pl.type === '!') {
+ negativeLists.push(pl)
+ }
+ pl.reEnd = re.length
+ continue
+
+ case '|':
+ if (inClass || !patternListStack.length || escaping) {
+ re += '\\|'
+ escaping = false
+ continue
+ }
+
+ clearStateChar()
+ re += '|'
+ continue
+
+ // these are mostly the same in regexp and glob
+ case '[':
+ // swallow any state-tracking char before the [
+ clearStateChar()
+
+ if (inClass) {
+ re += '\\' + c
+ continue
+ }
+
+ inClass = true
+ classStart = i
+ reClassStart = re.length
+ re += c
+ continue
+
+ case ']':
+ // a right bracket shall lose its special
+ // meaning and represent itself in
+ // a bracket expression if it occurs
+ // first in the list. -- POSIX.2 2.8.3.2
+ if (i === classStart + 1 || !inClass) {
+ re += '\\' + c
+ escaping = false
+ continue
+ }
+
+ // handle the case where we left a class open.
+ // "[z-a]" is valid, equivalent to "\[z-a\]"
+ if (inClass) {
+ // split where the last [ was, make sure we don't have
+ // an invalid re. if so, re-walk the contents of the
+ // would-be class to re-translate any characters that
+ // were passed through as-is
+ // TODO: It would probably be faster to determine this
+ // without a try/catch and a new RegExp, but it's tricky
+ // to do safely. For now, this is safe and works.
+ var cs = pattern.substring(classStart + 1, i)
+ try {
+ RegExp('[' + cs + ']')
+ } catch (er) {
+ // not a valid class!
+ var sp = this.parse(cs, SUBPARSE)
+ re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
+ hasMagic = hasMagic || sp[1]
+ inClass = false
+ continue
+ }
+ }
+
+ // finish up the class.
+ hasMagic = true
+ inClass = false
+ re += c
+ continue
+
+ default:
+ // swallow any state char that wasn't consumed
+ clearStateChar()
+
+ if (escaping) {
+ // no need
+ escaping = false
+ } else if (reSpecials[c]
+ && !(c === '^' && inClass)) {
+ re += '\\'
+ }
+
+ re += c
+
+ } // switch
+ } // for
+
+ // handle the case where we left a class open.
+ // "[abc" is valid, equivalent to "\[abc"
+ if (inClass) {
+ // split where the last [ was, and escape it
+ // this is a huge pita. We now have to re-walk
+ // the contents of the would-be class to re-translate
+ // any characters that were passed through as-is
+ cs = pattern.substr(classStart + 1)
+ sp = this.parse(cs, SUBPARSE)
+ re = re.substr(0, reClassStart) + '\\[' + sp[0]
+ hasMagic = hasMagic || sp[1]
+ }
+
+ // handle the case where we had a +( thing at the *end*
+ // of the pattern.
+ // each pattern list stack adds 3 chars, and we need to go through
+ // and escape any | chars that were passed through as-is for the regexp.
+ // Go through and escape them, taking care not to double-escape any
+ // | chars that were already escaped.
+ for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
+ var tail = re.slice(pl.reStart + pl.open.length)
+ this.debug('setting tail', re, pl)
+ // maybe some even number of \, then maybe 1 \, followed by a |
+ tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
+ if (!$2) {
+ // the | isn't already escaped, so escape it.
+ $2 = '\\'
+ }
+
+ // need to escape all those slashes *again*, without escaping the
+ // one that we need for escaping the | character. As it works out,
+ // escaping an even number of slashes can be done by simply repeating
+ // it exactly after itself. That's why this trick works.
+ //
+ // I am sorry that you have to see this.
+ return $1 + $1 + $2 + '|'
+ })
+
+ this.debug('tail=%j\n %s', tail, tail, pl, re)
+ var t = pl.type === '*' ? star
+ : pl.type === '?' ? qmark
+ : '\\' + pl.type
+
+ hasMagic = true
+ re = re.slice(0, pl.reStart) + t + '\\(' + tail
+ }
+
+ // handle trailing things that only matter at the very end.
+ clearStateChar()
+ if (escaping) {
+ // trailing \\
+ re += '\\\\'
+ }
+
+ // only need to apply the nodot start if the re starts with
+ // something that could conceivably capture a dot
+ var addPatternStart = false
+ switch (re.charAt(0)) {
+ case '.':
+ case '[':
+ case '(': addPatternStart = true
+ }
+
+ // Hack to work around lack of negative lookbehind in JS
+ // A pattern like: *.!(x).!(y|z) needs to ensure that a name
+ // like 'a.xyz.yz' doesn't match. So, the first negative
+ // lookahead, has to look ALL the way ahead, to the end of
+ // the pattern.
+ for (var n = negativeLists.length - 1; n > -1; n--) {
+ var nl = negativeLists[n]
+
+ var nlBefore = re.slice(0, nl.reStart)
+ var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
+ var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
+ var nlAfter = re.slice(nl.reEnd)
+
+ nlLast += nlAfter
+
+ // Handle nested stuff like *(*.js|!(*.json)), where open parens
+ // mean that we should *not* include the ) in the bit that is considered
+ // "after" the negated section.
+ var openParensBefore = nlBefore.split('(').length - 1
+ var cleanAfter = nlAfter
+ for (i = 0; i < openParensBefore; i++) {
+ cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
+ }
+ nlAfter = cleanAfter
+
+ var dollar = ''
+ if (nlAfter === '' && isSub !== SUBPARSE) {
+ dollar = '$'
+ }
+ var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
+ re = newRe
+ }
+
+ // if the re is not "" at this point, then we need to make sure
+ // it doesn't match against an empty path part.
+ // Otherwise a/* will match a/, which it should not.
+ if (re !== '' && hasMagic) {
+ re = '(?=.)' + re
+ }
+
+ if (addPatternStart) {
+ re = patternStart + re
+ }
+
+ // parsing just a piece of a larger pattern.
+ if (isSub === SUBPARSE) {
+ return [re, hasMagic]
+ }
+
+ // skip the regexp for non-magical patterns
+ // unescape anything in it, though, so that it'll be
+ // an exact match against a file etc.
+ if (!hasMagic) {
+ return globUnescape(pattern)
+ }
+
+ var flags = options.nocase ? 'i' : ''
+ try {
+ var regExp = new RegExp('^' + re + '$', flags)
+ } catch (er) {
+ // If it was an invalid regular expression, then it can't match
+ // anything. This trick looks for a character after the end of
+ // the string, which is of course impossible, except in multi-line
+ // mode, but it's not a /m regex.
+ return new RegExp('$.')
+ }
+
+ regExp._glob = pattern
+ regExp._src = re
+
+ return regExp
+}
+
+minimatch.makeRe = function (pattern, options) {
+ return new Minimatch(pattern, options || {}).makeRe()
+}
+
+Minimatch.prototype.makeRe = makeRe
+function makeRe () {
+ if (this.regexp || this.regexp === false) return this.regexp
+
+ // at this point, this.set is a 2d array of partial
+ // pattern strings, or "**".
+ //
+ // It's better to use .match(). This function shouldn't
+ // be used, really, but it's pretty convenient sometimes,
+ // when you just want to work with a regex.
+ var set = this.set
+
+ if (!set.length) {
+ this.regexp = false
+ return this.regexp
+ }
+ var options = this.options
+
+ var twoStar = options.noglobstar ? star
+ : options.dot ? twoStarDot
+ : twoStarNoDot
+ var flags = options.nocase ? 'i' : ''
+
+ var re = set.map(function (pattern) {
+ return pattern.map(function (p) {
+ return (p === GLOBSTAR) ? twoStar
+ : (typeof p === 'string') ? regExpEscape(p)
+ : p._src
+ }).join('\\\/')
+ }).join('|')
+
+ // must match entire pattern
+ // ending in a * or ** will make it less strict.
+ re = '^(?:' + re + ')$'
+
+ // can match anything, as long as it's not this.
+ if (this.negate) re = '^(?!' + re + ').*$'
+
+ try {
+ this.regexp = new RegExp(re, flags)
+ } catch (ex) {
+ this.regexp = false
+ }
+ return this.regexp
+}
+
+minimatch.match = function (list, pattern, options) {
+ options = options || {}
+ var mm = new Minimatch(pattern, options)
+ list = list.filter(function (f) {
+ return mm.match(f)
+ })
+ if (mm.options.nonull && !list.length) {
+ list.push(pattern)
+ }
+ return list
+}
+
+Minimatch.prototype.match = match
+function match (f, partial) {
+ this.debug('match', f, this.pattern)
+ // short-circuit in the case of busted things.
+ // comments, etc.
+ if (this.comment) return false
+ if (this.empty) return f === ''
+
+ if (f === '/' && partial) return true
+
+ var options = this.options
+
+ // windows: need to use /, not \
+ if (path.sep !== '/') {
+ f = f.split(path.sep).join('/')
+ }
+
+ // treat the test path as a set of pathparts.
+ f = f.split(slashSplit)
+ this.debug(this.pattern, 'split', f)
+
+ // just ONE of the pattern sets in this.set needs to match
+ // in order for it to be valid. If negating, then just one
+ // match means that we have failed.
+ // Either way, return on the first hit.
+
+ var set = this.set
+ this.debug(this.pattern, 'set', set)
+
+ // Find the basename of the path by looking for the last non-empty segment
+ var filename
+ var i
+ for (i = f.length - 1; i >= 0; i--) {
+ filename = f[i]
+ if (filename) break
+ }
+
+ for (i = 0; i < set.length; i++) {
+ var pattern = set[i]
+ var file = f
+ if (options.matchBase && pattern.length === 1) {
+ file = [filename]
+ }
+ var hit = this.matchOne(file, pattern, partial)
+ if (hit) {
+ if (options.flipNegate) return true
+ return !this.negate
+ }
+ }
+
+ // didn't get any hits. this is success if it's a negative
+ // pattern, failure otherwise.
+ if (options.flipNegate) return false
+ return this.negate
+}
+
+// set partial to true to test if, for example,
+// "/a/b" matches the start of "/*/b/*/d"
+// Partial means, if you run out of file before you run
+// out of pattern, then that's fine, as long as all
+// the parts match.
+Minimatch.prototype.matchOne = function (file, pattern, partial) {
+ var options = this.options
+
+ this.debug('matchOne',
+ { 'this': this, file: file, pattern: pattern })
+
+ this.debug('matchOne', file.length, pattern.length)
+
+ for (var fi = 0,
+ pi = 0,
+ fl = file.length,
+ pl = pattern.length
+ ; (fi < fl) && (pi < pl)
+ ; fi++, pi++) {
+ this.debug('matchOne loop')
+ var p = pattern[pi]
+ var f = file[fi]
+
+ this.debug(pattern, p, f)
+
+ // should be impossible.
+ // some invalid regexp stuff in the set.
+ if (p === false) return false
+
+ if (p === GLOBSTAR) {
+ this.debug('GLOBSTAR', [pattern, p, f])
+
+ // "**"
+ // a/**/b/**/c would match the following:
+ // a/b/x/y/z/c
+ // a/x/y/z/b/c
+ // a/b/x/b/x/c
+ // a/b/c
+ // To do this, take the rest of the pattern after
+ // the **, and see if it would match the file remainder.
+ // If so, return success.
+ // If not, the ** "swallows" a segment, and try again.
+ // This is recursively awful.
+ //
+ // a/**/b/**/c matching a/b/x/y/z/c
+ // - a matches a
+ // - doublestar
+ // - matchOne(b/x/y/z/c, b/**/c)
+ // - b matches b
+ // - doublestar
+ // - matchOne(x/y/z/c, c) -> no
+ // - matchOne(y/z/c, c) -> no
+ // - matchOne(z/c, c) -> no
+ // - matchOne(c, c) yes, hit
+ var fr = fi
+ var pr = pi + 1
+ if (pr === pl) {
+ this.debug('** at the end')
+ // a ** at the end will just swallow the rest.
+ // We have found a match.
+ // however, it will not swallow /.x, unless
+ // options.dot is set.
+ // . and .. are *never* matched by **, for explosively
+ // exponential reasons.
+ for (; fi < fl; fi++) {
+ if (file[fi] === '.' || file[fi] === '..' ||
+ (!options.dot && file[fi].charAt(0) === '.')) return false
+ }
+ return true
+ }
+
+ // ok, let's see if we can swallow whatever we can.
+ while (fr < fl) {
+ var swallowee = file[fr]
+
+ this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
+
+ // XXX remove this slice. Just pass the start index.
+ if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
+ this.debug('globstar found match!', fr, fl, swallowee)
+ // found a match.
+ return true
+ } else {
+ // can't swallow "." or ".." ever.
+ // can only swallow ".foo" when explicitly asked.
+ if (swallowee === '.' || swallowee === '..' ||
+ (!options.dot && swallowee.charAt(0) === '.')) {
+ this.debug('dot detected!', file, fr, pattern, pr)
+ break
+ }
+
+ // ** swallows a segment, and continue.
+ this.debug('globstar swallow a segment, and continue')
+ fr++
+ }
+ }
+
+ // no match was found.
+ // However, in partial mode, we can't say this is necessarily over.
+ // If there's more *pattern* left, then
+ if (partial) {
+ // ran out of file
+ this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
+ if (fr === fl) return true
+ }
+ return false
+ }
+
+ // something other than **
+ // non-magic patterns just have to match exactly
+ // patterns with magic have been turned into regexps.
+ var hit
+ if (typeof p === 'string') {
+ if (options.nocase) {
+ hit = f.toLowerCase() === p.toLowerCase()
+ } else {
+ hit = f === p
+ }
+ this.debug('string match', p, f, hit)
+ } else {
+ hit = f.match(p)
+ this.debug('pattern match', p, f, hit)
+ }
+
+ if (!hit) return false
+ }
+
+ // Note: ending in / means that we'll get a final ""
+ // at the end of the pattern. This can only match a
+ // corresponding "" at the end of the file.
+ // If the file ends in /, then it can only match a
+ // a pattern that ends in /, unless the pattern just
+ // doesn't have any more for it. But, a/b/ should *not*
+ // match "a/b/*", even though "" matches against the
+ // [^/]*? pattern, except in partial mode, where it might
+ // simply not be reached yet.
+ // However, a/b/ should still satisfy a/*
+
+ // now either we fell off the end of the pattern, or we're done.
+ if (fi === fl && pi === pl) {
+ // ran out of pattern and filename at the same time.
+ // an exact hit!
+ return true
+ } else if (fi === fl) {
+ // ran out of file, but still had pattern left.
+ // this is ok if we're doing the match as part of
+ // a glob fs traversal.
+ return partial
+ } else if (pi === pl) {
+ // ran out of pattern, still have file left.
+ // this is only acceptable if we're on the very last
+ // empty segment of a file with a trailing slash.
+ // a/* should match a/b/
+ var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
+ return emptyFileEnd
+ }
+
+ // should be unreachable.
+ throw new Error('wtf?')
+}
+
+// replace stuff like \* with *
+function globUnescape (s) {
+ return s.replace(/\\(.)/g, '$1')
+}
+
+function regExpEscape (s) {
+ return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
+}
+
+},{"brace-expansion":11,"path":22}],21:[function(require,module,exports){
+var wrappy = require('wrappy')
+module.exports = wrappy(once)
+module.exports.strict = wrappy(onceStrict)
+
+once.proto = once(function () {
+ Object.defineProperty(Function.prototype, 'once', {
+ value: function () {
+ return once(this)
+ },
+ configurable: true
+ })
+
+ Object.defineProperty(Function.prototype, 'onceStrict', {
+ value: function () {
+ return onceStrict(this)
+ },
+ configurable: true
+ })
+})
+
+function once (fn) {
+ var f = function () {
+ if (f.called) return f.value
+ f.called = true
+ return f.value = fn.apply(this, arguments)
+ }
+ f.called = false
+ return f
+}
+
+function onceStrict (fn) {
+ var f = function () {
+ if (f.called)
+ throw new Error(f.onceError)
+ f.called = true
+ return f.value = fn.apply(this, arguments)
+ }
+ var name = fn.name || 'Function wrapped with `once`'
+ f.onceError = name + " shouldn't be called more than once"
+ f.called = false
+ return f
+}
+
+},{"wrappy":29}],22:[function(require,module,exports){
+(function (process){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length - 1; i >= 0; i--) {
+ var last = parts[i];
+ if (last === '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+}
+
+// Split a filename into [root, dir, basename, ext], unix version
+// 'root' is just a slash, or nothing.
+var splitPathRe =
+ /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+var splitPath = function(filename) {
+ return splitPathRe.exec(filename).slice(1);
+};
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+ var resolvedPath = '',
+ resolvedAbsolute = false;
+
+ for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0) ? arguments[i] : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string') {
+ throw new TypeError('Arguments to path.resolve must be strings');
+ } else if (!path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+ }
+
+ // At this point the path should be resolved to a full absolute path, but
+ // handle relative paths to be safe (might happen when process.cwd() fails)
+
+ // Normalize the path
+ resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+ var isAbsolute = exports.isAbsolute(path),
+ trailingSlash = substr(path, -1) === '/';
+
+ // Normalize the path
+ path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isAbsolute).join('/');
+
+ if (!path && !isAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isAbsolute ? '/' : '') + path;
+};
+
+// posix version
+exports.isAbsolute = function(path) {
+ return path.charAt(0) === '/';
+};
+
+// posix version
+exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(filter(paths, function(p, index) {
+ if (typeof p !== 'string') {
+ throw new TypeError('Arguments to path.join must be strings');
+ }
+ return p;
+ }).join('/'));
+};
+
+
+// path.relative(from, to)
+// posix version
+exports.relative = function(from, to) {
+ from = exports.resolve(from).substr(1);
+ to = exports.resolve(to).substr(1);
+
+ function trim(arr) {
+ var start = 0;
+ for (; start < arr.length; start++) {
+ if (arr[start] !== '') break;
+ }
+
+ var end = arr.length - 1;
+ for (; end >= 0; end--) {
+ if (arr[end] !== '') break;
+ }
+
+ if (start > end) return [];
+ return arr.slice(start, end - start + 1);
+ }
+
+ var fromParts = trim(from.split('/'));
+ var toParts = trim(to.split('/'));
+
+ var length = Math.min(fromParts.length, toParts.length);
+ var samePartsLength = length;
+ for (var i = 0; i < length; i++) {
+ if (fromParts[i] !== toParts[i]) {
+ samePartsLength = i;
+ break;
+ }
+ }
+
+ var outputParts = [];
+ for (var i = samePartsLength; i < fromParts.length; i++) {
+ outputParts.push('..');
+ }
+
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
+
+ return outputParts.join('/');
+};
+
+exports.sep = '/';
+exports.delimiter = ':';
+
+exports.dirname = function(path) {
+ var result = splitPath(path),
+ root = result[0],
+ dir = result[1];
+
+ if (!root && !dir) {
+ // No dirname whatsoever
+ return '.';
+ }
+
+ if (dir) {
+ // It has a dirname, strip trailing slash
+ dir = dir.substr(0, dir.length - 1);
+ }
+
+ return root + dir;
+};
+
+
+exports.basename = function(path, ext) {
+ var f = splitPath(path)[2];
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+};
+
+
+exports.extname = function(path) {
+ return splitPath(path)[3];
+};
+
+function filter (xs, f) {
+ if (xs.filter) return xs.filter(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (f(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+}
+
+// String.prototype.substr - negative index don't work in IE8
+var substr = 'ab'.substr(-1) === 'b'
+ ? function (str, start, len) { return str.substr(start, len) }
+ : function (str, start, len) {
+ if (start < 0) start = str.length + start;
+ return str.substr(start, len);
+ }
+;
+
+}).call(this,require('_process'))
+},{"_process":24}],23:[function(require,module,exports){
+(function (process){
+'use strict';
+
+function posix(path) {
+ return path.charAt(0) === '/';
+}
+
+function win32(path) {
+ // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
+ var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
+ var result = splitDeviceRe.exec(path);
+ var device = result[1] || '';
+ var isUnc = Boolean(device && device.charAt(1) !== ':');
+
+ // UNC paths are always absolute
+ return Boolean(result[2] || isUnc);
+}
+
+module.exports = process.platform === 'win32' ? win32 : posix;
+module.exports.posix = posix;
+module.exports.win32 = win32;
+
+}).call(this,require('_process'))
+},{"_process":24}],24:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],25:[function(require,module,exports){
+// Underscore.js 1.8.3
+// http://underscorejs.org
+// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+// Underscore may be freely distributed under the MIT license.
+
+(function() {
+
+ // Baseline setup
+ // --------------
+
+ // Establish the root object, `window` in the browser, or `exports` on the server.
+ var root = this;
+
+ // Save the previous value of the `_` variable.
+ var previousUnderscore = root._;
+
+ // Save bytes in the minified (but not gzipped) version:
+ var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+ // Create quick reference variables for speed access to core prototypes.
+ var
+ push = ArrayProto.push,
+ slice = ArrayProto.slice,
+ toString = ObjProto.toString,
+ hasOwnProperty = ObjProto.hasOwnProperty;
+
+ // All **ECMAScript 5** native function implementations that we hope to use
+ // are declared here.
+ var
+ nativeIsArray = Array.isArray,
+ nativeKeys = Object.keys,
+ nativeBind = FuncProto.bind,
+ nativeCreate = Object.create;
+
+ // Naked function reference for surrogate-prototype-swapping.
+ var Ctor = function(){};
+
+ // Create a safe reference to the Underscore object for use below.
+ var _ = function(obj) {
+ if (obj instanceof _) return obj;
+ if (!(this instanceof _)) return new _(obj);
+ this._wrapped = obj;
+ };
+
+ // Export the Underscore object for **Node.js**, with
+ // backwards-compatibility for the old `require()` API. If we're in
+ // the browser, add `_` as a global object.
+ if (typeof exports !== 'undefined') {
+ if (typeof module !== 'undefined' && module.exports) {
+ exports = module.exports = _;
+ }
+ exports._ = _;
+ } else {
+ root._ = _;
+ }
+
+ // Current version.
+ _.VERSION = '1.8.3';
+
+ // Internal function that returns an efficient (for current engines) version
+ // of the passed-in callback, to be repeatedly applied in other Underscore
+ // functions.
+ var optimizeCb = function(func, context, argCount) {
+ if (context === void 0) return func;
+ switch (argCount == null ? 3 : argCount) {
+ case 1: return function(value) {
+ return func.call(context, value);
+ };
+ case 2: return function(value, other) {
+ return func.call(context, value, other);
+ };
+ case 3: return function(value, index, collection) {
+ return func.call(context, value, index, collection);
+ };
+ case 4: return function(accumulator, value, index, collection) {
+ return func.call(context, accumulator, value, index, collection);
+ };
+ }
+ return function() {
+ return func.apply(context, arguments);
+ };
+ };
+
+ // A mostly-internal function to generate callbacks that can be applied
+ // to each element in a collection, returning the desired result — either
+ // identity, an arbitrary callback, a property matcher, or a property accessor.
+ var cb = function(value, context, argCount) {
+ if (value == null) return _.identity;
+ if (_.isFunction(value)) return optimizeCb(value, context, argCount);
+ if (_.isObject(value)) return _.matcher(value);
+ return _.property(value);
+ };
+ _.iteratee = function(value, context) {
+ return cb(value, context, Infinity);
+ };
+
+ // An internal function for creating assigner functions.
+ var createAssigner = function(keysFunc, undefinedOnly) {
+ return function(obj) {
+ var length = arguments.length;
+ if (length < 2 || obj == null) return obj;
+ for (var index = 1; index < length; index++) {
+ var source = arguments[index],
+ keys = keysFunc(source),
+ l = keys.length;
+ for (var i = 0; i < l; i++) {
+ var key = keys[i];
+ if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
+ }
+ }
+ return obj;
+ };
+ };
+
+ // An internal function for creating a new object that inherits from another.
+ var baseCreate = function(prototype) {
+ if (!_.isObject(prototype)) return {};
+ if (nativeCreate) return nativeCreate(prototype);
+ Ctor.prototype = prototype;
+ var result = new Ctor;
+ Ctor.prototype = null;
+ return result;
+ };
+
+ var property = function(key) {
+ return function(obj) {
+ return obj == null ? void 0 : obj[key];
+ };
+ };
+
+ // Helper for collection methods to determine whether a collection
+ // should be iterated as an array or as an object
+ // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+ // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+ var getLength = property('length');
+ var isArrayLike = function(collection) {
+ var length = getLength(collection);
+ return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
+ };
+
+ // Collection Functions
+ // --------------------
+
+ // The cornerstone, an `each` implementation, aka `forEach`.
+ // Handles raw objects in addition to array-likes. Treats all
+ // sparse array-likes as if they were dense.
+ _.each = _.forEach = function(obj, iteratee, context) {
+ iteratee = optimizeCb(iteratee, context);
+ var i, length;
+ if (isArrayLike(obj)) {
+ for (i = 0, length = obj.length; i < length; i++) {
+ iteratee(obj[i], i, obj);
+ }
+ } else {
+ var keys = _.keys(obj);
+ for (i = 0, length = keys.length; i < length; i++) {
+ iteratee(obj[keys[i]], keys[i], obj);
+ }
+ }
+ return obj;
+ };
+
+ // Return the results of applying the iteratee to each element.
+ _.map = _.collect = function(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length,
+ results = Array(length);
+ for (var index = 0; index < length; index++) {
+ var currentKey = keys ? keys[index] : index;
+ results[index] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ };
+
+ // Create a reducing function iterating left or right.
+ function createReduce(dir) {
+ // Optimized iterator function as using arguments.length
+ // in the main function will deoptimize the, see #1991.
+ function iterator(obj, iteratee, memo, keys, index, length) {
+ for (; index >= 0 && index < length; index += dir) {
+ var currentKey = keys ? keys[index] : index;
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
+ }
+ return memo;
+ }
+
+ return function(obj, iteratee, memo, context) {
+ iteratee = optimizeCb(iteratee, context, 4);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length,
+ index = dir > 0 ? 0 : length - 1;
+ // Determine the initial value if none is provided.
+ if (arguments.length < 3) {
+ memo = obj[keys ? keys[index] : index];
+ index += dir;
+ }
+ return iterator(obj, iteratee, memo, keys, index, length);
+ };
+ }
+
+ // **Reduce** builds up a single result from a list of values, aka `inject`,
+ // or `foldl`.
+ _.reduce = _.foldl = _.inject = createReduce(1);
+
+ // The right-associative version of reduce, also known as `foldr`.
+ _.reduceRight = _.foldr = createReduce(-1);
+
+ // Return the first value which passes a truth test. Aliased as `detect`.
+ _.find = _.detect = function(obj, predicate, context) {
+ var key;
+ if (isArrayLike(obj)) {
+ key = _.findIndex(obj, predicate, context);
+ } else {
+ key = _.findKey(obj, predicate, context);
+ }
+ if (key !== void 0 && key !== -1) return obj[key];
+ };
+
+ // Return all the elements that pass a truth test.
+ // Aliased as `select`.
+ _.filter = _.select = function(obj, predicate, context) {
+ var results = [];
+ predicate = cb(predicate, context);
+ _.each(obj, function(value, index, list) {
+ if (predicate(value, index, list)) results.push(value);
+ });
+ return results;
+ };
+
+ // Return all the elements for which a truth test fails.
+ _.reject = function(obj, predicate, context) {
+ return _.filter(obj, _.negate(cb(predicate)), context);
+ };
+
+ // Determine whether all of the elements match a truth test.
+ // Aliased as `all`.
+ _.every = _.all = function(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = keys ? keys[index] : index;
+ if (!predicate(obj[currentKey], currentKey, obj)) return false;
+ }
+ return true;
+ };
+
+ // Determine if at least one element in the object matches a truth test.
+ // Aliased as `any`.
+ _.some = _.any = function(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var keys = !isArrayLike(obj) && _.keys(obj),
+ length = (keys || obj).length;
+ for (var index = 0; index < length; index++) {
+ var currentKey = keys ? keys[index] : index;
+ if (predicate(obj[currentKey], currentKey, obj)) return true;
+ }
+ return false;
+ };
+
+ // Determine if the array or object contains a given item (using `===`).
+ // Aliased as `includes` and `include`.
+ _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) {
+ if (!isArrayLike(obj)) obj = _.values(obj);
+ if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+ return _.indexOf(obj, item, fromIndex) >= 0;
+ };
+
+ // Invoke a method (with arguments) on every item in a collection.
+ _.invoke = function(obj, method) {
+ var args = slice.call(arguments, 2);
+ var isFunc = _.isFunction(method);
+ return _.map(obj, function(value) {
+ var func = isFunc ? method : value[method];
+ return func == null ? func : func.apply(value, args);
+ });
+ };
+
+ // Convenience version of a common use case of `map`: fetching a property.
+ _.pluck = function(obj, key) {
+ return _.map(obj, _.property(key));
+ };
+
+ // Convenience version of a common use case of `filter`: selecting only objects
+ // containing specific `key:value` pairs.
+ _.where = function(obj, attrs) {
+ return _.filter(obj, _.matcher(attrs));
+ };
+
+ // Convenience version of a common use case of `find`: getting the first object
+ // containing specific `key:value` pairs.
+ _.findWhere = function(obj, attrs) {
+ return _.find(obj, _.matcher(attrs));
+ };
+
+ // Return the maximum element (or element-based computation).
+ _.max = function(obj, iteratee, context) {
+ var result = -Infinity, lastComputed = -Infinity,
+ value, computed;
+ if (iteratee == null && obj != null) {
+ obj = isArrayLike(obj) ? obj : _.values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value > result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ _.each(obj, function(value, index, list) {
+ computed = iteratee(value, index, list);
+ if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+ result = value;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ };
+
+ // Return the minimum element (or element-based computation).
+ _.min = function(obj, iteratee, context) {
+ var result = Infinity, lastComputed = Infinity,
+ value, computed;
+ if (iteratee == null && obj != null) {
+ obj = isArrayLike(obj) ? obj : _.values(obj);
+ for (var i = 0, length = obj.length; i < length; i++) {
+ value = obj[i];
+ if (value < result) {
+ result = value;
+ }
+ }
+ } else {
+ iteratee = cb(iteratee, context);
+ _.each(obj, function(value, index, list) {
+ computed = iteratee(value, index, list);
+ if (computed < lastComputed || computed === Infinity && result === Infinity) {
+ result = value;
+ lastComputed = computed;
+ }
+ });
+ }
+ return result;
+ };
+
+ // Shuffle a collection, using the modern version of the
+ // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+ _.shuffle = function(obj) {
+ var set = isArrayLike(obj) ? obj : _.values(obj);
+ var length = set.length;
+ var shuffled = Array(length);
+ for (var index = 0, rand; index < length; index++) {
+ rand = _.random(0, index);
+ if (rand !== index) shuffled[index] = shuffled[rand];
+ shuffled[rand] = set[index];
+ }
+ return shuffled;
+ };
+
+ // Sample **n** random values from a collection.
+ // If **n** is not specified, returns a single random element.
+ // The internal `guard` argument allows it to work with `map`.
+ _.sample = function(obj, n, guard) {
+ if (n == null || guard) {
+ if (!isArrayLike(obj)) obj = _.values(obj);
+ return obj[_.random(obj.length - 1)];
+ }
+ return _.shuffle(obj).slice(0, Math.max(0, n));
+ };
+
+ // Sort the object's values by a criterion produced by an iteratee.
+ _.sortBy = function(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ return _.pluck(_.map(obj, function(value, index, list) {
+ return {
+ value: value,
+ index: index,
+ criteria: iteratee(value, index, list)
+ };
+ }).sort(function(left, right) {
+ var a = left.criteria;
+ var b = right.criteria;
+ if (a !== b) {
+ if (a > b || a === void 0) return 1;
+ if (a < b || b === void 0) return -1;
+ }
+ return left.index - right.index;
+ }), 'value');
+ };
+
+ // An internal function used for aggregate "group by" operations.
+ var group = function(behavior) {
+ return function(obj, iteratee, context) {
+ var result = {};
+ iteratee = cb(iteratee, context);
+ _.each(obj, function(value, index) {
+ var key = iteratee(value, index, obj);
+ behavior(result, value, key);
+ });
+ return result;
+ };
+ };
+
+ // Groups the object's values by a criterion. Pass either a string attribute
+ // to group by, or a function that returns the criterion.
+ _.groupBy = group(function(result, value, key) {
+ if (_.has(result, key)) result[key].push(value); else result[key] = [value];
+ });
+
+ // Indexes the object's values by a criterion, similar to `groupBy`, but for
+ // when you know that your index values will be unique.
+ _.indexBy = group(function(result, value, key) {
+ result[key] = value;
+ });
+
+ // Counts instances of an object that group by a certain criterion. Pass
+ // either a string attribute to count by, or a function that returns the
+ // criterion.
+ _.countBy = group(function(result, value, key) {
+ if (_.has(result, key)) result[key]++; else result[key] = 1;
+ });
+
+ // Safely create a real, live array from anything iterable.
+ _.toArray = function(obj) {
+ if (!obj) return [];
+ if (_.isArray(obj)) return slice.call(obj);
+ if (isArrayLike(obj)) return _.map(obj, _.identity);
+ return _.values(obj);
+ };
+
+ // Return the number of elements in an object.
+ _.size = function(obj) {
+ if (obj == null) return 0;
+ return isArrayLike(obj) ? obj.length : _.keys(obj).length;
+ };
+
+ // Split a collection into two arrays: one whose elements all satisfy the given
+ // predicate, and one whose elements all do not satisfy the predicate.
+ _.partition = function(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var pass = [], fail = [];
+ _.each(obj, function(value, key, obj) {
+ (predicate(value, key, obj) ? pass : fail).push(value);
+ });
+ return [pass, fail];
+ };
+
+ // Array Functions
+ // ---------------
+
+ // Get the first element of an array. Passing **n** will return the first N
+ // values in the array. Aliased as `head` and `take`. The **guard** check
+ // allows it to work with `_.map`.
+ _.first = _.head = _.take = function(array, n, guard) {
+ if (array == null) return void 0;
+ if (n == null || guard) return array[0];
+ return _.initial(array, array.length - n);
+ };
+
+ // Returns everything but the last entry of the array. Especially useful on
+ // the arguments object. Passing **n** will return all the values in
+ // the array, excluding the last N.
+ _.initial = function(array, n, guard) {
+ return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+ };
+
+ // Get the last element of an array. Passing **n** will return the last N
+ // values in the array.
+ _.last = function(array, n, guard) {
+ if (array == null) return void 0;
+ if (n == null || guard) return array[array.length - 1];
+ return _.rest(array, Math.max(0, array.length - n));
+ };
+
+ // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+ // Especially useful on the arguments object. Passing an **n** will return
+ // the rest N values in the array.
+ _.rest = _.tail = _.drop = function(array, n, guard) {
+ return slice.call(array, n == null || guard ? 1 : n);
+ };
+
+ // Trim out all falsy values from an array.
+ _.compact = function(array) {
+ return _.filter(array, _.identity);
+ };
+
+ // Internal implementation of a recursive `flatten` function.
+ var flatten = function(input, shallow, strict, startIndex) {
+ var output = [], idx = 0;
+ for (var i = startIndex || 0, length = getLength(input); i < length; i++) {
+ var value = input[i];
+ if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
+ //flatten current level of array or arguments object
+ if (!shallow) value = flatten(value, shallow, strict);
+ var j = 0, len = value.length;
+ output.length += len;
+ while (j < len) {
+ output[idx++] = value[j++];
+ }
+ } else if (!strict) {
+ output[idx++] = value;
+ }
+ }
+ return output;
+ };
+
+ // Flatten out an array, either recursively (by default), or just one level.
+ _.flatten = function(array, shallow) {
+ return flatten(array, shallow, false);
+ };
+
+ // Return a version of the array that does not contain the specified value(s).
+ _.without = function(array) {
+ return _.difference(array, slice.call(arguments, 1));
+ };
+
+ // Produce a duplicate-free version of the array. If the array has already
+ // been sorted, you have the option of using a faster algorithm.
+ // Aliased as `unique`.
+ _.uniq = _.unique = function(array, isSorted, iteratee, context) {
+ if (!_.isBoolean(isSorted)) {
+ context = iteratee;
+ iteratee = isSorted;
+ isSorted = false;
+ }
+ if (iteratee != null) iteratee = cb(iteratee, context);
+ var result = [];
+ var seen = [];
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var value = array[i],
+ computed = iteratee ? iteratee(value, i, array) : value;
+ if (isSorted) {
+ if (!i || seen !== computed) result.push(value);
+ seen = computed;
+ } else if (iteratee) {
+ if (!_.contains(seen, computed)) {
+ seen.push(computed);
+ result.push(value);
+ }
+ } else if (!_.contains(result, value)) {
+ result.push(value);
+ }
+ }
+ return result;
+ };
+
+ // Produce an array that contains the union: each distinct element from all of
+ // the passed-in arrays.
+ _.union = function() {
+ return _.uniq(flatten(arguments, true, true));
+ };
+
+ // Produce an array that contains every item shared between all the
+ // passed-in arrays.
+ _.intersection = function(array) {
+ var result = [];
+ var argsLength = arguments.length;
+ for (var i = 0, length = getLength(array); i < length; i++) {
+ var item = array[i];
+ if (_.contains(result, item)) continue;
+ for (var j = 1; j < argsLength; j++) {
+ if (!_.contains(arguments[j], item)) break;
+ }
+ if (j === argsLength) result.push(item);
+ }
+ return result;
+ };
+
+ // Take the difference between one array and a number of other arrays.
+ // Only the elements present in just the first array will remain.
+ _.difference = function(array) {
+ var rest = flatten(arguments, true, true, 1);
+ return _.filter(array, function(value){
+ return !_.contains(rest, value);
+ });
+ };
+
+ // Zip together multiple lists into a single array -- elements that share
+ // an index go together.
+ _.zip = function() {
+ return _.unzip(arguments);
+ };
+
+ // Complement of _.zip. Unzip accepts an array of arrays and groups
+ // each array's elements on shared indices
+ _.unzip = function(array) {
+ var length = array && _.max(array, getLength).length || 0;
+ var result = Array(length);
+
+ for (var index = 0; index < length; index++) {
+ result[index] = _.pluck(array, index);
+ }
+ return result;
+ };
+
+ // Converts lists into objects. Pass either a single array of `[key, value]`
+ // pairs, or two parallel arrays of the same length -- one of keys, and one of
+ // the corresponding values.
+ _.object = function(list, values) {
+ var result = {};
+ for (var i = 0, length = getLength(list); i < length; i++) {
+ if (values) {
+ result[list[i]] = values[i];
+ } else {
+ result[list[i][0]] = list[i][1];
+ }
+ }
+ return result;
+ };
+
+ // Generator function to create the findIndex and findLastIndex functions
+ function createPredicateIndexFinder(dir) {
+ return function(array, predicate, context) {
+ predicate = cb(predicate, context);
+ var length = getLength(array);
+ var index = dir > 0 ? 0 : length - 1;
+ for (; index >= 0 && index < length; index += dir) {
+ if (predicate(array[index], index, array)) return index;
+ }
+ return -1;
+ };
+ }
+
+ // Returns the first index on an array-like that passes a predicate test
+ _.findIndex = createPredicateIndexFinder(1);
+ _.findLastIndex = createPredicateIndexFinder(-1);
+
+ // Use a comparator function to figure out the smallest index at which
+ // an object should be inserted so as to maintain order. Uses binary search.
+ _.sortedIndex = function(array, obj, iteratee, context) {
+ iteratee = cb(iteratee, context, 1);
+ var value = iteratee(obj);
+ var low = 0, high = getLength(array);
+ while (low < high) {
+ var mid = Math.floor((low + high) / 2);
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+ }
+ return low;
+ };
+
+ // Generator function to create the indexOf and lastIndexOf functions
+ function createIndexFinder(dir, predicateFind, sortedIndex) {
+ return function(array, item, idx) {
+ var i = 0, length = getLength(array);
+ if (typeof idx == 'number') {
+ if (dir > 0) {
+ i = idx >= 0 ? idx : Math.max(idx + length, i);
+ } else {
+ length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+ }
+ } else if (sortedIndex && idx && length) {
+ idx = sortedIndex(array, item);
+ return array[idx] === item ? idx : -1;
+ }
+ if (item !== item) {
+ idx = predicateFind(slice.call(array, i, length), _.isNaN);
+ return idx >= 0 ? idx + i : -1;
+ }
+ for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+ if (array[idx] === item) return idx;
+ }
+ return -1;
+ };
+ }
+
+ // Return the position of the first occurrence of an item in an array,
+ // or -1 if the item is not included in the array.
+ // If the array is large and already in sort order, pass `true`
+ // for **isSorted** to use binary search.
+ _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex);
+ _.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
+
+ // Generate an integer Array containing an arithmetic progression. A port of
+ // the native Python `range()` function. See
+ // [the Python documentation](http://docs.python.org/library/functions.html#range).
+ _.range = function(start, stop, step) {
+ if (stop == null) {
+ stop = start || 0;
+ start = 0;
+ }
+ step = step || 1;
+
+ var length = Math.max(Math.ceil((stop - start) / step), 0);
+ var range = Array(length);
+
+ for (var idx = 0; idx < length; idx++, start += step) {
+ range[idx] = start;
+ }
+
+ return range;
+ };
+
+ // Function (ahem) Functions
+ // ------------------
+
+ // Determines whether to execute a function as a constructor
+ // or a normal function with the provided arguments
+ var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+ var self = baseCreate(sourceFunc.prototype);
+ var result = sourceFunc.apply(self, args);
+ if (_.isObject(result)) return result;
+ return self;
+ };
+
+ // Create a function bound to a given object (assigning `this`, and arguments,
+ // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
+ // available.
+ _.bind = function(func, context) {
+ if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+ if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
+ var args = slice.call(arguments, 2);
+ var bound = function() {
+ return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
+ };
+ return bound;
+ };
+
+ // Partially apply a function by creating a version that has had some of its
+ // arguments pre-filled, without changing its dynamic `this` context. _ acts
+ // as a placeholder, allowing any combination of arguments to be pre-filled.
+ _.partial = function(func) {
+ var boundArgs = slice.call(arguments, 1);
+ var bound = function() {
+ var position = 0, length = boundArgs.length;
+ var args = Array(length);
+ for (var i = 0; i < length; i++) {
+ args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
+ }
+ while (position < arguments.length) args.push(arguments[position++]);
+ return executeBound(func, bound, this, this, args);
+ };
+ return bound;
+ };
+
+ // Bind a number of an object's methods to that object. Remaining arguments
+ // are the method names to be bound. Useful for ensuring that all callbacks
+ // defined on an object belong to it.
+ _.bindAll = function(obj) {
+ var i, length = arguments.length, key;
+ if (length <= 1) throw new Error('bindAll must be passed function names');
+ for (i = 1; i < length; i++) {
+ key = arguments[i];
+ obj[key] = _.bind(obj[key], obj);
+ }
+ return obj;
+ };
+
+ // Memoize an expensive function by storing its results.
+ _.memoize = function(func, hasher) {
+ var memoize = function(key) {
+ var cache = memoize.cache;
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+ if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
+ return cache[address];
+ };
+ memoize.cache = {};
+ return memoize;
+ };
+
+ // Delays a function for the given number of milliseconds, and then calls
+ // it with the arguments supplied.
+ _.delay = function(func, wait) {
+ var args = slice.call(arguments, 2);
+ return setTimeout(function(){
+ return func.apply(null, args);
+ }, wait);
+ };
+
+ // Defers a function, scheduling it to run after the current call stack has
+ // cleared.
+ _.defer = _.partial(_.delay, _, 1);
+
+ // Returns a function, that, when invoked, will only be triggered at most once
+ // during a given window of time. Normally, the throttled function will run
+ // as much as it can, without ever going more than once per `wait` duration;
+ // but if you'd like to disable the execution on the leading edge, pass
+ // `{leading: false}`. To disable execution on the trailing edge, ditto.
+ _.throttle = function(func, wait, options) {
+ var context, args, result;
+ var timeout = null;
+ var previous = 0;
+ if (!options) options = {};
+ var later = function() {
+ previous = options.leading === false ? 0 : _.now();
+ timeout = null;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ };
+ return function() {
+ var now = _.now();
+ if (!previous && options.leading === false) previous = now;
+ var remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0 || remaining > wait) {
+ if (timeout) {
+ clearTimeout(timeout);
+ timeout = null;
+ }
+ previous = now;
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ } else if (!timeout && options.trailing !== false) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ };
+
+ // Returns a function, that, as long as it continues to be invoked, will not
+ // be triggered. The function will be called after it stops being called for
+ // N milliseconds. If `immediate` is passed, trigger the function on the
+ // leading edge, instead of the trailing.
+ _.debounce = function(func, wait, immediate) {
+ var timeout, args, context, timestamp, result;
+
+ var later = function() {
+ var last = _.now() - timestamp;
+
+ if (last < wait && last >= 0) {
+ timeout = setTimeout(later, wait - last);
+ } else {
+ timeout = null;
+ if (!immediate) {
+ result = func.apply(context, args);
+ if (!timeout) context = args = null;
+ }
+ }
+ };
+
+ return function() {
+ context = this;
+ args = arguments;
+ timestamp = _.now();
+ var callNow = immediate && !timeout;
+ if (!timeout) timeout = setTimeout(later, wait);
+ if (callNow) {
+ result = func.apply(context, args);
+ context = args = null;
+ }
+
+ return result;
+ };
+ };
+
+ // Returns the first function passed as an argument to the second,
+ // allowing you to adjust arguments, run code before and after, and
+ // conditionally execute the original function.
+ _.wrap = function(func, wrapper) {
+ return _.partial(wrapper, func);
+ };
+
+ // Returns a negated version of the passed-in predicate.
+ _.negate = function(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ };
+ };
+
+ // Returns a function that is the composition of a list of functions, each
+ // consuming the return value of the function that follows.
+ _.compose = function() {
+ var args = arguments;
+ var start = args.length - 1;
+ return function() {
+ var i = start;
+ var result = args[start].apply(this, arguments);
+ while (i--) result = args[i].call(this, result);
+ return result;
+ };
+ };
+
+ // Returns a function that will only be executed on and after the Nth call.
+ _.after = function(times, func) {
+ return function() {
+ if (--times < 1) {
+ return func.apply(this, arguments);
+ }
+ };
+ };
+
+ // Returns a function that will only be executed up to (but not including) the Nth call.
+ _.before = function(times, func) {
+ var memo;
+ return function() {
+ if (--times > 0) {
+ memo = func.apply(this, arguments);
+ }
+ if (times <= 1) func = null;
+ return memo;
+ };
+ };
+
+ // Returns a function that will be executed at most one time, no matter how
+ // often you call it. Useful for lazy initialization.
+ _.once = _.partial(_.before, 2);
+
+ // Object Functions
+ // ----------------
+
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+ function collectNonEnumProps(obj, keys) {
+ var nonEnumIdx = nonEnumerableProps.length;
+ var constructor = obj.constructor;
+ var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
+
+ // Constructor is a special case.
+ var prop = 'constructor';
+ if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
+
+ while (nonEnumIdx--) {
+ prop = nonEnumerableProps[nonEnumIdx];
+ if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
+ keys.push(prop);
+ }
+ }
+ }
+
+ // Retrieve the names of an object's own properties.
+ // Delegates to **ECMAScript 5**'s native `Object.keys`
+ _.keys = function(obj) {
+ if (!_.isObject(obj)) return [];
+ if (nativeKeys) return nativeKeys(obj);
+ var keys = [];
+ for (var key in obj) if (_.has(obj, key)) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+ };
+
+ // Retrieve all the property names of an object.
+ _.allKeys = function(obj) {
+ if (!_.isObject(obj)) return [];
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ // Ahem, IE < 9.
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
+ return keys;
+ };
+
+ // Retrieve the values of an object's properties.
+ _.values = function(obj) {
+ var keys = _.keys(obj);
+ var length = keys.length;
+ var values = Array(length);
+ for (var i = 0; i < length; i++) {
+ values[i] = obj[keys[i]];
+ }
+ return values;
+ };
+
+ // Returns the results of applying the iteratee to each element of the object
+ // In contrast to _.map it returns an object
+ _.mapObject = function(obj, iteratee, context) {
+ iteratee = cb(iteratee, context);
+ var keys = _.keys(obj),
+ length = keys.length,
+ results = {},
+ currentKey;
+ for (var index = 0; index < length; index++) {
+ currentKey = keys[index];
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+ }
+ return results;
+ };
+
+ // Convert an object into a list of `[key, value]` pairs.
+ _.pairs = function(obj) {
+ var keys = _.keys(obj);
+ var length = keys.length;
+ var pairs = Array(length);
+ for (var i = 0; i < length; i++) {
+ pairs[i] = [keys[i], obj[keys[i]]];
+ }
+ return pairs;
+ };
+
+ // Invert the keys and values of an object. The values must be serializable.
+ _.invert = function(obj) {
+ var result = {};
+ var keys = _.keys(obj);
+ for (var i = 0, length = keys.length; i < length; i++) {
+ result[obj[keys[i]]] = keys[i];
+ }
+ return result;
+ };
+
+ // Return a sorted list of the function names available on the object.
+ // Aliased as `methods`
+ _.functions = _.methods = function(obj) {
+ var names = [];
+ for (var key in obj) {
+ if (_.isFunction(obj[key])) names.push(key);
+ }
+ return names.sort();
+ };
+
+ // Extend a given object with all the properties in passed-in object(s).
+ _.extend = createAssigner(_.allKeys);
+
+ // Assigns a given object with all the own properties in the passed-in object(s)
+ // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+ _.extendOwn = _.assign = createAssigner(_.keys);
+
+ // Returns the first key on an object that passes a predicate test
+ _.findKey = function(obj, predicate, context) {
+ predicate = cb(predicate, context);
+ var keys = _.keys(obj), key;
+ for (var i = 0, length = keys.length; i < length; i++) {
+ key = keys[i];
+ if (predicate(obj[key], key, obj)) return key;
+ }
+ };
+
+ // Return a copy of the object only containing the whitelisted properties.
+ _.pick = function(object, oiteratee, context) {
+ var result = {}, obj = object, iteratee, keys;
+ if (obj == null) return result;
+ if (_.isFunction(oiteratee)) {
+ keys = _.allKeys(obj);
+ iteratee = optimizeCb(oiteratee, context);
+ } else {
+ keys = flatten(arguments, false, false, 1);
+ iteratee = function(value, key, obj) { return key in obj; };
+ obj = Object(obj);
+ }
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var key = keys[i];
+ var value = obj[key];
+ if (iteratee(value, key, obj)) result[key] = value;
+ }
+ return result;
+ };
+
+ // Return a copy of the object without the blacklisted properties.
+ _.omit = function(obj, iteratee, context) {
+ if (_.isFunction(iteratee)) {
+ iteratee = _.negate(iteratee);
+ } else {
+ var keys = _.map(flatten(arguments, false, false, 1), String);
+ iteratee = function(value, key) {
+ return !_.contains(keys, key);
+ };
+ }
+ return _.pick(obj, iteratee, context);
+ };
+
+ // Fill in a given object with default properties.
+ _.defaults = createAssigner(_.allKeys, true);
+
+ // Creates an object that inherits from the given prototype object.
+ // If additional properties are provided then they will be added to the
+ // created object.
+ _.create = function(prototype, props) {
+ var result = baseCreate(prototype);
+ if (props) _.extendOwn(result, props);
+ return result;
+ };
+
+ // Create a (shallow-cloned) duplicate of an object.
+ _.clone = function(obj) {
+ if (!_.isObject(obj)) return obj;
+ return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+ };
+
+ // Invokes interceptor with the obj, and then returns obj.
+ // The primary purpose of this method is to "tap into" a method chain, in
+ // order to perform operations on intermediate results within the chain.
+ _.tap = function(obj, interceptor) {
+ interceptor(obj);
+ return obj;
+ };
+
+ // Returns whether an object has a given set of `key:value` pairs.
+ _.isMatch = function(object, attrs) {
+ var keys = _.keys(attrs), length = keys.length;
+ if (object == null) return !length;
+ var obj = Object(object);
+ for (var i = 0; i < length; i++) {
+ var key = keys[i];
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
+ }
+ return true;
+ };
+
+
+ // Internal recursive comparison function for `isEqual`.
+ var eq = function(a, b, aStack, bStack) {
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
+ // A strict comparison is necessary because `null == undefined`.
+ if (a == null || b == null) return a === b;
+ // Unwrap any wrapped objects.
+ if (a instanceof _) a = a._wrapped;
+ if (b instanceof _) b = b._wrapped;
+ // Compare `[[Class]]` names.
+ var className = toString.call(a);
+ if (className !== toString.call(b)) return false;
+ switch (className) {
+ // Strings, numbers, regular expressions, dates, and booleans are compared by value.
+ case '[object RegExp]':
+ // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ return '' + a === '' + b;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive.
+ // Object(NaN) is equivalent to NaN
+ if (+a !== +a) return +b !== +b;
+ // An `egal` comparison is performed for other numeric values.
+ return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ return +a === +b;
+ }
+
+ var areArrays = className === '[object Array]';
+ if (!areArrays) {
+ if (typeof a != 'object' || typeof b != 'object') return false;
+
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+ // from different frames are.
+ var aCtor = a.constructor, bCtor = b.constructor;
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
+ _.isFunction(bCtor) && bCtor instanceof bCtor)
+ && ('constructor' in a && 'constructor' in b)) {
+ return false;
+ }
+ }
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+ // Initializing stack of traversed objects.
+ // It's done here since we only need them for objects and arrays comparison.
+ aStack = aStack || [];
+ bStack = bStack || [];
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] === a) return bStack[length] === b;
+ }
+
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+
+ // Recursively compare objects and arrays.
+ if (areArrays) {
+ // Compare array lengths to determine if a deep comparison is necessary.
+ length = a.length;
+ if (length !== b.length) return false;
+ // Deep compare the contents, ignoring non-numeric properties.
+ while (length--) {
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
+ }
+ } else {
+ // Deep compare objects.
+ var keys = _.keys(a), key;
+ length = keys.length;
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (_.keys(b).length !== length) return false;
+ while (length--) {
+ // Deep compare each member
+ key = keys[length];
+ if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+ }
+ }
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+ return true;
+ };
+
+ // Perform a deep comparison to check if two objects are equal.
+ _.isEqual = function(a, b) {
+ return eq(a, b);
+ };
+
+ // Is a given array, string, or object empty?
+ // An "empty" object has no enumerable own-properties.
+ _.isEmpty = function(obj) {
+ if (obj == null) return true;
+ if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
+ return _.keys(obj).length === 0;
+ };
+
+ // Is a given value a DOM element?
+ _.isElement = function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ };
+
+ // Is a given value an array?
+ // Delegates to ECMA5's native Array.isArray
+ _.isArray = nativeIsArray || function(obj) {
+ return toString.call(obj) === '[object Array]';
+ };
+
+ // Is a given variable an object?
+ _.isObject = function(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ };
+
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
+ _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
+ _['is' + name] = function(obj) {
+ return toString.call(obj) === '[object ' + name + ']';
+ };
+ });
+
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
+ // there isn't any inspectable "Arguments" type.
+ if (!_.isArguments(arguments)) {
+ _.isArguments = function(obj) {
+ return _.has(obj, 'callee');
+ };
+ }
+
+ // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
+ // IE 11 (#1621), and in Safari 8 (#1929).
+ if (typeof /./ != 'function' && typeof Int8Array != 'object') {
+ _.isFunction = function(obj) {
+ return typeof obj == 'function' || false;
+ };
+ }
+
+ // Is a given object a finite number?
+ _.isFinite = function(obj) {
+ return isFinite(obj) && !isNaN(parseFloat(obj));
+ };
+
+ // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+ _.isNaN = function(obj) {
+ return _.isNumber(obj) && obj !== +obj;
+ };
+
+ // Is a given value a boolean?
+ _.isBoolean = function(obj) {
+ return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+ };
+
+ // Is a given value equal to null?
+ _.isNull = function(obj) {
+ return obj === null;
+ };
+
+ // Is a given variable undefined?
+ _.isUndefined = function(obj) {
+ return obj === void 0;
+ };
+
+ // Shortcut function for checking if an object has a given property directly
+ // on itself (in other words, not on a prototype).
+ _.has = function(obj, key) {
+ return obj != null && hasOwnProperty.call(obj, key);
+ };
+
+ // Utility Functions
+ // -----------------
+
+ // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+ // previous owner. Returns a reference to the Underscore object.
+ _.noConflict = function() {
+ root._ = previousUnderscore;
+ return this;
+ };
+
+ // Keep the identity function around for default iteratees.
+ _.identity = function(value) {
+ return value;
+ };
+
+ // Predicate-generating functions. Often useful outside of Underscore.
+ _.constant = function(value) {
+ return function() {
+ return value;
+ };
+ };
+
+ _.noop = function(){};
+
+ _.property = property;
+
+ // Generates a function for a given object that returns a given property.
+ _.propertyOf = function(obj) {
+ return obj == null ? function(){} : function(key) {
+ return obj[key];
+ };
+ };
+
+ // Returns a predicate for checking whether an object has a given set of
+ // `key:value` pairs.
+ _.matcher = _.matches = function(attrs) {
+ attrs = _.extendOwn({}, attrs);
+ return function(obj) {
+ return _.isMatch(obj, attrs);
+ };
+ };
+
+ // Run a function **n** times.
+ _.times = function(n, iteratee, context) {
+ var accum = Array(Math.max(0, n));
+ iteratee = optimizeCb(iteratee, context, 1);
+ for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+ return accum;
+ };
+
+ // Return a random integer between min and max (inclusive).
+ _.random = function(min, max) {
+ if (max == null) {
+ max = min;
+ min = 0;
+ }
+ return min + Math.floor(Math.random() * (max - min + 1));
+ };
+
+ // A (possibly faster) way to get the current timestamp as an integer.
+ _.now = Date.now || function() {
+ return new Date().getTime();
+ };
+
+ // List of HTML entities for escaping.
+ var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '`': '`'
+ };
+ var unescapeMap = _.invert(escapeMap);
+
+ // Functions for escaping and unescaping strings to/from HTML interpolation.
+ var createEscaper = function(map) {
+ var escaper = function(match) {
+ return map[match];
+ };
+ // Regexes for identifying a key that needs to be escaped
+ var source = '(?:' + _.keys(map).join('|') + ')';
+ var testRegexp = RegExp(source);
+ var replaceRegexp = RegExp(source, 'g');
+ return function(string) {
+ string = string == null ? '' : '' + string;
+ return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+ };
+ };
+ _.escape = createEscaper(escapeMap);
+ _.unescape = createEscaper(unescapeMap);
+
+ // If the value of the named `property` is a function then invoke it with the
+ // `object` as context; otherwise, return it.
+ _.result = function(object, property, fallback) {
+ var value = object == null ? void 0 : object[property];
+ if (value === void 0) {
+ value = fallback;
+ }
+ return _.isFunction(value) ? value.call(object) : value;
+ };
+
+ // Generate a unique integer id (unique within the entire client session).
+ // Useful for temporary DOM ids.
+ var idCounter = 0;
+ _.uniqueId = function(prefix) {
+ var id = ++idCounter + '';
+ return prefix ? prefix + id : id;
+ };
+
+ // By default, Underscore uses ERB-style template delimiters, change the
+ // following template settings to use alternative delimiters.
+ _.templateSettings = {
+ evaluate : /<%([\s\S]+?)%>/g,
+ interpolate : /<%=([\s\S]+?)%>/g,
+ escape : /<%-([\s\S]+?)%>/g
+ };
+
+ // When customizing `templateSettings`, if you don't want to define an
+ // interpolation, evaluation or escaping regex, we need one that is
+ // guaranteed not to match.
+ var noMatch = /(.)^/;
+
+ // Certain characters need to be escaped so that they can be put into a
+ // string literal.
+ var escapes = {
+ "'": "'",
+ '\\': '\\',
+ '\r': 'r',
+ '\n': 'n',
+ '\u2028': 'u2028',
+ '\u2029': 'u2029'
+ };
+
+ var escaper = /\\|'|\r|\n|\u2028|\u2029/g;
+
+ var escapeChar = function(match) {
+ return '\\' + escapes[match];
+ };
+
+ // JavaScript micro-templating, similar to John Resig's implementation.
+ // Underscore templating handles arbitrary delimiters, preserves whitespace,
+ // and correctly escapes quotes within interpolated code.
+ // NB: `oldSettings` only exists for backwards compatibility.
+ _.template = function(text, settings, oldSettings) {
+ if (!settings && oldSettings) settings = oldSettings;
+ settings = _.defaults({}, settings, _.templateSettings);
+
+ // Combine delimiters into one regular expression via alternation.
+ var matcher = RegExp([
+ (settings.escape || noMatch).source,
+ (settings.interpolate || noMatch).source,
+ (settings.evaluate || noMatch).source
+ ].join('|') + '|$', 'g');
+
+ // Compile the template source, escaping string literals appropriately.
+ var index = 0;
+ var source = "__p+='";
+ text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+ source += text.slice(index, offset).replace(escaper, escapeChar);
+ index = offset + match.length;
+
+ if (escape) {
+ source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+ } else if (interpolate) {
+ source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+ } else if (evaluate) {
+ source += "';\n" + evaluate + "\n__p+='";
+ }
+
+ // Adobe VMs need the match returned to produce the correct offest.
+ return match;
+ });
+ source += "';\n";
+
+ // If a variable is not specified, place data values in local scope.
+ if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+ source = "var __t,__p='',__j=Array.prototype.join," +
+ "print=function(){__p+=__j.call(arguments,'');};\n" +
+ source + 'return __p;\n';
+
+ try {
+ var render = new Function(settings.variable || 'obj', '_', source);
+ } catch (e) {
+ e.source = source;
+ throw e;
+ }
+
+ var template = function(data) {
+ return render.call(this, data, _);
+ };
+
+ // Provide the compiled source as a convenience for precompilation.
+ var argument = settings.variable || 'obj';
+ template.source = 'function(' + argument + '){\n' + source + '}';
+
+ return template;
+ };
+
+ // Add a "chain" function. Start chaining a wrapped Underscore object.
+ _.chain = function(obj) {
+ var instance = _(obj);
+ instance._chain = true;
+ return instance;
+ };
+
+ // OOP
+ // ---------------
+ // If Underscore is called as a function, it returns a wrapped object that
+ // can be used OO-style. This wrapper holds altered versions of all the
+ // underscore functions. Wrapped objects may be chained.
+
+ // Helper function to continue chaining intermediate results.
+ var result = function(instance, obj) {
+ return instance._chain ? _(obj).chain() : obj;
+ };
+
+ // Add your own custom functions to the Underscore object.
+ _.mixin = function(obj) {
+ _.each(_.functions(obj), function(name) {
+ var func = _[name] = obj[name];
+ _.prototype[name] = function() {
+ var args = [this._wrapped];
+ push.apply(args, arguments);
+ return result(this, func.apply(_, args));
+ };
+ });
+ };
+
+ // Add all of the Underscore functions to the wrapper object.
+ _.mixin(_);
+
+ // Add all mutator Array functions to the wrapper.
+ _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ var obj = this._wrapped;
+ method.apply(obj, arguments);
+ if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
+ return result(this, obj);
+ };
+ });
+
+ // Add all accessor Array functions to the wrapper.
+ _.each(['concat', 'join', 'slice'], function(name) {
+ var method = ArrayProto[name];
+ _.prototype[name] = function() {
+ return result(this, method.apply(this._wrapped, arguments));
+ };
+ });
+
+ // Extracts the result from a wrapped and chained object.
+ _.prototype.value = function() {
+ return this._wrapped;
+ };
+
+ // Provide unwrapping proxy for some methods used in engine operations
+ // such as arithmetic and JSON stringification.
+ _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+ _.prototype.toString = function() {
+ return '' + this._wrapped;
+ };
+
+ // AMD registration happens at the end for compatibility with AMD loaders
+ // that may not enforce next-turn semantics on modules. Even though general
+ // practice for AMD registration is to be anonymous, underscore registers
+ // as a named module because, like jQuery, it is a base library that is
+ // popular enough to be bundled in a third party lib, but not be part of
+ // an AMD load request. Those cases could generate an error when an
+ // anonymous define() is called outside of a loader request.
+ if (typeof define === 'function' && define.amd) {
+ define('underscore', [], function() {
+ return _;
+ });
+ }
+}.call(this));
+
+},{}],26:[function(require,module,exports){
+arguments[4][19][0].apply(exports,arguments)
+},{"dup":19}],27:[function(require,module,exports){
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+},{}],28:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+ 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = require('./support/isBuffer');
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":27,"_process":24,"inherits":26}],29:[function(require,module,exports){
+// Returns a wrapper function that returns a wrapped callback
+// The wrapper function should do some stuff, and return a
+// presumably different callback function.
+// This makes sure that own properties are retained, so that
+// decorations and such are not lost along the way.
+module.exports = wrappy
+function wrappy (fn, cb) {
+ if (fn && cb) return wrappy(fn)(cb)
+
+ if (typeof fn !== 'function')
+ throw new TypeError('need wrapper function')
+
+ Object.keys(fn).forEach(function (k) {
+ wrapper[k] = fn[k]
+ })
+
+ return wrapper
+
+ function wrapper() {
+ var args = new Array(arguments.length)
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i]
+ }
+ var ret = fn.apply(this, args)
+ var cb = args[args.length-1]
+ if (typeof ret === 'function' && ret !== cb) {
+ Object.keys(cb).forEach(function (k) {
+ ret[k] = cb[k]
+ })
+ }
+ return ret
+ }
+}
+
+},{}]},{},[7])(7)
+});
\ No newline at end of file
diff --git a/assets/javascripts/workers/search.2c215733.min.js b/assets/javascripts/workers/search.2c215733.min.js
new file mode 100644
index 0000000..6e2e3ea
--- /dev/null
+++ b/assets/javascripts/workers/search.2c215733.min.js
@@ -0,0 +1,42 @@
+"use strict";(()=>{var xe=Object.create;var G=Object.defineProperty,ve=Object.defineProperties,Se=Object.getOwnPropertyDescriptor,Te=Object.getOwnPropertyDescriptors,Qe=Object.getOwnPropertyNames,J=Object.getOwnPropertySymbols,Ee=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty,be=Object.prototype.propertyIsEnumerable;var K=Math.pow,X=(t,e,r)=>e in t?G(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,_=(t,e)=>{for(var r in e||(e={}))Z.call(e,r)&&X(t,r,e[r]);if(J)for [...]
+ * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9
+ * Copyright (C) 2020 Oliver Nightingale
+ * @license MIT
+ */(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";/*!
+ * lunr.utils
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.utils={},t.utils.warn=(function(e){return function(r){e.console&&console.warn&&console.warn(r)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i<n.length;i++){var s=n[i],o=e[s];if(Array.isArray(o)){r[s]=o.slice();continue}if(typeof o=="string"||typeof o=="number"||typeof o=="boolean"){r[s]=o;continue}throw new TypeError("clone is not deep and does not support nested [...]
+ * lunr.Set
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var r=0;r<this.length;r++)this.elements[e[r]]=!0}else this.length=0},t.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},t.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},t.Set.prototype.contains=function(e){return!!this.elements[e]},t.Set.prototype.intersect=function(e){var r,n,i,s=[];if(e== [...]
+ * lunr.tokenizer
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.tokenizer=function(e,r){if(e==null||e==null)return[];if(Array.isArray(e))return e.map(function(g){return new t.Token(t.utils.asString(g).toLowerCase(),t.utils.clone(r))});for(var n=e.toString().toLowerCase(),i=n.length,s=[],o=0,a=0;o<=i;o++){var u=n.charAt(o),c=o-a;if(u.match(t.tokenizer.separator)||o==i){if(c>0){var f=t.utils.clone(r)||{};f.position=[a,c],f.index=s.length,s.push(new t.Token(n.slice(a,o),f))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;/*!
+ * lunr.Pipeline
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index.
+`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if( [...]
+ * lunr.Vector
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.Vector=function(e){this._magnitude=0,this.elements=e||[]},t.Vector.prototype.positionForIndex=function(e){if(this.elements.length==0)return 0;for(var r=0,n=this.elements.length/2,i=n-r,s=Math.floor(i/2),o=this.elements[s*2];i>1&&(o<e&&(r=s),o>e&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(o<e)return(s+1)*2},t.Vector.prototype.insert=function(e,r){this.upsert(e,r,function(){throw"duplicate index"})},t.Vector.prototype.upsert=function(e,r,n){ [...]
+ * lunr.stemmer
+ * Copyright (C) 2020 Oliver Nightingale
+ * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt
+ */t.stemmer=(function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},r={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",s=n+"[^aeiouy]*",o=i+"[aeiou]*",a="^("+s+")?"+o+s,u="^("+s+")?"+o+s+"("+o+")?$",c="^("+s+")?"+o+s+o+s,f="^("+s [...]
+ * lunr.stopWordFilter
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.generateStopWordFilter=function(e){var r=e.reduce(function(n,i){return n[i]=i,n},{});return function(n){if(n&&r[n.toString()]!==n.toString())return n}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","h [...]
+ * lunr.trimmer
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.trimmer=function(e){return e.update(function(r){return r.replace(/^\W+/,"").replace(/\W+$/,"")})},t.Pipeline.registerFunction(t.trimmer,"trimmer");/*!
+ * lunr.TokenSet
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.TokenSet=function(){this.final=!1,this.edges={},this.id=t.TokenSet._nextId,t.TokenSet._nextId+=1},t.TokenSet._nextId=1,t.TokenSet.fromArray=function(e){for(var r=new t.TokenSet.Builder,n=0,i=e.length;n<i;n++)r.insert(e[n]);return r.finish(),r.root},t.TokenSet.fromClause=function(e){return"editDistance"in e?t.TokenSet.fromFuzzyString(e.term,e.editDistance):t.TokenSet.fromString(e.term)},t.TokenSet.fromFuzzyString=function(e,r){for(var n=new t.TokenSet,i=[{node:n,editsRemaining:r,str: [...]
+ * lunr.Index
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u<this.fields.length;u++)i[this.fie [...]
+ * lunr.Builder
+ * Copyright (C) 2020 Oliver Nightingale
+ */t.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=t.tokenizer,this.pipeline=new t.Pipeline,this.searchPipeline=new t.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},t.Builder.prototype.ref=function(e){this._ref=e},t.Builder.prototype.field=function(e,r){if(/\//.test(e))throw new [...]
+//# sourceMappingURL=search.2c215733.min.js.map
+
diff --git a/assets/javascripts/workers/search.2c215733.min.js.map b/assets/javascripts/workers/search.2c215733.min.js.map
new file mode 100644
index 0000000..1e04289
--- /dev/null
+++ b/assets/javascripts/workers/search.2c215733.min.js.map
@@ -0,0 +1,7 @@
+{
+ "version": 3,
+ "sources": ["node_modules/lunr/lunr.js", "src/templates/assets/javascripts/integrations/search/worker/main/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/polyfills/index.ts", "src/templates/assets/javascripts/integrations/search/config/index.ts", "src/templates/assets/javascripts/integrations/search/internal/_/index.ts", "src/templates/assets/javascripts/integrations/search/internal/extract/index.ts", "src/templates/assets/ja [...]
+ "sourcesContent": ["/**\n * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9\n * Copyright (C) 2020 Oliver Nightingale\n * @license MIT\n */\n\n;(function(){\n\n/**\n * A convenience function for configuring and constructing\n * a new lunr Index.\n *\n * A lunr.Builder instance is created and the pipeline setup\n * with a trimmer, stop word filter and stemmer.\n *\n * This builder object is yielded to the configuration function\n * that is passed a [...]
+ "mappings": "6lCAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA;AAAA;AAAA;AAAA;AAAA,IAME,UAAU,CAiCZ,IAAIC,EAAO,SAAUC,EAAQ,CAC3B,IAAIC,EAAU,IAAIF,EAAK,QAEvB,OAAAE,EAAQ,SAAS,IACfF,EAAK,QACLA,EAAK,eACLA,EAAK,OACP,EAEAE,EAAQ,eAAe,IACrBF,EAAK,OACP,EAEAC,EAAO,KAAKC,EAASA,CAAO,EACrBA,EAAQ,MAAM,CACvB,EAEAF,EAAK,QAAU,QACf;AAAA;AAAA;AAAA,GASAA,EAAK,MAAQ,CAAC,EASdA,EAAK,MAAM,MAAQ,SAAUG,EAAQ,CAEnC,OAAO,SAAUC,EAAS,CACpBD,EAAO,SAAW,QAAQ,MAC5B,QAAQ,KAAKC,CAAO,CAExB,CAEF,GAAG,IAAI,EAaPJ,EAAK,MAAM,SAAW,SAAUK,EAA [...]
+ "names": ["require_lunr", "__commonJSMin", "exports", "module", "lunr", "config", "builder", "global", "message", "obj", "clone", "keys", "key", "val", "docRef", "fieldName", "stringValue", "s", "n", "fieldRef", "elements", "i", "other", "object", "a", "b", "intersection", "element", "posting", "documentCount", "documentsWithTerm", "x", "str", "metadata", "fn", "t", "len", "tokens", "sliceEnd", "sliceStart", "char", "sliceLength", "tokenMetadata", "label", "isRegistered", "serialised", [...]
+}
diff --git a/assets/stylesheets/bootstrap.min.css b/assets/stylesheets/bootstrap.min.css
new file mode 100644
index 0000000..3993414
--- /dev/null
+++ b/assets/stylesheets/bootstrap.min.css
@@ -0,0 +1,6 @@
+@charset "UTF-8";/*!
+ * Bootstrap v5.3.3 (https://getbootstrap.com/)
+ * Copyright 2011-2024 The Bootstrap Authors
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;-- [...]
+/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/assets/stylesheets/global.css b/assets/stylesheets/global.css
new file mode 100644
index 0000000..2649c98
--- /dev/null
+++ b/assets/stylesheets/global.css
@@ -0,0 +1,700 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+/*
+ * global.css — Shared design tokens, typography, colors, and components
+ * used across all pages on the Apache Ossie website.
+ *
+ * Loaded before page-specific stylesheets (e.g. home.css) so that tokens
+ * and utility classes are available everywhere.
+ */
+
+/* ==========================================================================
+ CSS Custom Properties (Design Tokens)
+ ========================================================================== */
+:root {
+ /* Brand blues (from Apache Ossie logo) */
+ --ossie-primary-blue: #0093C7;
+ --ossie-dark-blue: #004C82;
+ --ossie-navy: #111827;
+ --ossie-light-blue: #E0F2FE;
+ --ossie-ice-blue: #F0F9FF;
+
+ /* Brand green (from Apache Ossie logo) */
+ --ossie-accent-green: #07A77F;
+ --ossie-light-green: #ECFDF5;
+
+ /* Accent purple (for gradients, borrowed from reference) */
+ --ossie-accent-purple: #7C3AED;
+ --ossie-light-purple: #EDE9FE;
+
+ /* Danger red (challenge card, code-dot) */
+ --osi-danger-red: #EF4444;
+ --osi-danger-red-light: #FEE2E2;
+
+ /* Link colors for use on dark backgrounds */
+ --osi-link-on-dark: #60A5FA;
+ --osi-link-on-dark-hover: #93C5FD;
+
+ /* Neutrals */
+ --ossie-white: #FFFFFF;
+ --ossie-gray-50: #F9FAFB;
+ --ossie-gray-100: #F3F4F6;
+ --ossie-gray-200: #E5E7EB;
+ --ossie-gray-300: #D1D5DB;
+ --ossie-gray-400: #9CA3AF;
+ --ossie-gray-500: #6B7280;
+ --ossie-gray-600: #4B5563;
+ --ossie-gray-700: #374151;
+ --ossie-gray-800: #1F2937;
+ --ossie-gray-900: #111827;
+
+ /* Spacing */
+ --ossie-spacing-xs: 0.4rem;
+ --ossie-spacing-sm: 0.8rem;
+ --ossie-spacing-md: 1.6rem;
+ --ossie-spacing-lg: 3.2rem;
+ --ossie-spacing-xl: 4.8rem;
+
+ /* Bootstrap body overrides */
+ --bs-body-font-family: 'Inter', system-ui, -apple-system, sans-serif;
+ --bs-body-font-weight: 400;
+ --bs-body-font-size: 0.85rem;
+ --bs-body-line-height: 1.5;
+
+ /* Font scale */
+ --ossie-font-small: 0.75rem;
+ --ossie-font-caption: 0.8rem;
+ --ossie-font-body: 0.85rem;
+ --ossie-font-lead: 0.875rem;
+
+ /* Heading tokens */
+ --ossie-font-heading-sm: 0.8rem;
+ --ossie-font-heading-md: 0.875rem;
+ --ossie-font-heading-lg: 1rem;
+ --ossie-font-heading-xl: 1.15rem;
+
+ /* Bootstrap link overrides */
+ --bs-link-color: var(--ossie-dark-blue);
+ --bs-link-color-rgb: 0, 76, 130;
+ --bs-link-hover-color: var(--ossie-primary-blue);
+ --bs-link-decoration: none;
+}
+
+
+/* ==========================================================================
+ Material for MkDocs — Custom Palette
+ ========================================================================== */
+
+[data-md-color-primary=custom] {
+ --md-primary-fg-color: var(--ossie-primary-blue);
+ --md-primary-fg-color--light: var(--ossie-light-blue);
+ --md-primary-fg-color--dark: var(--ossie-dark-blue);
+ --md-primary-bg-color: var(--ossie-white);
+ --md-primary-bg-color--light: rgba(255, 255, 255, 0.7);
+ --md-typeset-a-color: var(--ossie-dark-blue);
+}
+
+[data-md-color-accent=custom] {
+ --md-accent-fg-color: var(--ossie-primary-blue);
+ --md-accent-fg-color--transparent: rgba(0, 147, 199, 0.1);
+}
+
+
+/* ==========================================================================
+ Global Link Styles
+ ========================================================================== */
+
+a,
+.md-typeset a {
+ text-decoration: none;
+}
+
+
+/* ==========================================================================
+ Heading Overrides
+ ========================================================================== */
+
+h1, .h1, .md-typeset h1 {
+ font-size: var(--ossie-font-heading-xl);
+ font-weight: 700;
+ font-family: 'Inter', system-ui, sans-serif;
+ line-height: 1.2;
+ letter-spacing: -0.025em;
+ margin: 0 0 0.625em;
+ color: var(--ossie-gray-900);
+}
+
+h2, .h2, .md-typeset h2 {
+ font-size: var(--ossie-font-heading-lg);
+ font-weight: 700;
+ font-family: 'Inter', system-ui, sans-serif;
+ line-height: 1.3;
+ letter-spacing: -0.02em;
+ margin: 0.64em 0 0.4em;
+ color: var(--ossie-gray-900);
+}
+
+h3, .h3, .md-typeset h3 {
+ font-size: var(--ossie-font-heading-md);
+ font-weight: 600;
+ font-family: 'Inter', system-ui, sans-serif;
+ line-height: 1.4;
+ letter-spacing: -0.01em;
+ margin: 0.8em 0 0.4em;
+ color: var(--ossie-gray-900);
+}
+
+h4, .h4, .md-typeset h4 {
+ font-size: var(--ossie-font-heading-sm);
+ font-weight: 600;
+ font-family: 'Inter', system-ui, sans-serif;
+ line-height: 1.4;
+ margin: 1em 0;
+ color: var(--ossie-gray-800);
+}
+
+h5, .h5, .md-typeset h5 {
+ font-size: var(--osi-font-heading-md);
+ font-weight: 600;
+ font-family: 'Inter', system-ui, sans-serif;
+ line-height: 1.4;
+ margin: 1.25em 0;
+}
+
+h6, .h6, .md-typeset h6 {
+ font-size: 0.8125rem;
+ font-weight: 600;
+ font-family: 'Inter', system-ui, sans-serif;
+ line-height: 1.4;
+ margin: 1.25em 0;
+}
+
+.lead { font-size: var(--ossie-font-lead); }
+
+
+/* ==========================================================================
+ Text Colors
+ ========================================================================== */
+
+.ossie-text-dark-blue { color: var(--ossie-dark-blue); }
+.ossie-text-dark-gray { color: var(--ossie-gray-600); }
+.ossie-text-gray { color: var(--ossie-gray-500); }
+.ossie-text-primary { color: var(--ossie-primary-blue); }
+
+/* Gradient text utility */
+.ossie-text-gradient {
+ background: linear-gradient(135deg, var(--ossie-primary-blue), var(--ossie-accent-purple));
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+
+/* ==========================================================================
+ Custom Header: single-bar layout (logo | nav links | search)
+ ========================================================================== */
+
+.md-header,
+.md-header[data-md-state],
+.md-header[data-md-state="shadow"] {
+ background-color: rgba(255, 255, 255, 0.95) !important;
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
+ border-bottom: 1px solid var(--ossie-gray-200);
+ color: var(--ossie-gray-700) !important;
+}
+
+.md-header .md-header__button {
+ color: var(--ossie-gray-700);
+}
+
+/* Compact header height */
+.md-header[data-md-component="header"] {
+ font-size: 0.8rem;
+}
+
+.md-header .md-logo img,
+.md-header .md-logo svg {
+ height: 1.2rem;
+ width: auto;
+}
+
+/* Icon + text brand (replaces the wordmark image in the header) */
+.md-header__brand {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ width: auto;
+ padding: 0;
+}
+
+.md-header .md-logo img.md-header__brand-icon {
+ height: 1.6rem;
+ width: auto;
+ flex-shrink: 0;
+}
+
+.md-header__brand-text {
+ font-weight: 700;
+ font-size: 1rem;
+ line-height: 1.2;
+ white-space: nowrap;
+ color: var(--ossie-dark-blue);
+}
+
+.md-tabs {
+ display: none;
+}
+
+.md-header__inner {
+ display: flex;
+ align-items: center;
+ padding-top: 0.3rem;
+ padding-bottom: 0.3rem;
+}
+
+.md-header__left {
+ display: flex;
+ align-items: center;
+ flex-shrink: 0;
+}
+
+.md-header__center {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+}
+
+.md-header__nav {
+ display: flex;
+ align-items: center;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ gap: 1.5rem;
+}
+
+.md-header__nav-item {
+ display: flex;
+ align-items: center;
+}
+
+.md-header__nav-link {
+ color: var(--ossie-gray-700);
+ font-size: 0.75rem;
+ font-weight: 500;
+ padding: 0.35rem 0;
+ transition: color 0.15s;
+}
+
+.md-header__nav-link:hover {
+ color: var(--ossie-primary-blue);
+}
+
+.ossie-external-icon {
+ width: 0.65em;
+ height: 0.65em;
+ margin-left: 0.25em;
+ vertical-align: baseline;
+ position: relative;
+ top: -0.05em;
+}
+
+.md-post--external .md-post__content > h2 a::after,
+.md-post--external .md-post__content > h1 a::after {
+ content: "";
+ display: inline-block;
+ width: 0.55em;
+ height: 0.55em;
+ margin-left: 0.3em;
+ vertical-align: baseline;
+ position: relative;
+ top: -0.05em;
+ background-color: currentColor;
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M352 0c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9L370.7 96 201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L416 141.3l41.4 41.4c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-128c0-17.7-14.3-32-32-32L352 0zM80 32C35.8 32 0 67.8 0 112L0 432c0 44.2 35.8 80 80 80l320 0c44.2 0 80-35.8 80-80l0-160c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160c0 8.8-7.2 16-16 16L80 448c-8 [...]
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M352 0c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9L370.7 96 201.4 265.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L416 141.3l41.4 41.4c9.2 9.2 22.9 11.9 34.9 6.9s19.8-16.6 19.8-29.6l0-128c0-17.7-14.3-32-32-32L352 0zM80 32C35.8 32 0 67.8 0 112L0 432c0 44.2 35.8 80 80 80l320 0c44.2 0 80-35.8 80-80l0-160c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 160c0 8.8-7.2 16-16 16L8 [...]
+ mask-size: contain;
+ -webkit-mask-size: contain;
+ mask-repeat: no-repeat;
+ -webkit-mask-repeat: no-repeat;
+}
+
+.md-header__nav-link:active {
+ color: var(--ossie-primary-blue);
+}
+
+.md-header__nav-item--active .md-header__nav-link {
+ color: var(--ossie-primary-blue);
+}
+
+/* ASF menu (top-right dropdown) */
+.md-header__asf {
+ position: relative;
+ display: flex;
+ align-items: center;
+}
+
+.md-header__asf-trigger {
+ display: inline-flex;
+ align-items: center;
+ gap: 0.15rem;
+ background: none;
+ border: none;
+ cursor: pointer;
+ color: var(--ossie-gray-700);
+ font-size: 0.75rem;
+ font-weight: 500;
+ font-family: inherit;
+ padding: 0.35rem 0;
+ transition: color 0.15s;
+}
+
+.md-header__asf-trigger:hover,
+.md-header__asf:hover .md-header__asf-trigger,
+.md-header__asf:focus-within .md-header__asf-trigger {
+ color: var(--ossie-primary-blue);
+}
+
+.md-header__asf-caret {
+ width: 0.85em;
+ height: 0.85em;
+ transition: transform 0.15s;
+}
+
+.md-header__asf:hover .md-header__asf-caret,
+.md-header__asf:focus-within .md-header__asf-caret {
+ transform: rotate(180deg);
+}
+
+.md-header__asf-menu {
+ position: absolute;
+ top: 100%;
+ right: 0;
+ min-width: 11rem;
+ margin: 0.4rem 0 0;
+ padding: 0.35rem 0;
+ list-style: none;
+ background-color: var(--ossie-white);
+ border: 1px solid var(--ossie-gray-200);
+ border-radius: 0.5rem;
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(-0.25rem);
+ transition: opacity 0.15s, transform 0.15s, visibility 0.15s;
+ z-index: 10;
+}
+
+.md-header__asf:hover .md-header__asf-menu,
+.md-header__asf:focus-within .md-header__asf-menu {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+}
+
+.md-header__asf-menu a {
+ display: block;
+ padding: 0.4rem 1rem;
+ color: var(--ossie-gray-700);
+ font-size: 0.75rem;
+ font-weight: 500;
+ white-space: nowrap;
+ transition: background-color 0.15s, color 0.15s;
+}
+
+.md-header__asf-menu a:hover,
+.md-header__asf-menu a:focus {
+ background-color: var(--ossie-ice-blue);
+ color: var(--ossie-primary-blue);
+}
+
+@media (max-width: 76.1875em) {
+ /* Hide the desktop nav links but keep the ASF menu pinned to the right */
+ .md-header__center {
+ justify-content: flex-end;
+ }
+
+ .md-header__nav-item:not(.md-header__nav-item--asf) {
+ display: none;
+ }
+
+ .md-nav--primary,
+ .md-nav--primary .md-nav {
+ background-color: var(--ossie-white) !important;
+ }
+
+ .md-nav--primary .md-nav__title {
+ background-color: var(--ossie-white) !important;
+ color: var(--ossie-gray-900) !important;
+ border-bottom: 1px solid var(--ossie-gray-200);
+ }
+
+ .md-nav--primary .md-nav__title[for="__drawer"] {
+ background-color: var(--ossie-white) !important;
+ color: var(--ossie-gray-900) !important;
+ }
+
+ .md-nav--primary .md-nav__title .md-nav__icon {
+ color: var(--ossie-gray-600) !important;
+ }
+
+ .md-nav--primary .md-nav__title .md-nav__button {
+ color: var(--ossie-gray-600) !important;
+ }
+
+ .md-nav--primary .md-nav__item .md-nav__link {
+ color: var(--ossie-gray-700) !important;
+ }
+
+ .md-nav--primary .md-nav__item .md-nav__link:hover,
+ .md-nav--primary .md-nav__item .md-nav__link:focus {
+ color: var(--ossie-primary-blue) !important;
+ }
+
+ .md-nav--primary .md-nav__item--active > .md-nav__link {
+ color: var(--ossie-primary-blue) !important;
+ font-weight: 600;
+ }
+
+ [data-md-toggle="drawer"] ~ .md-header .md-header__button {
+ color: var(--ossie-gray-700) !important;
+ }
+}
+
+@media (min-width: 76.25em) {
+ .md-header__hamburger {
+ display: none;
+ }
+}
+
+
+/* ==========================================================================
+ Bootstrap Button Overrides (Apache Ossie brand colors)
+ ========================================================================== */
+
+.btn-primary {
+ --bs-btn-bg: var(--ossie-primary-blue);
+ --bs-btn-border-color: var(--ossie-primary-blue);
+ --bs-btn-hover-bg: var(--ossie-dark-blue);
+ --bs-btn-hover-border-color: var(--ossie-dark-blue);
+ --bs-btn-active-bg: var(--ossie-dark-blue);
+ --bs-btn-active-border-color: var(--ossie-dark-blue);
+ font-weight: 600;
+ border-radius: 0.5rem;
+}
+
+.btn-primary:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 12px rgba(0, 147, 199, 0.3);
+}
+
+.btn-outline-secondary {
+ --bs-btn-color: var(--ossie-gray-700);
+ --bs-btn-border-color: var(--ossie-gray-300);
+ --bs-btn-hover-bg: var(--ossie-gray-50);
+ --bs-btn-hover-border-color: var(--ossie-gray-400);
+ --bs-btn-hover-color: var(--ossie-gray-900);
+ font-weight: 600;
+ border-radius: 0.5rem;
+}
+
+.btn-outline-light:hover {
+ color: var(--ossie-dark-blue);
+}
+
+.btn svg {
+ vertical-align: middle;
+ margin-right: 0.5rem;
+}
+
+
+/* ==========================================================================
+ Responsive Breakpoints (Global)
+ ========================================================================== */
+
+@media (max-width: 768px) {
+ h1, .h1 {
+ font-size: var(--ossie-font-heading-lg);
+ }
+
+ h2, .h2 {
+ font-size: var(--ossie-font-heading-md);
+ }
+}
+
+/* ── Compact updates list ────────────────────────────────────────────── */
+.ossie-update-row {
+ padding: 0.3rem 0;
+ border-bottom: 1px solid var(--ossie-gray-100);
+}
+
+.ossie-update-row:last-child {
+ border-bottom: none;
+}
+
+.ossie-update-row__header {
+ display: flex;
+ align-items: baseline;
+ gap: 0.5rem;
+}
+
+.ossie-update-row__date {
+ flex-shrink: 0;
+ font-size: 0.72rem;
+ color: var(--ossie-gray-400);
+ white-space: nowrap;
+}
+
+.ossie-update-row__sep {
+ color: var(--ossie-gray-300);
+ font-size: 0.72rem;
+}
+
+.ossie-update-row__title {
+ font-size: 0.8rem;
+ font-weight: 600;
+ line-height: 1.4;
+}
+
+.ossie-update-row__title a {
+ color: var(--ossie-primary-blue);
+ text-decoration: none;
+}
+
+.ossie-update-row__title a:hover {
+ color: var(--ossie-dark-blue);
+}
+
+.ossie-update-row__title .ossie-external-icon {
+ width: 0.6em;
+ height: 0.6em;
+ margin-left: 0.3em;
+ opacity: 0.4;
+ vertical-align: baseline;
+ position: relative;
+ top: -0.05em;
+}
+
+.ossie-update-row__summary {
+ margin: 0.1rem 0 0 0 !important;
+ font-size: 0.72rem;
+ color: var(--ossie-gray-500);
+ line-height: 1.3;
+}
+
+.md-typeset .md-post--excerpt {
+ margin-bottom: 0;
+}
+
+.md-typeset .md-post--excerpt + .md-post--excerpt {
+ margin-top: 0;
+}
+
+.md-post--excerpt .md-post__header,
+.md-post--excerpt .md-post__content,
+.md-post--excerpt .md-post__action {
+ display: none;
+}
+
+@media (max-width: 480px) {
+ .ossie-update-row__header {
+ flex-wrap: wrap;
+ }
+}
+
+
+/* ── Blog post page ────────────────────────────────────────────────── */
+.md-content--post .md-typeset {
+ font-size: 0.76rem;
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
+ line-height: 1.5;
+}
+
+.md-content--post .md-typeset h1 {
+ font-size: 1rem;
+}
+
+.md-content--post .md-typeset h2 {
+ font-size: 0.88rem;
+}
+
+.md-content--post .md-typeset h3 {
+ font-size: 0.8rem;
+}
+
+.md-content--post .md-typeset h4 {
+ font-size: 0.76rem;
+}
+
+.md-content--post .md-typeset p,
+.md-content--post .md-typeset li {
+ font-size: 0.76rem;
+ color: var(--ossie-gray-700);
+}
+
+.md-content--post .md-typeset table {
+ font-size: 0.74rem;
+}
+
+
+/* ==========================================================================
+ Site Footer — ASF Incubation Disclaimer
+ Rendered inside .md-copyright, below the copyright text and above
+ the "Made with Material for MkDocs" line.
+ ========================================================================== */
+
+/* Center all footer content */
+.md-footer-meta__inner {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+}
+
+/* 0.75em = 75% of the footer's inherited font size; applies to copyright,
+ disclaimer, and "Made with" equally */
+.md-copyright {
+ font-size: 0.75em;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ width: 100%;
+}
+
+/* Apache Incubator SVG logo — renders its own colors so no white chip needed */
+.osi-incubator-logo {
+ display: inline-block;
+ margin: 0.6em 0 0.4em;
+ line-height: 0;
+}
+
+.osi-incubator-logo img {
+ display: block;
+ width: auto;
+ height: 3em;
+}
+
+.osi-disclaimer {
+ line-height: 1.6;
+ color: var(--md-footer-fg-color--lighter, rgba(255, 255, 255, 0.45));
+ margin: 0.4em 0 0.2em;
+}
diff --git a/assets/stylesheets/home.css b/assets/stylesheets/home.css
new file mode 100644
index 0000000..1934b0c
--- /dev/null
+++ b/assets/stylesheets/home.css
@@ -0,0 +1,908 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.
+ */
+
+/*
+ * home.css — Styles for the Apache Ossie landing page (overrides/home.html).
+ *
+ * Modern, clean design with white background, subtle gradients,
+ * and blue/purple accents. Borrows patterns from tech-forward
+ * landing pages while keeping Apache Ossie's content and brand identity.
+ *
+ * Global design tokens and Bootstrap overrides live in global.css.
+ */
+
+
+/* ==========================================================================
+ Hero Section
+ ========================================================================== */
+
+.ossie-hero {
+ background: var(--ossie-white);
+ color: var(--ossie-gray-900);
+ position: relative;
+ overflow: hidden;
+ padding-top: 5rem;
+ padding-bottom: 4rem;
+}
+
+.ossie-hero::before {
+ content: "";
+ position: absolute;
+ top: -20%;
+ left: 20%;
+ width: 500px;
+ height: 500px;
+ background: radial-gradient(circle, rgba(0, 147, 199, 0.08) 0%, transparent 70%);
+ border-radius: 50%;
+ pointer-events: none;
+}
+
+.ossie-hero::after {
+ content: "";
+ position: absolute;
+ bottom: -10%;
+ right: 15%;
+ width: 400px;
+ height: 400px;
+ background: radial-gradient(circle, rgba(7, 167, 127, 0.06) 0%, transparent 70%);
+ border-radius: 50%;
+ pointer-events: none;
+}
+
+.osi-hero__logo {
+ max-width: 280px;
+ width: 100%;
+ height: auto;
+ margin-bottom: 1.5rem;
+}
+
+.osi-hero h1 {
+ font-size: clamp(1.4rem, 3vw, 2rem);
+ font-weight: 700;
+ letter-spacing: -0.03em;
+ line-height: 1.2;
+ color: var(--ossie-gray-900);
+}
+
... 34603 lines suppressed ...